1 /* 2 * $LynxId: HTString.h,v 1.37 2012/02/07 23:41:25 tom Exp $ 3 * String handling for libwww 4 * STRINGS 5 * 6 * Case-independent string comparison and allocations with copies etc 7 */ 8 #ifndef HTSTRING_H 9 #define HTSTRING_H 10 11 #ifndef HTUTILS_H 12 #include <HTUtils.h> 13 #endif /* HTUTILS_H */ 14 15 #ifdef __cplusplus 16 extern "C" { 17 #endif 18 extern const char *HTLibraryVersion; /* String for help screen etc */ 19 20 /* 21 * EBCDIC string comparison using ASCII collating sequence 22 */ 23 #ifdef NOT_ASCII 24 extern int AS_casecomp(const char *a, const char *b); 25 extern int AS_ncmp(const char *a, const char *b, unsigned int n); 26 27 #define AS_cmp( a, b ) ( AS_ncmp( ( a ), ( b ), -1 ) ) 28 29 #else 30 #define AS_casecomp( a, b ) ( strcasecomp( ( a ), ( b ) ) ) 31 #define AS_ncmp( a, b, c ) ( StrNCmp( ( a ), ( b ), ( c ) ) ) 32 #define AS_cmp strcmp 33 34 #endif /* NOT_ASCII */ 35 36 #define StrNCat(a,b,c) strncat((a),(b),(size_t)(c)) 37 #define StrNCpy(a,b,c) strncpy((a),(b),(size_t)(c)) 38 #define StrNCmp(a,b,c) strncmp((a),(b),(size_t)(c)) 39 40 #define MemCpy(a,b,c) memcpy((a),(b),(size_t)(c)) 41 #define MemCmp(a,b,c) memcmp((a),(b),(size_t)(c)) 42 43 /* 44 * Case-insensitive string comparison 45 * 46 * The usual routines (comp instead of cmp) had some problem. 47 */ 48 extern int strcasecomp(const char *a, const char *b); 49 extern int strncasecomp(const char *a, const char *b, int n); 50 51 extern int strcasecomp8(const char *a, const char *b); 52 extern int strncasecomp8(const char *a, const char *b, int n); 53 54 extern int strcasecomp_asterisk(const char *a, const char *b); 55 56 /* 57 * strcasecomp8 and strncasecomp8 are variants of strcasecomp and 58 * strncasecomp, but use 8bit upper/lower case information from the 59 * current display charset 60 */ 61 62 /* 63 * Malloced string manipulation 64 */ 65 #define StrAllocCopy(dest, src) HTSACopy (&(dest), src) 66 #define StrAllocCat(dest, src) HTSACat (&(dest), src) 67 extern char *HTSACopy(char **dest, const char *src); 68 extern char *HTSACat(char **dest, const char *src); 69 70 /* 71 * optimized for heavily realloc'd strings in temp objects 72 */ 73 #define StrAllocCopy_extra(dest, src) HTSACopy_extra (&(dest), src) 74 #define FREE_extra(x) {if (x != NULL) {HTSAFree_extra(x); x = NULL;}} 75 #define Clear_extra(x) {if (x != NULL) {*x = '\0';}} 76 extern char *HTSACopy_extra(char **dest, const char *src); 77 extern void HTSAFree_extra(char *s); 78 79 /* 80 * Next word or quoted string 81 */ 82 extern char *HTNextField(char **pstr); 83 84 /* A more general parser - kw */ 85 extern char *HTNextTok(char **pstr, 86 const char *delims, const char *bracks, char *found); 87 88 extern char *HTSprintf(char **pstr, const char *fmt,...) GCC_PRINTFLIKE(2,3); 89 extern char *HTSprintf0(char **pstr, const char *fmt,...) GCC_PRINTFLIKE(2,3); 90 91 #if defined(LY_FIND_LEAKS) /* private otherwise */ 92 extern char *StrAllocVsprintf(char **pstr, 93 size_t len, 94 const char *fmt, 95 va_list * ap); 96 #endif 97 98 #if defined(__CYGWIN__) 99 #define USE_QUOTED_PARAMETER 2 /* single and double-quoting */ 100 #elif defined(DOSPATH) 101 #define USE_QUOTED_PARAMETER 1 /* double-quoting only */ 102 #elif (defined(VMS) || defined(__EMX__)) 103 #define USE_QUOTED_PARAMETER 0 /* no quoting */ 104 #else 105 #define USE_QUOTED_PARAMETER 2 /* single and double-quoting */ 106 #endif 107 108 #if USE_QUOTED_PARAMETER 109 extern char *HTQuoteParameter(const char *parameter); 110 extern void HTAddXpand(char **result, const char *command, int number, const char *parameter); 111 112 #else 113 #define HTQuoteParameter(parameter) parameter /* simplify ifdef'ing */ 114 #define HTAddXpand(result,command,number,parameter) HTAddParam(result,command,number,parameter) 115 #endif 116 117 extern int HTCountCommandArgs(const char *command); 118 extern void HTAddToCmd(char **result, const char *command, int number, const char *string); 119 extern void HTAddParam(char **result, const char *command, int number, const char *parameter); 120 extern void HTEndParam(char **result, const char *command, int number); 121 122 /* Force an option, with leading blanks, to be appended without quoting them */ 123 #define HTOptParam(result, command, number, parameter) HTSACat(result, parameter) 124 125 /* Binary copy and concat */ 126 typedef struct { 127 char *str; 128 int len; 129 } bstring; 130 131 extern void HTSABAlloc(bstring **dest, int len); 132 extern void HTSABCopy(bstring **dest, const char *src, int len); 133 extern void HTSABCopy0(bstring **dest, const char *src); 134 extern void HTSABCat(bstring **dest, const char *src, int len); 135 extern void HTSABCat0(bstring **dest, const char *src); 136 extern BOOL HTSABEql(bstring *a, bstring *b); 137 extern void HTSABFree(bstring **ptr); 138 139 #define BStrLen(s) (((s) != 0) ? (s)->len : 0) 140 #define BStrData(s) (((s) != 0) ? (s)->str : 0) 141 142 #define BINEQ(a,b) (HTSABEql(a,b)) /* like STREQ() */ 143 144 #define isBEmpty(p) ((p) == 0 || BStrLen(p) == 0) 145 146 #define BStrAlloc(d,n) HTSABAlloc( &(d), n) 147 #define BStrCopy(d,s) HTSABCopy( &(d), BStrData(s), BStrLen(s)) 148 #define BStrCopy0(d,s) HTSABCopy0( &(d), s) 149 #define BStrCopy1(d,s,n) HTSABCopy( &(d), s, n) 150 #define BStrCat(d,s) HTSABCat( &(d), BStrData(s), BStrLen(s)) 151 #define BStrCat0(d,s) HTSABCat0( &(d), s) 152 #define BStrFree(d) HTSABFree( &(d)) 153 154 extern bstring *HTBprintf(bstring **pstr, const char *fmt,...) GCC_PRINTFLIKE(2,3); 155 156 extern void trace_bstring(bstring *data); 157 extern void trace_bstring2(const char *text, int size); 158 159 #ifdef __cplusplus 160 } 161 #endif 162 #endif /* HTSTRING_H */ 163