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