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);
209char *
qstrreplace(
const char *mode,
char *srcstr,
const char *tokstr,
211 if (mode == NULL || strlen(mode) != 2|| srcstr == NULL || tokstr == NULL
213 DEBUG(
"Unknown mode \"%s\".", mode);
217 char *newstr, *newp, *srcp, *tokenp, *retp;
218 newstr = newp = srcp = tokenp = retp = NULL;
220 char method = mode[0], memuse = mode[1];
221 int maxstrlen, tokstrlen;
225 maxstrlen = strlen(srcstr) * ((strlen(word) > 0) ? strlen(word) : 1);
226 newstr = (
char *) malloc(maxstrlen + 1);
230 for (srcp = (
char *) srcstr, newp = newstr; *srcp; srcp++) {
231 for (tokenp = (
char *) tokstr; *tokenp; tokenp++) {
232 if (*srcp == *tokenp) {
234 for (wordp = (
char *) word; *wordp; wordp++) {
244 }
else if (method ==
's') {
245 if (strlen(word) > strlen(tokstr)) {
246 maxstrlen = ((strlen(srcstr) / strlen(tokstr)) * strlen(word))
247 + (strlen(srcstr) % strlen(tokstr));
249 maxstrlen = strlen(srcstr);
251 newstr = (
char *) malloc(maxstrlen + 1);
255 tokstrlen = strlen(tokstr);
257 for (srcp = srcstr, newp = newstr; *srcp; srcp++) {
258 if (!strncmp(srcp, tokstr, tokstrlen)) {
260 for (wordp = (
char *) word; *wordp; wordp++)
262 srcp += tokstrlen - 1;
268 DEBUG(
"Unknown mode \"%s\".", mode);
275 else if (memuse ==
'r') {
276 strcpy(srcstr, newstr);
280 DEBUG(
"Unknown mode \"%s\".", mode);
298char *
qstrcpy(
char *dst,
size_t size,
const char *src) {
299 if (dst == NULL || size == 0 || src == NULL)
302 size_t nbytes = strlen(src);
303 return qstrncpy(dst, size, src, nbytes);
317char *
qstrncpy(
char *dst,
size_t size,
const char *src,
size_t nbytes) {
318 if (dst == NULL || size == 0 || src == NULL)
323 memmove((
void *) dst, (
void *) src, nbytes);
338 DYNAMIC_VSPRINTF(str, format);
342 char *dup = strdup(str);
359 if ((s = strstr(str, start)) == NULL)
364 if ((e = strstr(s, end)) == NULL)
369 char *buf = (
char *) malloc(
sizeof(
char) * (len + 1));
373 strncpy(buf, s, len);
387 if (data == NULL || size == 0) {
391 void *newdata = malloc(size);
392 if (newdata == NULL) {
396 memcpy(newdata, data, size);
408char *
qstrcatf(
char *str,
const char *format, ...) {
410 DYNAMIC_VSPRINTF(buf, format);
414 char *ret = strcat(str, buf);
441char *
qstrgets(
char *buf,
size_t size,
char **offset) {
442 if (offset == NULL || *offset == NULL || **offset ==
'\0')
446 char *from = *offset;
448 for (i = 0; *from !=
'\0' && i < (size - 1); i++, from++) {
478 for (p1 = str, p2 = str + (strlen(str) - 1); p2 > p1; p1++, p2--) {
501 for (cp = str; *cp; cp++)
502 if (*cp >=
'a' && *cp <=
'z')
521 for (cp = str; *cp; cp++)
522 if (*cp >=
'A' && *cp <=
'Z')
554char *
qstrtok(
char *str,
const char *delimiters,
char *retstop,
int *offset) {
555 char *tokensp, *tokenep;
557 tokensp = tokenep = (
char *) (str + *offset);
558 int numdel = strlen(delimiters);
559 for (; *tokenep; tokenep++) {
561 for (j = 0; j < numdel; j++) {
562 if (*tokenep == delimiters[j]) {
564 *retstop = delimiters[j];
567 *offset = tokenep - str;
575 if (tokensp != tokenep) {
576 *offset = tokenep - str;
601 qlist_t *list =
qlist(0);
606 char *dupstr = strdup(str);
609 for (i = 1, token =
qstrtok(dupstr, delimiters, NULL, &offset);
611 token =
qstrtok(dupstr, delimiters, NULL, &offset), i++) {
612 list->addlast(list, token, strlen(token) + 1);
635 GetSystemTimeAsFileTime(&ft);
636 usec = ft.dwLowDateTime % 1000000;
639 gettimeofday(&tv, NULL);
644 snprintf(uniquestr,
sizeof(uniquestr),
"%u%d%lu%ld%s", getpid(), rand(),
645 (
unsigned long)time(NULL), usec, (seed != NULL) ? seed :
"");
647 unsigned char md5hash[16];
648 qhashmd5(uniquestr, strlen(uniquestr), md5hash);
664 str = strp = (
char *) malloc(
sizeof(
char) * (14 + 1));
668 char buf[10 + 1], *bufp;
669 snprintf(buf,
sizeof(buf),
"%d", abs(number));
673 for (bufp = buf; *bufp !=
'\0'; strp++, bufp++) {
675 if ((strlen(bufp)) % 3 == 1 && *(bufp + 1) !=
'\0')
722bool qstrtest(
int (*testfunc)(
int),
const char *str) {
723 for (; *str; str++) {
724 if (testfunc(*str) == 0)
738 int i, alpa, dot, gol;
743 for (i = alpa = dot = gol = 0; email[i] !=
'\0'; i++) {
754 if ((i > 0) && (email[i - 1] ==
'@'))
756 if ((gol > 0) && (email[i - 1] ==
'.'))
763 if ((email[i] >=
'0') && (email[i] <=
'9'))
765 else if ((email[i] >=
'A') && (email[i] <=
'Z'))
767 else if ((email[i] >=
'a') && (email[i] <=
'z'))
769 else if ((email[i] ==
'-') || (email[i] ==
'_'))
777 if ((alpa <= 3) || (gol == 0) || (dot == 0))
796 char *dupstr = strdup(str);
800 for (s1 = dupstr, periodcnt = 0; (s2 = strchr(s1,
'.')) != NULL;
801 s1 = s2 + 1, periodcnt++) {
805 if (
qstrtest(isdigit, s1) ==
false || (n = atoi(s1)) <= 0 || n >= 256) {
836 const char *tocode,
float mag) {
841 char *fromstr = (
char *) str;
842 size_t fromsize = strlen(fromstr) + 1;
844 size_t tosize =
sizeof(char) * ((mag * (fromsize - 1)) + 1);
845 char *tostr = (
char *) malloc(tosize);
849 char *tostr1 = tostr;
851 iconv_t it = iconv_open(tocode, fromcode);
853 DEBUG(
"iconv_open() failed.");
857 int ret = iconv(it, &fromstr, &fromsize, &tostr, &tosize);
861 DEBUG(
"iconv() failed.");
char * qhex_encode(const void *bin, size_t size)
Encode data as hexadecimal digits.
bool qhashmd5(const void *data, size_t nbytes, void *retbuf)
Calculate 128-bit(16-bytes) MD5 hash.
static bool head(qhttpclient_t *client, const char *uri, int *rescode, qlisttbl_t *reqheaders, qlisttbl_t *resheaders)
qhttpclient->head(): Sends a HEAD request.
qlist_t * qlist(int options)
Create new qlist_t linked-list container.
char * qstrrev(char *str)
Reverse the order of characters in the string.
char * qstrtok(char *str, const char *delimiters, char *retstop, int *offset)
Split a string into tokens.
char * qstrcpy(char *dst, size_t size, const char *src)
Copy src string to dst.
char * qstrunique(const char *seed)
Generate a unique ID.
qlist_t * qstrtokenizer(const char *str, const char *delimiters)
Tokenize a string.
char * qstrncpy(char *dst, size_t size, const char *src, size_t nbytes)
Copy src string to dst no more than n bytes.
char * qstrtrim(char *str)
Remove whitespace, including CR and LF, from both ends of a string.
bool qstrtest(int(*testfunc)(int), const char *str)
Test whether a string matches a character rule.
char * qstrtrim_head(char *str)
Remove leading whitespace from a string.
char * qstrcatf(char *str, const char *format,...)
Append formatted text to the end of a string.
char * qstrunchar(char *str, char head, char tail)
Remove matching characters from the start and end of a string.
char * qstrdup_between(const char *str, const char *start, const char *end)
Duplicate a substring between two markers.
bool qstr_is_ip4addr(const char *str)
Test for an IPv4 address string.
char * qstrdupf(const char *format,...)
Duplicate a formatted string.
void * qmemdup(const void *data, size_t size)
Duplicate a block of memory.
char * qstrtrim_tail(char *str)
Remove trailing whitespace, including CR and LF, from a string.
char * qstrgets(char *buf, size_t size, char **offset)
Read one line from a string.
char * qstrreplace(const char *mode, char *srcstr, const char *tokstr, const char *word)
Replace tokens or strings in a source string using the given mode.
char * qstrupper(char *str)
Convert character to bigger character.
char * qstrlower(char *str)
Convert character to lower character.
char * qstr_comma_number(int number)
Convert an integer to a comma-separated string.
char * qstr_conv_encoding(const char *str, const char *fromcode, const char *tocode, float mag)
Convert character encoding.
bool qstr_is_email(const char *email)
Test for an email-address formatted string.