|
|
1.1 ! root 1: /* str_list.h */ ! 2: ! 3: /* Functions to deal with NULL-terminated string lists */ ! 4: ! 5: /* $Id: str_list.h,v 1.20 2005/10/12 22:46:36 rswindell Exp $ */ ! 6: ! 7: /**************************************************************************** ! 8: * @format.tab-size 4 (Plain Text/Source Code File Header) * ! 9: * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * ! 10: * * ! 11: * Copyright 2005 Rob Swindell - http://www.synchro.net/copyright.html * ! 12: * * ! 13: * This library is free software; you can redistribute it and/or * ! 14: * modify it under the terms of the GNU Lesser General Public License * ! 15: * as published by the Free Software Foundation; either version 2 * ! 16: * of the License, or (at your option) any later version. * ! 17: * See the GNU Lesser General Public License for more details: lgpl.txt or * ! 18: * http://www.fsf.org/copyleft/lesser.html * ! 19: * * ! 20: * Anonymous FTP access to the most recent released source is available at * ! 21: * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * ! 22: * * ! 23: * Anonymous CVS access to the development source and modification history * ! 24: * is available at cvs.synchro.net:/cvsroot/sbbs, example: * ! 25: * cvs -d :pserver:[email protected]:/cvsroot/sbbs login * ! 26: * (just hit return, no password is necessary) * ! 27: * cvs -d :pserver:[email protected]:/cvsroot/sbbs checkout src * ! 28: * * ! 29: * For Synchronet coding style and modification guidelines, see * ! 30: * http://www.synchro.net/source.html * ! 31: * * ! 32: * You are encouraged to submit any modifications (preferably in Unix diff * ! 33: * format) via e-mail to [email protected] * ! 34: * * ! 35: * Note: If this box doesn't appear square, then you need to fix your tabs. * ! 36: ****************************************************************************/ ! 37: ! 38: #ifndef _STR_LIST_H ! 39: #define _STR_LIST_H ! 40: ! 41: #include <stdio.h> /* FILE */ ! 42: #include <stddef.h> /* size_t */ ! 43: #include "gen_defs.h" ! 44: ! 45: #if defined(__cplusplus) ! 46: extern "C" { ! 47: #endif ! 48: ! 49: #define STR_LIST_LAST_INDEX (~0) ! 50: ! 51: typedef char** str_list_t; ! 52: ! 53: /* Returns an allocated and terminated string list */ ! 54: str_list_t strListInit(void); ! 55: ! 56: /* Frees the strings in the list (and the list itself) */ ! 57: void strListFree(str_list_t*); ! 58: ! 59: /* Frees the strings in the list */ ! 60: void strListFreeStrings(str_list_t); ! 61: ! 62: /* Pass a pointer to a string list, the string to add (append) */ ! 63: /* Returns the updated list or NULL on error */ ! 64: char* strListAppend(str_list_t*, const char* str, size_t index); ! 65: ! 66: /* Append a string list onto another string list */ ! 67: size_t strListAppendList(str_list_t*, const str_list_t append_list); ! 68: ! 69: /* Inserts a string into the list at a specific index */ ! 70: char* strListInsert(str_list_t*, const char* str, size_t index); ! 71: ! 72: /* Insert a string list into another string list */ ! 73: size_t strListInsertList(str_list_t*, const str_list_t append_list, size_t index); ! 74: ! 75: /* Remove a string at a specific index */ ! 76: char* strListRemove(str_list_t*, size_t index); ! 77: ! 78: /* Remove and free a string at a specific index */ ! 79: BOOL strListDelete(str_list_t*, size_t index); ! 80: ! 81: /* Replace a string at a specific index */ ! 82: char* strListReplace(const str_list_t, size_t index, const char* str); ! 83: ! 84: /* Swap the strings at index1 and index2 */ ! 85: BOOL strListSwap(const str_list_t, size_t index1, size_t index2); ! 86: ! 87: /* Convenience macros for pushing, popping strings (LIFO stack) */ ! 88: #define strListPush(list, str) strListAppend(list, str, STR_LIST_LAST_INDEX) ! 89: #define strListPop(list) strListRemove(list, STR_LIST_LAST_INDEX) ! 90: ! 91: /* Add to an exiting or new string list by splitting specified string (str) */ ! 92: /* into multiple strings, separated by one of the delimit characters */ ! 93: str_list_t strListSplit(str_list_t*, char* str, const char* delimit); ! 94: ! 95: /* Same as above, but copies str to temporary heap buffer first */ ! 96: str_list_t strListSplitCopy(str_list_t*, const char* str, const char* delimit); ! 97: ! 98: /* Merge 2 string lists (no copying of string data) */ ! 99: size_t strListMerge(str_list_t*, str_list_t append_list); ! 100: ! 101: /* Count the number of strings in the list and returns the count */ ! 102: size_t strListCount(const str_list_t); ! 103: ! 104: /* Sort the strings in the string list */ ! 105: void strListSortAlpha(str_list_t); ! 106: void strListSortAlphaReverse(str_list_t); ! 107: ! 108: /* Case-sensitive sorting */ ! 109: void strListSortAlphaCase(str_list_t); ! 110: void strListSortAlphaCaseReverse(str_list_t); ! 111: ! 112: /* Create/Copy/Append/Free NULL-terminated string block */ ! 113: /* (e.g. for environment variable blocks) */ ! 114: char* strListCreateBlock(str_list_t); ! 115: char* strListCopyBlock(char* block); ! 116: char* strListAppendBlock(char* block, str_list_t); ! 117: size_t strListBlockLength(char* block); ! 118: void strListFreeBlock(char*); ! 119: ! 120: /************/ ! 121: /* File I/O */ ! 122: /************/ ! 123: ! 124: /* Read lines from file appending each line to string list */ ! 125: /* Pass NULL list to have list allocated for you */ ! 126: str_list_t strListReadFile(FILE*, str_list_t*, size_t max_line_len); ! 127: size_t strListInsertFile(FILE*, str_list_t*, size_t index, size_t max_line_len); ! 128: ! 129: /* Write to file (fp) each string in the list, optionally separated by separator (e.g. "\n") */ ! 130: size_t strListWriteFile(FILE*, const str_list_t, const char* separator); ! 131: ! 132: #if defined(__cplusplus) ! 133: } ! 134: #endif ! 135: ! 136: #endif /* Don't add anything after this line */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.