123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205 |
- // Copyright (c) Athena Dev Teams - Licensed under GNU GPL
- // For more information, see LICENCE in the main folder
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <ctype.h>
- #include "strlib.h"
- #include "../common/cbasetypes.h"
- #include "../common/utils.h"
- #include "../common/malloc.h"
- //-----------------------------------------------
- // string lib.
- char* jstrescape (char* pt) {
- //copy from here
- char *ptr;
- int i =0, j=0;
- //copy string to temporary
- CREATE(ptr, char, J_MAX_MALLOC_SIZE);
- strcpy(ptr,pt);
- while (ptr[i] != '\0') {
- switch (ptr[i]) {
- case '\'':
- pt[j++] = '\\';
- pt[j++] = ptr[i++];
- break;
- case '\\':
- pt[j++] = '\\';
- pt[j++] = ptr[i++];
- break;
- case '%':
- pt[j++] = '_'; i++;
- break;
- default:
- pt[j++] = ptr[i++];
- }
- }
- pt[j++] = '\0';
- aFree(ptr);
- return &pt[0];
- }
- char* jstrescapecpy (char* pt, const char* spt) {
- //copy from here
- //WARNING: Target string pt should be able to hold strlen(spt)*2, as each time
- //a escape character is found, the target's final length increases! [Skotlex]
- int i =0, j=0;
- if (!spt) { //Return an empty string [Skotlex]
- pt[0] = '\0';
- return &pt[0];
- }
-
- while (spt[i] != '\0') {
- switch (spt[i]) {
- case '\'':
- pt[j++] = '\\';
- pt[j++] = spt[i++];
- break;
- case '\\':
- pt[j++] = '\\';
- pt[j++] = spt[i++];
- break;
- case '%':
- pt[j++] = '_'; i++;
- break;
- default:
- pt[j++] = spt[i++];
- }
- }
- pt[j++] = '\0';
- return &pt[0];
- }
- int jmemescapecpy (char* pt,char* spt, int size) {
- //copy from here
- int i =0, j=0;
- while (i < size) {
- switch (spt[i]) {
- case '\'':
- pt[j++] = '\\';
- pt[j++] = spt[i++];
- break;
- case '\\':
- pt[j++] = '\\';
- pt[j++] = spt[i++];
- break;
- case '%':
- pt[j++] = '_'; i++;
- break;
- default:
- pt[j++] = spt[i++];
- }
- }
- // copy size is 0 ~ (j-1)
- return j;
- }
- //-----------------------------------------------------
- // Function to suppress control characters in a string.
- //-----------------------------------------------------
- //int remove_control_chars(char *str) {
- int remove_control_chars(unsigned char *str) {
- int i;
- int change = 0;
- for(i = 0; str[i]; i++) {
- if (str[i] < 32) {
- str[i] = '_';
- change = 1;
- }
- }
- return change;
- }
- //Trims a string, also removes illegal characters such as \t and reduces continous spaces to a single one. by [Foruken]
- char *trim(char *str, const char *delim)
- {
- char *strp = strtok(str,delim);
- char buf[1024];
- char *bufp = buf;
- memset(buf,0,sizeof buf);
- while(strp) {
- strcpy(bufp, strp);
- bufp = bufp + strlen(strp);
- strp = strtok(NULL, delim);
- if (strp) {
- strcpy(bufp," ");
- bufp++;
- }
- }
- strcpy(str,buf);
- return str;
- }
- //stristr: Case insensitive version of strstr, code taken from
- //http://www.daniweb.com/code/snippet313.html, Dave Sinkula
- //
- const char *stristr(const char *haystack, const char *needle)
- {
- if ( !*needle )
- {
- return haystack;
- }
- for ( ; *haystack; ++haystack )
- {
- if ( TOUPPER(*haystack) == TOUPPER(*needle) )
- {
- /*
- * Matched starting char -- loop through remaining chars.
- */
- const char *h, *n;
- for ( h = haystack, n = needle; *h && *n; ++h, ++n )
- {
- if ( TOUPPER(*h) != TOUPPER(*n) )
- {
- break;
- }
- }
- if ( !*n ) /* matched all of 'needle' to null termination */
- {
- return haystack; /* return the start of the match */
- }
- }
- }
- return 0;
- }
- #ifdef __WIN32
- char *_strtok_r(char *s1, const char *s2, char **lasts)
- {
- char *ret;
- if (s1 == NULL)
- s1 = *lasts;
- while(*s1 && strchr(s2, *s1))
- ++s1;
- if(*s1 == '\0')
- return NULL;
- ret = s1;
- while(*s1 && !strchr(s2, *s1))
- ++s1;
- if(*s1)
- *s1++ = '\0';
- *lasts = s1;
- return ret;
- }
- #endif
- #if !defined(WIN32) || (defined(_MSC_VER) && _MSC_VER < 1400)
- /* Find the length of STRING, but scan at most MAXLEN characters.
- If no '\0' terminator is found in that many characters, return MAXLEN. */
- size_t strnlen (const char* string, size_t maxlen)
- {
- const char* end = memchr (string, '\0', maxlen);
- return end ? (size_t) (end - string) : maxlen;
- }
- #endif
|