Diff for /libaitwww/src/tools.c between versions 1.1 and 1.4.4.1

version 1.1, 2012/03/08 23:40:21 version 1.4.4.1, 2013/01/17 14:52:44
Line 12  terms: Line 12  terms:
 All of the documentation and software included in the ELWIX and AITNET  All of the documentation and software included in the ELWIX and AITNET
 Releases is copyrighted by ELWIX - Sofia/Bulgaria <info@elwix.org>  Releases is copyrighted by ELWIX - Sofia/Bulgaria <info@elwix.org>
   
Copyright 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012Copyright 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013
         by Michael Pounov <misho@elwix.org>.  All rights reserved.          by Michael Pounov <misho@elwix.org>.  All rights reserved.
   
 Redistribution and use in source and binary forms, with or without  Redistribution and use in source and binary forms, with or without
Line 44  OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF TH Line 44  OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF TH
 SUCH DAMAGE.  SUCH DAMAGE.
 */  */
 #include "global.h"  #include "global.h"
 #include "tools.h"  
   
   
   /*
    * www_cmp() - Compare two string
    *
    * @ct = content text from www
    * @s = string
    * return: 0 are equal or !0 are different
    */
 int  int
 www_cmp(const char *ct, const char *s)  www_cmp(const char *ct, const char *s)
 {  {
Line 54  www_cmp(const char *ct, const char *s) Line 60  www_cmp(const char *ct, const char *s)
   
         assert(ct && s);          assert(ct && s);
   
        while (isspace(*ct))        while (isspace((int) *ct))
                 ct++;                  ct++;
   
         if (!(sc = strchr(ct, ';')))          if (!(sc = strchr(ct, ';')))
                 sc = strchr(ct, '\x0');                  sc = strchr(ct, '\x0');
        while (isspace(*(sc - 1)))        while (isspace((int) *(sc - 1)))
                 sc--;                  sc--;
   
         if (strlen(s) != sc - ct)          if (strlen(s) != sc - ct)
Line 67  www_cmp(const char *ct, const char *s) Line 73  www_cmp(const char *ct, const char *s)
         return strncasecmp(ct, s, sc - ct);          return strncasecmp(ct, s, sc - ct);
 }  }
   
   /*
    * www_cmptype() - Compare context type
    *
    * @ct = content text from www
    * @type = content type
    * return: 0 are equal or !0 are different
    */
 int  int
 www_cmptype(const char *ct, const char *type)  www_cmptype(const char *ct, const char *type)
 {  {
Line 74  www_cmptype(const char *ct, const char *type) Line 87  www_cmptype(const char *ct, const char *type)
   
         assert(ct && type);          assert(ct && type);
   
        while (isspace(*ct))        while (isspace((int) *ct))
                 ct++;                  ct++;
   
         if (!(sl = strchr(ct, '/')))          if (!(sl = strchr(ct, '/')))
Line 85  www_cmptype(const char *ct, const char *type) Line 98  www_cmptype(const char *ct, const char *type)
         return strncasecmp(ct, type, sl - ct);          return strncasecmp(ct, type, sl - ct);
 }  }
   
char */*
  * www_getpair() - Get AV pair from WWW query string
  *
  * @str = query string
  * @delim = delimiter
  * return: NULL error or AV pair, must be e_free() after use!
  */
 ait_val_t *
 www_getpair(char ** __restrict str, const char *delim)  www_getpair(char ** __restrict str, const char *delim)
 {  {
        char *tr, *s = NULL;        char *tr;
         int cx;          int cx;
           ait_val_t *s;
   
         assert(str && *str && delim);          assert(str && *str && delim);
   
        cx = strcspn(*str, delim);        s = ait_allocVar();
        tr = *str + cx; 
 
        s = malloc(cx + 1); 
         if (!s) {          if (!s) {
                LOGERR;                www_SetErr(elwix_GetErrno(), "%s", elwix_GetError());
                 return NULL;                  return NULL;
         } else {  
                 strncpy(s, *str, cx);  
                 s[cx] = 0;  
         }          }
   
        *str = tr;        cx = strcspn(*str, delim);
        if (*str)        tr = *str + cx;
                (*str)++;        if (*tr)
                 *tr++ = 0;
   
           AIT_SET_STR(s, *str);
   
           *str = tr;
         return s;          return s;
 }  }
   
   /*
    * www_x2c() - Hex from string to digit
    *
    * @str = string
    * return: digit
    */
 inline char  inline char
 www_x2c(const char *str)  www_x2c(const char *str)
 {  {
Line 126  www_x2c(const char *str) Line 151  www_x2c(const char *str)
         return digit;          return digit;
 }  }
   
   /*
    * www_unescape() - Unescape/decode WWW query string to host string
    *
    * @str = string
    * return: none
    */
 inline void  inline void
 www_unescape(char * __restrict str)  www_unescape(char * __restrict str)
 {  {
         register int i, j;          register int i, j;
   
        assert(str);        if (!str)
                 return;
   
         for (i = j = 0; str[j]; i++, j++) {          for (i = j = 0; str[j]; i++, j++) {
                 str[i] = str[j];                  str[i] = str[j];
Line 145  www_unescape(char * __restrict str) Line 177  www_unescape(char * __restrict str)
         }          }
   
         str[i] = 0;          str[i] = 0;
   }
   
   /*
    * www_undot() - Undotted and clean WWW query filename
    *
    * @pname = query filename
    * return: =NULL error or !=NULL allocated valid filename, after use you must call ait_freeVar()
    */
   ait_val_t *
   www_undot(const char * __restrict pname)
   {
           char *s, *s2, *fname;
           int l;
           ait_val_t *v;
   
           if (!pname)
                   return NULL;
           /* check for valid query filename */
           if (*pname != '/')
                   return NULL;
   
           v = ait_allocVar();
           if (!v) {
                   www_SetErr(elwix_GetErrno(), "%s", elwix_GetError());
                   return NULL;
           } else {
                   AIT_SET_STR(v, pname + 1);
                   fname = AIT_GET_STR(v);
           }
   
           /* collapse / sequences */
           if ((s = strstr(fname, "//"))) {
                   s2 = s + 1;
                   for (s2 = ++s; *s2 == '/'; s2++);
                   memmove(s, s2, strlen(s2) + 1);
           }
   
           /* escaped ./ and /./ sequences */
           while (!strncmp(fname, "./", 2))
                   memmove(fname, fname + 2, strlen(fname + 1));
           while ((s = strstr(fname, "/./")))
                   memmove(s, s + 2, strlen(s + 1));
   
           /* alternate between removing leading ../ and removing xxx/../ */
           while (42) {
                   while (!strncmp(fname, "../", 3))
                           memmove(fname, fname + 3, strlen(fname + 2));
                   if (!(s = strstr(fname, "/../")))
                           break;
                   for (s2 = s - 1; s2 >= fname && *s2 != '/'; --s2);
                   memmove(s2 + 1, s + 4, strlen(s + 3));
           }
   
           /* elide any /.. at the end */
           while ((l = strlen(fname)) > 3 && 
                           !strcmp((s = fname + l - 3), "/..")) {
                   for (s2 = s - 1; s2 >= fname && *s2 != '/'; --s2);
                   if (s2 < fname)
                           break;
                   *s2 = 0;
           }
   
           /* if filename is empry add current dir */
           if (!*fname) {
                   AIT_FREE_VAL(v);
                   AIT_SET_STR(v, "./");
                   fname = AIT_GET_STR(v);
           }
   
           /* check for valid filename */
           if (*fname == '/' || (fname[0] == '.' && fname[1] == '.' && 
                                   (!fname[2] || fname[2] == '/'))) {
                   ait_freeVar(&v);
                   return NULL;
           }
   
           return v;
 }  }

Removed from v.1.1  
changed lines
  Added in v.1.4.4.1


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>