⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 strlist.c

📁 Exuberant Ctags is a multilanguage reimplementation of the much-underused ctags(1) program and is i
💻 C
字号:
/**   $Id: strlist.c,v 1.8 2006/05/30 04:37:13 darren Exp $**   Copyright (c) 1999-2002, Darren Hiebert**   This source code is released for free distribution under the terms of the*   GNU General Public License.**   This module contains functions managing resizable string lists.*//**   INCLUDE FILES*/#include "general.h"  /* must always come first */#include <string.h>#ifdef HAVE_FNMATCH_H# include <fnmatch.h>#endif#include "debug.h"#include "read.h"#include "routines.h"#include "strlist.h"/**   FUNCTION DEFINITIONS*/extern stringList *stringListNew (void){	stringList* const result = xMalloc (1, stringList);	result->max   = 0;	result->count = 0;	result->list  = NULL;	return result;}extern void stringListAdd (stringList *const current, vString *string){	enum { incrementalIncrease = 10 };	Assert (current != NULL);	if (current->list == NULL)	{		Assert (current->max == 0);		current->count = 0;		current->max   = incrementalIncrease;		current->list  = xMalloc (current->max, vString*);	}	else if (current->count == current->max)	{		current->max += incrementalIncrease;		current->list = xRealloc (current->list, current->max, vString*);	}	current->list [current->count++] = string;}extern void stringListRemoveLast (stringList *const current){	Assert (current != NULL);	Assert (current->count > 0);	--current->count;	current->list [current->count] = NULL;}/* Combine list `from' into `current', deleting `from' */extern void stringListCombine (		stringList *const current, stringList *const from){	unsigned int i;	Assert (current != NULL);	Assert (from != NULL);	for (i = 0  ;  i < from->count  ;  ++i)	{		stringListAdd (current, from->list [i]);		from->list [i] = NULL;	}	stringListDelete (from);}extern stringList* stringListNewFromArgv (const char* const* const argv){	stringList* const result = stringListNew ();	const char *const *p;	Assert (argv != NULL);	for (p = argv  ;  *p != NULL  ;  ++p)		stringListAdd (result, vStringNewInit (*p));	return result;}extern stringList* stringListNewFromFile (const char* const fileName){	stringList* result = NULL;	FILE* const fp = fopen (fileName, "r");	if (fp != NULL)	{		result = stringListNew ();		while (! feof (fp))		{			vString* const str = vStringNew ();			readLine (str, fp);			vStringStripTrailing (str);			if (vStringLength (str) > 0)				stringListAdd (result, str);			else				vStringDelete (str);		}	}	return result;}extern unsigned int stringListCount (const stringList *const current){	Assert (current != NULL);	return current->count;}extern vString* stringListItem (		const stringList *const current, const unsigned int indx){	Assert (current != NULL);	return current->list [indx];}extern vString* stringListLast (const stringList *const current){	Assert (current != NULL);	Assert (current->count > 0);	return current->list [current->count - 1];}extern void stringListClear (stringList *const current){	unsigned int i;	Assert (current != NULL);	for (i = 0  ;  i < current->count  ;  ++i)	{		vStringDelete (current->list [i]);		current->list [i] = NULL;	}	current->count = 0;}extern void stringListDelete (stringList *const current){	if (current != NULL)	{		if (current->list != NULL)		{			stringListClear (current);			eFree (current->list);			current->list = NULL;		}		current->max   = 0;		current->count = 0;		eFree (current);	}}static boolean compareString (		const char *const string, vString *const itm){	return (boolean) (strcmp (string, vStringValue (itm)) == 0);}static boolean compareStringInsensitive (		const char *const string, vString *const itm){	return (boolean) (strcasecmp (string, vStringValue (itm)) == 0);}static int stringListIndex (		const stringList *const current,		const char *const string,		boolean (*test)(const char *s, vString *const vs)){	int result = -1;	unsigned int i;	Assert (current != NULL);	Assert (string != NULL);	Assert (test != NULL);	for (i = 0  ;  result == -1  &&  i < current->count  ;  ++i)		if ((*test)(string, current->list [i]))			result = i;	return result;}extern boolean stringListHas (		const stringList *const current, const char *const string){	boolean result = FALSE;	Assert (current != NULL);	result = stringListIndex (current, string, compareString) != -1;	return result;}extern boolean stringListHasInsensitive (		const stringList *const current, const char *const string){	boolean result = FALSE;	Assert (current != NULL);	Assert (string != NULL);	result = stringListIndex (current, string, compareStringInsensitive) != -1;	return result;}extern boolean stringListHasTest (		const stringList *const current, boolean (*test)(const char *s)){	boolean result = FALSE;	unsigned int i;	Assert (current != NULL);	for (i = 0  ;  ! result  &&  i < current->count  ;  ++i)		result = (*test)(vStringValue (current->list [i]));	return result;}extern boolean stringListRemoveExtension (		stringList* const current, const char* const extension){	boolean result = FALSE;	int where;#ifdef CASE_INSENSITIVE_FILENAMES	where = stringListIndex (current, extension, compareStringInsensitive);#else	where = stringListIndex (current, extension, compareString);#endif	if (where != -1)	{		memmove (current->list + where, current->list + where + 1,				(current->count - where) * sizeof (*current->list));		current->list [current->count - 1] = NULL;		--current->count;		result = TRUE;	}	return result;}extern boolean stringListExtensionMatched (		const stringList* const current, const char* const extension){#ifdef CASE_INSENSITIVE_FILENAMES	return stringListHasInsensitive (current, extension);#else	return stringListHas (current, extension);#endif}static boolean fileNameMatched (		const vString* const vpattern, const char* const fileName){	const char* const pattern = vStringValue (vpattern);#if defined (HAVE_FNMATCH)	return (boolean) (fnmatch (pattern, fileName, 0) == 0);#elif defined (CASE_INSENSITIVE_FILENAMES)	return (boolean) (strcasecmp (pattern, fileName) == 0);#else	return (boolean) (strcmp (pattern, fileName) == 0);#endif}extern boolean stringListFileMatched (		const stringList* const current, const char* const fileName){	boolean result = FALSE;	unsigned int i;	for (i = 0  ;  ! result  &&  i < stringListCount (current)  ;  ++i)		result = fileNameMatched (stringListItem (current, i), fileName);	return result;}extern void stringListPrint (const stringList *const current){	unsigned int i;	Assert (current != NULL);	for (i = 0  ;  i < current->count  ;  ++i)		printf ("%s%s", (i > 0) ? ", " : "", vStringValue (current->list [i]));}/* vi:set tabstop=4 shiftwidth=4: */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -