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