alignment_t * parse_alignment(char *line, dict2pid_t *d2p) { alignment_t *al; char **wptr; int nf, i; double spos; int32 frate = 100; /* FIXME */ nf = str2words(line, NULL, 0); if (nf < 0) return NULL; wptr = ckd_calloc(nf, sizeof(*wptr)); nf = str2words(line, wptr, nf); if (nf < 0) { ckd_free(wptr); return NULL; } al = alignment_init(d2p); spos = 0.0; for (i = 0; i < nf; ++i) { char *c = strchr(wptr[i], ':'); double epos; int duration; if (c == NULL) /* word ID */ break; *c++ = '\0'; epos = atof(c); duration = (int) ((epos - spos) * frate); alignment_add_word(al, dict_wordid(d2p->dict, wptr[i]), duration); spos = epos; } return al; }
/* align_init * * * allocate a new DP matrix data structure * */ aligndatap align_init(int maxstr, int match, int mismatch, int gapopen, int gapextend) { aligndatap data; int i; data = (aligndatap) malloc(sizeof(struct aligndata)); if (data == NULL) { #ifdef VERBOSE fprintf(stderr,"align_init: failed to allocate struct aligndata\n"); #endif return NULL; } data->maxstr = maxstr; data->match = match; data->mismatch = mismatch; data->gapopen = gapopen; data->gapextend = gapextend; data->matrix = calloc(maxstr+1,sizeof(int *)); data->gap1 = calloc(maxstr+1,sizeof(int *)); data->gap2 = calloc(maxstr+1,sizeof(int *)); if (data->matrix == NULL || data->gap1 == NULL || data->gap2 == NULL) { #ifdef VERBOSE fprintf(stderr,"align_init: failed to allocate matrices\n"); #endif return NULL; } for (i=0;i<=maxstr;i++) { data->matrix[i] = calloc(maxstr+1,sizeof(int)); data->gap1[i] = calloc(maxstr+1,sizeof(int)); data->gap2[i] = calloc(maxstr+1,sizeof(int)); if (data->matrix[i] == NULL || data->gap1[i] == NULL || data->gap2[i] == NULL) { #ifdef VERBOSE fprintf(stderr,"align_init: failed to allocate sub-matrices (%d)\n",i); #endif return NULL; } } data->alignment = alignment_init(); if (data->alignment == NULL) { return NULL; } return data; }