Diff for /libaitio/src/aitio.c between versions 1.13 and 1.14

version 1.13, 2012/11/15 23:23:54 version 1.14, 2013/03/13 14:54:39
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 46  SUCH DAMAGE. Line 46  SUCH DAMAGE.
 #include "global.h"  #include "global.h"
   
   
 int io_Debug;  
 mpool_t *io_mpool;  
   
   
 /* Memory management */  
   
 void *(*io_malloc)(size_t) = malloc;  
 void *(*io_calloc)(size_t, size_t) = calloc;  
 void *(*io_realloc)(void*, size_t) = realloc;  
 char *(*io_strdup)(const char*) = strdup;  
 void (*io_free)(void*) = free;  
   
   
 #pragma GCC visibility push(hidden)  #pragma GCC visibility push(hidden)
   
 int use_mm;  
   
 int io_Errno;  int io_Errno;
 char io_Error[STRSIZ];  char io_Error[STRSIZ];
   
Line 90  io_SetErr(int eno, char *estr, ...) Line 75  io_SetErr(int eno, char *estr, ...)
         va_list lst;          va_list lst;
   
         io_Errno = eno;          io_Errno = eno;
        memset(io_Error, 0, STRSIZ);        memset(io_Error, 0, sizeof io_Error);
         va_start(lst, estr);          va_start(lst, estr);
        vsnprintf(io_Error, STRSIZ, estr, lst);        vsnprintf(io_Error, sizeof io_Error, estr, lst);
         va_end(lst);          va_end(lst);
 }  }
   
 // io_mm_inuse() Check for memory management model  
 inline int  
 io_mm_inuse()  
 {  
         return use_mm & IO_MPOOL;  
 }  
   
   
 // init libaitio routine  
 __attribute__((constructor)) void  
 _io_init()  
 {  
         ioLibInit(IO_MPOOL, 0);  
 }  
   
 // fini libaitio routine  
 __attribute__((destructor)) void  
 _io_fini()  
 {  
         ioLibFini();  
 }  
   
 /*  /*
  * ioLibInit() - Init libaitio library memory management  
  *  
  * @mm = memory management (IO_SYSM or IO_MPOOL)  
  * @maxmem = memory limit  
  * return: -1 error or !=-1 used memory management model  
  */  
 inline int  
 ioLibInit(int mm, u_long maxmem)  
 {  
         switch (mm) {  
                 case IO_MPOOL:  /* mpool */  
                         io_mpool = mpool_init(maxmem);  
                         if (io_mpool) {  
                                 io_malloc = mpool_xmalloc;  
                                 io_calloc = mpool_xcalloc;  
                                 io_realloc = mpool_xrealloc;  
                                 io_strdup = mpool_xstrdup;  
                                 io_free = mpool_xfree;  
                                 use_mm = mm;  
                                 break;  
                         } else {  
                                 #undef USE_MPOOL  
                         }  
                 case IO_SYSM:   /* system */  
                         io_malloc = malloc;  
                         io_calloc = calloc;  
                         io_realloc = realloc;  
                         io_strdup = strdup;  
                         io_free = free;  
                         use_mm = mm;  
                         break;  
                 default:        /* not supported */  
                         io_SetErr(EINVAL, "Not supported memory management");  
                         return -1;  
         }  
   
         return use_mm;  
 }  
   
 /*  
  * ioLibFini() - Finish libaitio library memory management  
  *  
  * return: none  
  */  
 inline void  
 ioLibFini()  
 {  
         switch (use_mm) {  
                 case IO_MPOOL:  
                         io_malloc = malloc;  
                         io_calloc = calloc;  
                         io_realloc = realloc;  
                         io_strdup = strdup;  
                         io_free = free;  
                         use_mm = IO_SYSM;  
   
                         mpool_destroy(&io_mpool);  
                         break;  
         }  
 }  
   
   
 /*  
  * ioPromptRead() - Read data from input h[0] with prompt to output h[1]   * ioPromptRead() - Read data from input h[0] with prompt to output h[1]
  *   *
  * @h = file handles h[0] = input, h[1] = output, if NULL use stdin, stdout   * @h = file handles h[0] = input, h[1] = output, if NULL use stdin, stdout
Line 323  next: Line 224  next:
 }  }
   
 /*  /*
  * ioRegexVerify() - Function for verify data match in regex expression  
  *  
  * @csRegex = Regulare expression pattern  
  * @csData = Data for check and verify  
  * @startPos = Return start positions  
  * @endPos = Return end positions  
  * return: NULL not match or error; !=NULL begin of matched data  
 */  
 const char *  
 ioRegexVerify(const char *csRegex, const char *csData, int *startPos, int *endPos)  
 {  
         regex_t re;  
         regmatch_t match;  
         char szErr[STRSIZ];  
         int ret, flg;  
         const char *pos;  
   
         if (!csRegex || !csData)  
                 return NULL;  
   
         if ((ret = regcomp(&re, csRegex, REG_EXTENDED))) {  
                 regerror(ret, &re, szErr, STRSIZ);  
                 io_SetErr(ret, "%s", szErr);  
                 regfree(&re);  
                 return NULL;  
         }  
   
         for (ret = flg = 0, pos = csData; !(ret = regexec(&re, pos, 1, &match, flg));   
                         pos += match.rm_eo, flg = REG_NOTBOL) {  
                 if (startPos)  
                         *startPos = match.rm_so;  
                 if (endPos)  
                         *endPos = match.rm_eo;  
   
                 pos += match.rm_so;  
                 break;  
         }  
   
         if (ret) {  
                 regerror(ret, &re, szErr, STRSIZ);  
                 io_SetErr(ret, "%s", szErr);  
                 pos = NULL;  
         }  
   
         regfree(&re);  
         return pos;  
 }  
   
 /*  
  * ioRegexGet() - Function for get data match in regex expression  
  *  
  * @csRegex = Regulare expression pattern  
  * @csData = Data from get  
  * @psString = Returned string if match  
  * @strLen = Length of string  
  * return: 0 not match; >0 count of returned chars  
 */  
 int  
 ioRegexGet(const char *csRegex, const char *csData, char * __restrict psString, int strLen)  
 {  
         int sp, ep, len;  
         const char *str;  
   
         if (!csRegex || !csData)  
                 return -1;  
   
         str = ioRegexVerify(csRegex, csData, &sp, &ep);  
         if (!str)  
                 return 0;  
   
         len = ep - sp;  
         if (psString && strLen) {  
                 memset(psString, 0, strLen);  
                 strncpy(psString, str, strLen <= len ? strLen - 1 : len);  
         }  
   
         return len;  
 }  
   
 /*  
  * ioRegexReplace() - Function for replace data match in regex expression with newdata  
  *  
  * @csRegex = Regulare expression pattern  
  * @csData = Source data  
  * @csNew = Data for replace  
  * return: NULL not match or error; !=NULL allocated new string, must be io_free after use!  
 */  
 char *  
 ioRegexReplace(const char *csRegex, const char *csData, const char *csNew)  
 {  
         int sp, ep, len;  
         char *str = NULL;  
   
         if (!csRegex || !csData)  
                 return NULL;  
   
         if (!ioRegexVerify(csRegex, csData, &sp, &ep))  
                 return NULL;  
   
         // ___ before match  
         len = sp + 1;  
         str = io_malloc(len);  
         if (!str) {  
                 LOGERR;  
                 return NULL;  
         } else  
                 strlcpy(str, csData, len);  
         // * replace match *  
         if (csNew) {  
                 len += strlen(csNew);  
                 str = io_realloc(str, len);  
                 if (!str) {  
                         LOGERR;  
                         return NULL;  
                 } else  
                         strlcat(str, csNew, len);  
         }  
         // after match ___  
         len += strlen(csData) - ep;  
         str = io_realloc(str, len);  
         if (!str) {  
                 LOGERR;  
                 return NULL;  
         } else  
                 strlcat(str, csData + ep, len);  
   
         return str;  
 }  
   
 /*  
  * ioStrAst() - Function for evaluate string like asterisk variable "{text[:[-]#[:#]]}"  
  *  
  * @csString = Input string  
  * return: NULL error, !=NULL Allocated new string evaluated from input string, must be io_free()  
 */  
 char *  
 ioStrAst(const char *csString)  
 {  
         char *ext, *str, *out = NULL;  
         int e[2] = { 0 };  
   
         if (!csString)  
                 return NULL;  
   
         if (!strchr(csString, '{') || !strrchr(csString, '}')) {  
                 memset(io_Error, 0, STRSIZ);  
                 snprintf(io_Error, STRSIZ, "Invalid input string format ... "  
                                 "must be like {text[:[-]#[:#]]}");  
                 io_Errno = EINVAL;  
                 return NULL;  
         } else {  
                 str = io_strdup(strchr(csString, '{') + 1);  
                 *strrchr(str, '}') = 0;  
         }  
   
         if ((ext = strchr(str, ':'))) {  
                 *ext++ = 0;  
                 e[0] = strtol(ext, NULL, 0);  
                 if ((ext = strchr(ext, ':')))  
                         e[1] = strtol(++ext, NULL, 0);  
   
                 /* make cut prefix */  
                 if (e[0] >= 0)  
                         ext = str + e[0];  
                 else  
                         ext = str + strlen(str) + e[0];  
                 /* make cut suffix */  
                 if (e[1] > 0)  
                         *(ext + e[1]) = 0;  
         } else  
                 /* ok, clear show */  
                 ext = str;  
   
         out = io_strdup(ext);  
         io_free(str);  
   
         return out;  
 }  
   
   
 /*  
  * ioMkDir() - Function for racursive directory creation and validation   * ioMkDir() - Function for racursive directory creation and validation
  *   *
  * @csDir = Full directory path   * @csDir = Full directory path
Line 519  ioMkDir(const char *csDir, int mode) Line 239  ioMkDir(const char *csDir, int mode)
         if (!csDir)          if (!csDir)
                 return cx;                  return cx;
   
        str = io_strdup(csDir);        str = e_strdup(csDir);
         if (!str) {          if (!str) {
                 LOGERR;                  LOGERR;
                 return cx;                  return cx;
Line 547  ioMkDir(const char *csDir, int mode) Line 267  ioMkDir(const char *csDir, int mode)
         }          }
 end:  end:
         chdir(szOld);          chdir(szOld);
        io_free(str);        e_free(str);
         return cx;          return cx;
 }  }
   

Removed from v.1.13  
changed lines
  Added in v.1.14


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