32 size_t big_enough = strlen(src) + 1;
45 #define OUT(chr) if (--rem > 0) ndst++, *dst++ = chr 55 if (!srclen-- || !(c = *src++))
break;
58 case 'a':
OUT(
'\a');
break;
59 case 'b':
OUT(
'\b');
break;
60 case 'f':
OUT(
'\f');
break;
61 case 'n':
OUT(
'\n');
break;
62 case 'r':
OUT(
'\r');
break;
63 case 't':
OUT(
'\t');
break;
64 case 'v':
OUT(
'\v');
break;
65 case '\\':
OUT(
'\\');
break;
66 case '\'':
OUT(
'\'');
break;
67 case '\"':
OUT(
'\"');
break;
69 case '0' :
case '1' :
case '2' :
case '3' :
70 case '4' :
case '5' :
case '6' :
case '7' :
72 unsigned int u = c -
'0';
74 if (!srclen-- || !(c = *src++)) {
77 if (c < '0' || c >
'7') {
80 u = u << 3 | (c -
'0');
82 if (!srclen-- || !(c = *src++)) {
85 if (c < '0' || c >
'7') {
88 u = u << 3 | (c -
'0');
101 if (!srclen-- || !(c = *src++ & 0xff))
104 while (isxdigit(c)) {
105 u = u << 4 | ((c >
'9') ? toupper(c) -
'A' + 10 : c -
'0');
109 if (!srclen-- || !(c = *src++ & 0xff)) {
140 #define OUT(chr) ndst++; if (--rem > 0) *dst++ = chr 143 case '\a':
OUT(
'\\');
OUT(
'a');
break;
144 case '\b':
OUT(
'\\');
OUT(
'b');
break;
145 case '\f':
OUT(
'\\');
OUT(
'f');
break;
146 case '\n':
OUT(
'\\');
OUT(
'n');
break;
147 case '\r':
OUT(
'\\');
OUT(
'r');
break;
148 case '\t':
OUT(
'\\');
OUT(
't');
break;
149 case '\v':
OUT(
'\\');
OUT(
'v');
break;
150 case '\\':
OUT(
'\\');
OUT(
'\\');
break;
151 case '\'':
OUT(
'\\');
OUT(
'\'');
break;
152 case '\"':
OUT(
'\\');
OUT(
'\"');
break;
154 if (isprint(c & 0xff)) {
159 OUT(
'0' + ((c & 0300) >> 6));
160 OUT(
'0' + ((c & 0070) >> 3));
161 OUT(
'0' + (c & 0007));
172 size_t ndst = srclen;
178 case '\a':
case '\b':
case '\f':
case '\n':
179 case '\r':
case '\t':
case '\v':
case '\\':
180 case '\'':
case '\"':
184 if (!isprint(c & 0xff))
194 int ch1 = toupper((
int) *s1);
195 int ch2 = toupper((
int) *s2);
197 if (ch2 == 0)
return (ch1 != 0);
198 if (ch1 == 0)
return -1;
199 if (ch1 < ch2)
return -1;
200 if (ch1 > ch2)
return 1;
211 int ch1 = toupper((
int) *s1);
212 int ch2 = toupper((
int) *s2);
214 if (ch2 == 0)
return (ch1 != 0);
215 if (ch1 == 0)
return -1;
216 if (ch1 < ch2)
return -1;
217 if (ch1 > ch2)
return 1;
228 strncpy(buf, s, len);
246 case '\a': nout += fprintf(fp,
"\\a");
break;
247 case '\b': nout += fprintf(fp,
"\\b");
break;
248 case '\f': nout += fprintf(fp,
"\\f");
break;
249 case '\n': nout += fprintf(fp,
"\\n");
break;
250 case '\r': nout += fprintf(fp,
"\\r");
break;
251 case '\t': nout += fprintf(fp,
"\\t");
break;
252 case '\v': nout += fprintf(fp,
"\\v");
break;
253 case '\\': nout += fprintf(fp,
"\\\\");
break;
254 case '\'': nout += fprintf(fp,
"\\'");
break;
255 case '\"': nout += fprintf(fp,
"\\\"");
break;
257 if (isprint(0xff & (
int)c))
258 nout += fprintf(fp,
"%c", c);
260 nout += fprintf(fp,
"\\%03o", (
unsigned char)c);
272 for (i=0; i<maxlen; i++) {
283 while ((*str) && (*pattern !=
'*')) {
284 if ((*pattern != *str) && (*pattern !=
'?'))
290 if (*pattern ==
'*') {
296 else if ((*pattern == *str) || (*pattern ==
'?')) {
305 while (*pattern ==
'*')
316 if (s ==
NULL && (s = *lasts) ==
NULL)
324 for (spanp = delim; (sc = *spanp++) != 0;) {
343 if ((sc = *spanp++) == c) {
358 unsigned int hash = seed;
361 while ((c = *str++)) {
362 hash ^= ~((hash << 11) ^ c ^ (hash >> 5));
363 if (!(c = *str++))
break;
364 hash ^= (hash << 7) ^ c ^ (hash >> 3);
371 unsigned int hash = seed;
374 hash ^= ~((hash << 11) ^ *str++ ^ (hash >> 5));
375 if (!length--)
break;
376 hash ^= (hash << 7) ^ *str++ ^ (hash >> 3);
unsigned int epicsStrHash(const char *str, unsigned int seed)
size_t epicsStrnEscapedFromRawSize(const char *src, size_t srclen)
int epicsStrGlobMatch(const char *str, const char *pattern)
int epicsStrCaseCmp(const char *s1, const char *s2)
int dbTranslateEscape(char *dst, const char *src)
char * epicsStrtok_r(char *s, const char *delim, char **lasts)
int epicsStrPrintEscaped(FILE *fp, const char *s, size_t len)
char * epicsStrnDup(const char *s, size_t len)
char * epicsStrDup(const char *s)
size_t epicsStrnLen(const char *s, size_t maxlen)
LIBCOM_API void * mallocMustSucceed(size_t size, const char *msg)
A malloc() that never returns NULL.
int epicsStrnCaseCmp(const char *s1, const char *s2, size_t len)
unsigned int epicsMemHash(const char *str, size_t length, unsigned int seed)
Routines for code that can't continue or return after an error.
int epicsStrnEscapedFromRaw(char *dst, size_t dstlen, const char *src, size_t srclen)
int epicsStrnRawFromEscaped(char *dst, size_t dstlen, const char *src, size_t srclen)