1 /* 2 * $LynxId: HTString.h,v 1.41 2021/06/09 19:30:55 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 * Workaround for glibc header defect combined with -Wlogical-op warnings 45 */ 46 #define StrChr (strchr) 47 48 /* 49 * Case-insensitive string comparison 50 * 51 * The usual routines (comp instead of cmp) had some problem. 52 */ 53 extern int strcasecomp(const char *a, const char *b); 54 extern int strncasecomp(const char *a, const char *b, int n); 55 56 extern int strcasecomp8(const char *a, const char *b); 57 extern int strncasecomp8(const char *a, const char *b, int n); 58 59 extern int strcasecomp_asterisk(const char *a, const char *b); 60 61 /* 62 * strcasecomp8 and strncasecomp8 are variants of strcasecomp and 63 * strncasecomp, but use 8bit upper/lower case information from the 64 * current display charset 65 */ 66 67 /* 68 * Malloced string manipulation 69 */ 70 #define StrAllocCopy(dest, src) HTSACopy (&(dest), src) 71 #define StrAllocCat(dest, src) HTSACat (&(dest), src) 72 extern char *HTSACopy(char **dest, const char *src); 73 extern char *HTSACat(char **dest, const char *src); 74 75 /* 76 * optimized for heavily realloc'd strings in temp objects 77 */ 78 #define StrAllocCopy_extra(dest, src) HTSACopy_extra (&(dest), src) 79 #define FREE_extra(x) {if (x != NULL) {HTSAFree_extra(x); x = NULL;}} 80 #define Clear_extra(x) {if (x != NULL) {*x = '\0';}} 81 extern char *HTSACopy_extra(char **dest, const char *src); 82 extern void HTSAFree_extra(char *s); 83 84 /* 85 * Next word or quoted string 86 */ 87 extern char *HTNextField(char **pstr); 88 89 /* A more general parser - kw */ 90 extern char *HTNextTok(char **pstr, 91 const char *delims, const char *bracks, char *found); 92 93 extern char *HTSprintf(char **pstr, const char *fmt, ...) GCC_PRINTFLIKE(2,3); 94 extern char *HTSprintf0(char **pstr, const char *fmt, ...) GCC_PRINTFLIKE(2,3); 95 96 #if defined(LY_FIND_LEAKS) /* private otherwise */ 97 extern char *StrAllocVsprintf(char **pstr, 98 size_t len, 99 const char *fmt, 100 va_list *ap); 101 #endif 102 103 #if defined(__CYGWIN__) 104 #define USE_QUOTED_PARAMETER 2 /* single and double-quoting */ 105 #elif defined(DOSPATH) 106 #define USE_QUOTED_PARAMETER 1 /* double-quoting only */ 107 #elif (defined(VMS) || defined(__EMX__)) 108 #define USE_QUOTED_PARAMETER 0 /* no quoting */ 109 #else 110 #define USE_QUOTED_PARAMETER 2 /* single and double-quoting */ 111 #endif 112 113 #if USE_QUOTED_PARAMETER 114 extern char *HTQuoteParameter(const char *parameter); 115 extern void HTAddXpand(char **result, const char *command, int number, const char *parameter); 116 117 #else 118 #define HTQuoteParameter(parameter) parameter /* simplify ifdef'ing */ 119 #define HTAddXpand(result,command,number,parameter) HTAddParam(result,command,number,parameter) 120 #endif 121 122 extern int HTCountCommandArgs(const char *command); 123 extern void HTAddToCmd(char **result, const char *command, int number, const char *string); 124 extern void HTAddParam(char **result, const char *command, int number, const char *parameter); 125 extern void HTEndParam(char **result, const char *command, int number); 126 127 /* Force an option, with leading blanks, to be appended without quoting them */ 128 #define HTOptParam(result, command, number, parameter) HTSACat(result, parameter) 129 130 /* Binary copy and concat */ 131 typedef struct { 132 char *str; 133 int len; 134 } bstring; 135 136 extern void HTSABAlloc(bstring **dest, int len); 137 extern void HTSABCopy(bstring **dest, const char *src, int len); 138 extern void HTSABCopy0(bstring **dest, const char *src); 139 extern void HTSABCat(bstring **dest, const char *src, int len); 140 extern void HTSABCat0(bstring **dest, const char *src); 141 extern BOOL HTSABEql(bstring *a, bstring *b); 142 extern void HTSABFree(bstring **ptr); 143 144 #define BStrLen(s) (((s) != 0) ? (s)->len : 0) 145 #define BStrData(s) (((s) != 0) ? (s)->str : 0) 146 147 #define BINEQ(a,b) (HTSABEql(a,b)) /* like STREQ() */ 148 149 #define isBEmpty(p) ((p) == 0 || BStrData(p) == 0 || BStrLen(p) == 0) 150 151 #define BStrAlloc(d,n) HTSABAlloc( &(d), n) 152 #define BStrCopy(d,s) HTSABCopy( &(d), BStrData(s), BStrLen(s)) 153 #define BStrCopy0(d,s) HTSABCopy0( &(d), s) 154 #define BStrCopy1(d,s,n) HTSABCopy( &(d), s, n) 155 #define BStrCat(d,s) HTSABCat( &(d), BStrData(s), BStrLen(s)) 156 #define BStrCat0(d,s) HTSABCat0( &(d), s) 157 #define BStrFree(d) HTSABFree( &(d)) 158 159 extern bstring *HTBprintf(bstring **pstr, const char *fmt, ...) GCC_PRINTFLIKE(2,3); 160 161 extern void trace_bstring(bstring *data); 162 extern void trace_bstring2(const char *text, int size); 163 164 #ifdef __cplusplus 165 } 166 #endif 167 #endif /* HTSTRING_H */ 168