summaryrefslogtreecommitdiffstats
path: root/WWW/Library/Implementation/HTString.h
blob: a5ff20dc3e060117009f71304e154636bcc713da (plain)
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.39 2018/05/11 22:36:34 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 */