ref: 51a1a378632b453d050c9be3afcf75fd2baa198c
dir: /src/utils/cst_features.c/
/*************************************************************************/ /* */ /* Language Technologies Institute */ /* Carnegie Mellon University */ /* Copyright (c) 1999 */ /* All Rights Reserved. */ /* */ /* Permission is hereby granted, free of charge, to use and distribute */ /* this software and its documentation without restriction, including */ /* without limitation the rights to use, copy, modify, merge, publish, */ /* distribute, sublicense, and/or sell copies of this work, and to */ /* permit persons to whom this work is furnished to do so, subject to */ /* the following conditions: */ /* 1. The code must retain the above copyright notice, this list of */ /* conditions and the following disclaimer. */ /* 2. Any modifications must be clearly marked as such. */ /* 3. Original authors' names are not deleted. */ /* 4. The authors' names are not used to endorse or promote products */ /* derived from this software without specific prior written */ /* permission. */ /* */ /* CARNEGIE MELLON UNIVERSITY AND THE CONTRIBUTORS TO THIS WORK */ /* DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING */ /* ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT */ /* SHALL CARNEGIE MELLON UNIVERSITY NOR THE CONTRIBUTORS BE LIABLE */ /* FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES */ /* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN */ /* AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, */ /* ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF */ /* THIS SOFTWARE. */ /* */ /*************************************************************************/ /* Author: Alan W Black (awb@cs.cmu.edu) */ /* Date: December 1999 */ /*************************************************************************/ /* */ /* Feature support */ /* */ /*************************************************************************/ #include "cst_error.h" #include "cst_features.h" CST_VAL_REGISTER_TYPE(features,cst_features) static cst_featvalpair *feat_find_featpair(const cst_features *f, const char *name) { cst_featvalpair *n; if (f == NULL) return NULL; else { for (n=f->head; n; n=n->next) if (cst_streq(name,n->name)) return n; return NULL; } } cst_features *new_features(void) { cst_features *f; f = cst_alloc(cst_features,1); f->head = NULL; f->ctx = NULL; return f; } cst_features *new_features_local(cst_alloc_context ctx) { cst_features *f; f = (cst_features *)cst_local_alloc(ctx, sizeof(*f)); f->head = NULL; f->ctx = ctx; return f; } void delete_features(cst_features *f) { cst_featvalpair *n, *np; if (f) { for (n=f->head; n; n=np) { np = n->next; delete_val(n->val); cst_local_free(f->ctx,n); } delete_val(f->owned_strings); cst_local_free(f->ctx,f); } } int feat_present(const cst_features *f, const char *name) { if (feat_find_featpair(f,name) != NULL) return 1; else if (f && f->linked) return feat_present(f->linked,name); else return 0; } int feat_length(const cst_features *f) { int i=0; cst_featvalpair *p; if (f) for (i=0,p=f->head; p; p=p->next) i++; return i; } int feat_remove(cst_features *f, const char *name) { cst_featvalpair *n,*p,*np; if (f == NULL) return FALSE; /* didn't remove it */ else { for (p=NULL,n=f->head; n; p=n,n=np) { np = n->next; if (cst_streq(name,n->name)) { if (p == 0) f->head = np; else p->next = np; delete_val(n->val); cst_local_free(f->ctx,n); return TRUE; } } return FALSE; } } int feat_int(const cst_features *f, const char *name) { return val_int(feat_val(f,name)); } float feat_float(const cst_features *f, const char *name) { return val_float(feat_val(f,name)); } const char *feat_string(const cst_features *f, const char *name) { return val_string(feat_val(f,name)); } const cst_val *feat_val(const cst_features *f, const char *name) { cst_featvalpair *n; n = feat_find_featpair(f,name); if (n == NULL) { if (f && f->linked) { /* Search the linked features too if there are any */ /* We assume the linked features haven't been deleted, and */ return feat_val(f->linked,name); } else return NULL; /* its really not there at all */ } else return n->val; } int get_param_int(const cst_features *f, const char *name,int def) { const cst_val *v; v = feat_val(f,name); if (v != NULL) return val_int(v); else return def; } float get_param_float(const cst_features *f, const char *name, float def) { const cst_val *v; v = feat_val(f,name); if (v != NULL) return val_float(v); else return def; } const char *get_param_string(const cst_features *f, const char *name, const char *def) { const cst_val *v; v = feat_val(f,name); if (v != NULL) return val_string(v); else return def; } const cst_val *get_param_val(const cst_features *f, const char *name, cst_val *def) { const cst_val *v; v = feat_val(f,name); if (v != NULL) return v; else return def; } void feat_set_int(cst_features *f, const char *name, int v) { feat_set(f,name,int_val(v)); } void feat_set_float(cst_features *f, const char *name, float v) { feat_set(f,name,float_val(v)); } void feat_set_string(cst_features *f, const char *name, const char *v) { feat_set(f,name,string_val(v)); } void feat_set(cst_features *f, const char* name, const cst_val *val) { cst_featvalpair *n; n = feat_find_featpair(f,name); if (val == NULL) { cst_errmsg("cst_features: trying to set a NULL val for feature \"%s\"\n", name); } else if (n == NULL) { /* first reference to this feature so create new fpair */ cst_featvalpair *p; p = (cst_featvalpair *)cst_local_alloc(f->ctx, sizeof(*p)); p->next = f->head; p->name = name; p->val = val_inc_refcount(val); f->head = p; } else { delete_val(n->val); n->val = val_inc_refcount(val); } } int feat_copy_into(const cst_features *from,cst_features *to) { /* Copy all features in from into to */ cst_featvalpair *p; int i; for (i=0,p=from->head; p; p=p->next,i++) feat_set(to,p->name,p->val); return i; } int feat_link_into(const cst_features *from,cst_features *to) { /* Thus allows more global features to be linked, without a copy */ /* This is used to make things thread safe(r) */ to->linked = from; return 1; } const char *feat_own_string(cst_features *f,const char *n) { f->owned_strings = cons_val(string_val(n),f->owned_strings); return val_string(val_car(f->owned_strings)); } int cst_feat_print(cst_file fd,const cst_features *f) { cst_featvalpair *p; for (p=f->head; p; p=p->next) { cst_fprintf(fd, "%s ",p->name); val_print(fd,p->val); cst_fprintf(fd,"\n"); } return 0; }