char *lmCloneSomeWord(struct lm *lm, char *line, int wordIx) /* Return a clone of the given space-delimited word within line. Returns NULL if * not that many words in line. */ { if (wordIx < 0) return NULL; int i; for (i=0; i<wordIx; ++i) { line = skipLeadingSpaces(line); line = skipToSpaces(line); if (line == NULL) return NULL; } return lmCloneFirstWord(lm, line); }
struct raRecord *raRecordReadOne(struct lineFile *lf, char *key, struct lm *lm) /* Read next record from file. Returns NULL at end of file. */ { struct raField *field, *fieldList = NULL; char *line; char *keyVal = NULL; boolean override = FALSE; struct slPair *settingsByView = NULL; struct hash *subGroups = NULL; char *view = NULL; struct hash *viewHash = NULL; /* Skip over blank initial lines. */ for (;;) { if (!lineFileNext(lf, &line, NULL)) return NULL; line = skipLeadingSpaces(line); if (line != NULL && (line[0] != 0 && line[0] != '#')) { lineFileReuse(lf); break; } } /* Keep going until get a blank line. */ for (;;) { if (!lineFileNext(lf, &line, NULL)) break; line = skipLeadingSpaces(line); if (line[0] == '#') continue; field = raFieldFromLine(line, lm); if (field == NULL) break; if (sameString(field->name, key)) { keyVal = lmCloneFirstWord(lm, field->val); if (endsWith(field->val, "override") && !sameString("override", field->val)) override = TRUE; } else if (sameString(field->name, "settingsByView"))
static struct raRecord *readRecordsFromFile(struct raFile *file, struct dyString *dy, struct lm *lm) /* Read all the records in a file and return as a list. The dy parameter returns the * last bits of the file (after the last record). */ { char *fileName = file->name; struct raRecord *r, *rList = NULL; struct lineFile *lf = lineFileOpen(fileName, TRUE); while (raSkipLeadingEmptyLines(lf, dy)) { /* Create a tag structure in local memory. */ lmAllocVar(lm, r); r->startLineIx = lf->lineIx; char *name, *val; while (raNextTagVal(lf, &name, &val, dy)) { struct raTag *tag; lmAllocVar(lm, tag); tag->name = lmCloneString(lm, name); tag->val = lmCloneString(lm, val); tag->text = lmCloneString(lm, dy->string); if (sameString(name, glKeyField)) r->key = lmCloneFirstWord(lm, tag->val); slAddHead(&r->tagList, tag); dyStringClear(dy); } if (dy->stringSize > 0) { r->endComments = lmCloneString(lm, dy->string); } slReverse(&r->tagList); r->endLineIx = lf->lineIx; r->file = file; slAddHead(&rList, r); } lineFileClose(&lf); slReverse(&rList); return rList; }