41 #include "qinternal.h"
42 #include "utilities/qencode.h"
43 #include "utilities/qhash.h"
44 #include "utilities/qstring.h"
60 for (ss = str; *ss ==
' ' || *ss ==
'\t' || *ss ==
'\r' || *ss ==
'\n';
63 for (se = ss; *se !=
'\0'; se++)
67 && (*se ==
' ' || *se ==
'\t' || *se ==
'\r' || *se ==
'\n');
74 size_t len = (se - ss) + 1;
75 memmove(str, ss, len);
95 for (ss = str; *ss ==
' ' || *ss ==
'\t' || *ss ==
'\r' || *ss ==
'\n';
100 size_t len = strlen(ss) + 1;
101 memmove(str, ss, len);
121 for (se = str + strlen(str) - 1;
123 && (*se ==
' ' || *se ==
'\t' || *se ==
'\r' || *se ==
'\n');
153 int len = strlen(str);
154 if (len >= 2 && str[0] == head && str[len - 1] == tail) {
155 memmove(str, str + 1, len - 2);
236 char *
qstrreplace(
const char *mode,
char *srcstr,
const char *tokstr,
238 if (mode == NULL || strlen(mode) != 2|| srcstr == NULL || tokstr == NULL
240 DEBUG(
"Unknown mode \"%s\".", mode);
244 char *newstr, *newp, *srcp, *tokenp, *retp;
245 newstr = newp = srcp = tokenp = retp = NULL;
247 char method = mode[0], memuse = mode[1];
248 int maxstrlen, tokstrlen;
252 maxstrlen = strlen(srcstr) * ((strlen(word) > 0) ? strlen(word) : 1);
253 newstr = (
char *) malloc(maxstrlen + 1);
255 for (srcp = (
char *) srcstr, newp = newstr; *srcp; srcp++) {
256 for (tokenp = (
char *) tokstr; *tokenp; tokenp++) {
257 if (*srcp == *tokenp) {
259 for (wordp = (
char *) word; *wordp; wordp++) {
269 }
else if (method ==
's') {
270 if (strlen(word) > strlen(tokstr)) {
271 maxstrlen = ((strlen(srcstr) / strlen(tokstr)) * strlen(word))
272 + (strlen(srcstr) % strlen(tokstr));
274 maxstrlen = strlen(srcstr);
276 newstr = (
char *) malloc(maxstrlen + 1);
277 tokstrlen = strlen(tokstr);
279 for (srcp = srcstr, newp = newstr; *srcp; srcp++) {
280 if (!strncmp(srcp, tokstr, tokstrlen)) {
282 for (wordp = (
char *) word; *wordp; wordp++)
284 srcp += tokstrlen - 1;
290 DEBUG(
"Unknown mode \"%s\".", mode);
297 else if (memuse ==
'r') {
298 strcpy(srcstr, newstr);
302 DEBUG(
"Unknown mode \"%s\".", mode);
320 char *
qstrcpy(
char *dst,
size_t size,
const char *src) {
321 if (dst == NULL || size == 0 || src == NULL)
324 size_t nbytes = strlen(src);
325 return qstrncpy(dst, size, src, nbytes);
339 char *
qstrncpy(
char *dst,
size_t size,
const char *src,
size_t nbytes) {
340 if (dst == NULL || size == 0 || src == NULL)
345 memmove((
void *) dst, (
void *) src, nbytes);
360 DYNAMIC_VSPRINTF(str, format);
364 char *dup = strdup(str);
381 if ((s = strstr(str, start)) == NULL)
386 if ((e = strstr(s, end)) == NULL)
391 char *buf = (
char *) malloc(
sizeof(
char) * (len + 1));
392 strncpy(buf, s, len);
406 void *
qmemdup(
const void *data,
size_t size) {
407 if (data == NULL || size == 0) {
411 void *newdata = malloc(size);
412 if (newdata == NULL) {
416 memcpy(newdata, data, size);
428 char *
qstrcatf(
char *str,
const char *format, ...) {
430 DYNAMIC_VSPRINTF(buf, format);
434 char *ret = strcat(str, buf);
461 char *
qstrgets(
char *buf,
size_t size,
char **offset) {
462 if (offset == NULL || *offset == NULL || **offset ==
'\0')
466 char *from = *offset;
468 for (i = 0; *from !=
'\0' && i < (size - 1); i++, from++) {
498 for (p1 = str, p2 = str + (strlen(str) - 1); p2 > p1; p1++, p2--) {
521 for (cp = str; *cp; cp++)
522 if (*cp >=
'a' && *cp <=
'z')
541 for (cp = str; *cp; cp++)
542 if (*cp >=
'A' && *cp <=
'Z')
576 char *
qstrtok(
char *str,
const char *delimiters,
char *retstop,
int *offset) {
577 char *tokensp, *tokenep;
579 tokensp = tokenep = (
char *) (str + *offset);
580 int numdel = strlen(delimiters);
581 for (; *tokenep; tokenep++) {
583 for (j = 0; j < numdel; j++) {
584 if (*tokenep == delimiters[j]) {
586 *retstop = delimiters[j];
589 *offset = tokenep - str;
597 if (tokensp != tokenep) {
598 *offset = tokenep - str;
623 qlist_t *list =
qlist(0);
628 char *dupstr = strdup(str);
631 for (i = 1, token =
qstrtok(dupstr, delimiters, NULL, &offset);
633 token =
qstrtok(dupstr, delimiters, NULL, &offset), i++) {
634 list->addlast(list, token, strlen(token) + 1);
657 GetSystemTimeAsFileTime(&ft);
658 usec = ft.dwLowDateTime % 1000000;
661 gettimeofday(&tv, NULL);
666 snprintf(uniquestr,
sizeof(uniquestr),
"%u%d%lu%ld%s", getpid(), rand(),
667 (
unsigned long)time(NULL), usec, (seed != NULL) ? seed :
"");
669 unsigned char md5hash[16];
670 qhashmd5(uniquestr, strlen(uniquestr), md5hash);
687 str = strp = (
char *) malloc(
sizeof(
char) * (14 + 1));
691 char buf[10 + 1], *bufp;
692 snprintf(buf,
sizeof(buf),
"%d", abs(number));
696 for (bufp = buf; *bufp !=
'\0'; strp++, bufp++) {
698 if ((strlen(bufp)) % 3 == 1 && *(bufp + 1) !=
'\0')
745 bool qstrtest(
int (*testfunc)(
int),
const char *str) {
746 for (; *str; str++) {
747 if (testfunc(*str) == 0)
761 int i, alpa, dot, gol;
766 for (i = alpa = dot = gol = 0; email[i] !=
'\0'; i++) {
777 if ((i > 0) && (email[i - 1] ==
'@'))
779 if ((gol > 0) && (email[i - 1] ==
'.'))
786 if ((email[i] >=
'0') && (email[i] <=
'9'))
788 else if ((email[i] >=
'A') && (email[i] <=
'Z'))
790 else if ((email[i] >=
'a') && (email[i] <=
'z'))
792 else if ((email[i] ==
'-') || (email[i] ==
'_'))
800 if ((alpa <= 3) || (gol == 0) || (dot == 0))
819 char *dupstr = strdup(str);
823 for (s1 = dupstr, periodcnt = 0; (s2 = strchr(s1,
'.')) != NULL;
824 s1 = s2 + 1, periodcnt++) {
828 if (
qstrtest(isdigit, s1) ==
false || (n = atoi(s1)) <= 0 || n >= 256) {
860 const char *tocode,
float mag) {
865 char *fromstr = (
char *) str;
866 size_t fromsize = strlen(fromstr) + 1;
868 size_t tosize =
sizeof(char) * ((mag * (fromsize - 1)) + 1);
869 char *tostr = (
char *) malloc(tosize);
872 char *tostr1 = tostr;
874 iconv_t it = iconv_open(tocode, fromcode);
876 DEBUG(
"iconv_open() failed.");
880 int ret = iconv(it, &fromstr, &fromsize, &tostr, &tosize);
884 DEBUG(
"iconv() failed.");
char * qstrdup_between(const char *str, const char *start, const char *end)
Duplicate a substing set.
char * qhex_encode(const void *bin, size_t size)
Encode data to Hexadecimal digit format.
char * qstrcatf(char *str, const char *format,...)
Append formatted string to the end of the source str.
char * qstrupper(char *str)
Convert character to bigger character.
char * qstrtrim_tail(char *str)
Remove tailing white spaces(including CR, LF) of the string.
char * qstrgets(char *buf, size_t size, char **offset)
Get one line from the string offset.
bool qstr_is_ip4addr(const char *str)
Test for an IPv4 address string.
qlist_t * qlist(int options)
Create new qlist_t linked-list container.
char * qstrtrim_head(char *str)
Remove heading white spaces of the string.
char * qstrdupf(const char *format,...)
Duplicate a formatted string.
bool qhashmd5(const void *data, size_t nbytes, void *retbuf)
Calculate 128-bit(16-bytes) MD5 hash.
char * qstr_conv_encoding(const char *str, const char *fromcode, const char *tocode, float mag)
Convert character encoding.
char * qstrncpy(char *dst, size_t size, const char *src, size_t nbytes)
Copy src string to dst no more than n bytes.
qlist_t * qstrtokenizer(const char *str, const char *delimiters)
String Tokenizer.
char * qstrtrim(char *str)
Remove white spaces(including CR, LF) from head and tail of the string.
char * qstrunchar(char *str, char head, char tail)
Remove character from head and tail of the string.
char * qstrcpy(char *dst, size_t size, const char *src)
Copy src string to dst.
char * qstrtok(char *str, const char *delimiters, char *retstop, int *offset)
Split string into tokens.
void * qmemdup(const void *data, size_t size)
Duplicate a copy of memory data.
bool qstrtest(int(*testfunc)(int), const char *str)
Test for an alpha-numeric string.
char * qstrrev(char *str)
Reverse the order of characters in the string.
bool qstr_is_email(const char *email)
Test for an email-address formatted string.
char * qstrreplace(const char *mode, char *srcstr, const char *tokstr, const char *word)
Replace string or tokens as word from source string with given mode.
char * qstr_comma_number(int number)
Convert integer to comma string.
char * qstrlower(char *str)
Convert character to lower character.
char * qstrunique(const char *seed)
Generate unique id.
static bool head(qhttpclient_t *client, const char *uri, int *rescode, qlisttbl_t *reqheaders, qlisttbl_t *resheaders)
qhttpclient->head(): Sends a HEAD request.