static tagResult find(tagFile * const file, tagEntry * const entry, const char *const name, const int options) { tagResult result = TagFailure; file->search.name = name; file->search.nameLength = strlen(name); file->search.partial = (options & TAG_PARTIALMATCH) != 0; file->search.ignorecase = (options & TAG_IGNORECASE) != 0; fseek(file->fp, 0, SEEK_END); file->size = ftell(file->fp); rewind(file->fp); if ((file->sortMethod == TAG_SORTED && !file->search.ignorecase) || (file->sortMethod == TAG_FOLDSORTED && file->search.ignorecase)) result = findBinary(file); else result = findSequential(file); if (result != TagSuccess) file->search.pos = file->size; else { file->search.pos = file->pos; if (entry != NULL) parseTagLine(file, entry); } return result; }
static void readPseudoTags (tagFile *const file, tagFileInfo *const info) { fpos_t startOfLine; const size_t prefixLength = strlen (PseudoTagPrefix); if (info != NULL) { info->file.format = 1; info->file.sort = TAG_UNSORTED; info->program.author = NULL; info->program.name = NULL; info->program.url = NULL; info->program.version = NULL; } for( ;; ) { fgetpos (file->fp, &startOfLine); if (! readTagLine (file)) break; if (strncmp (file->line.buffer, PseudoTagPrefix, prefixLength) != 0) break; else { tagEntry entry; const char *key, *value; parseTagLine (file, &entry); key = entry.name + prefixLength; value = entry.file; if (strcmp (key, "TAG_FILE_SORTED") == 0) file->sortMethod = (sortType) atoi (value); else if (strcmp (key, "TAG_FILE_FORMAT") == 0) file->format = static_cast<short>(atoi (value)); else if (strcmp (key, "TAG_PROGRAM_AUTHOR") == 0) file->program.author = duplicate (value); else if (strcmp (key, "TAG_PROGRAM_NAME") == 0) file->program.name = duplicate (value); else if (strcmp (key, "TAG_PROGRAM_URL") == 0) file->program.url = duplicate (value); else if (strcmp (key, "TAG_PROGRAM_VERSION") == 0) file->program.version = duplicate (value); if (info != NULL) { info->file.format = file->format; info->file.sort = file->sortMethod; info->program.author = file->program.author; info->program.name = file->program.name; info->program.url = file->program.url; info->program.version = file->program.version; } } } fsetpos (file->fp, &startOfLine); }
static tagResult readNext (tagFile *const file, tagEntry *const entry) { tagResult result = TagFailure; if (file == NULL || ! file->initialized) result = TagFailure; else if (! readTagLine (file)) result = TagFailure; else { if (entry != NULL) parseTagLine (file, entry); result = TagSuccess; } return result; }
static tagResult findNext (tagFile *const file, tagEntry *const entry) { tagResult result = TagFailure; if ((file->sortMethod == TAG_SORTED && !file->search.ignorecase) || (file->sortMethod == TAG_FOLDSORTED && file->search.ignorecase)) { result = tagsNext (file, entry); if (result == TagSuccess && nameComparison (file) != 0) result = TagFailure; } else { result = findSequential (file); if (result == TagSuccess && entry != NULL) parseTagLine (file, entry); } return result; }
static tagResult find (tagFile *const file, tagEntry *const entry, const char *const name, const int options) { tagResult result; if (file->search.name != NULL) free (file->search.name); file->search.name = duplicate (name); file->search.nameLength = strlen (name); file->search.partial = (options & TAG_PARTIALMATCH) != 0; file->search.ignorecase = (options & TAG_IGNORECASE) != 0; fseek (file->fp, 0, SEEK_END); file->size = ftell (file->fp); rewind (file->fp); if ((file->sortMethod == TAG_SORTED && !file->search.ignorecase) || (file->sortMethod == TAG_FOLDSORTED && file->search.ignorecase)) { #ifdef DEBUG printf ("<performing binary search>\n"); #endif result = findBinary (file); } else { #ifdef DEBUG printf ("<performing sequential search>\n"); #endif result = findSequential (file); } if (result != TagSuccess) file->search.pos = file->size; else { file->search.pos = file->pos; if (entry != NULL) parseTagLine (file, entry); } return result; }