xdas_util.c

Go to the documentation of this file.
00001 /*----------------------------------------------------------------------------
00002  * Copyright (c) 2006, Novell, Inc.
00003  * All rights reserved.
00004  * 
00005  * Redistribution and use in source and binary forms, with or without 
00006  * modification, are permitted provided that the following conditions are 
00007  * met:
00008  * 
00009  *     * Redistributions of source code must retain the above copyright 
00010  *       notice, this list of conditions and the following disclaimer.
00011  *     * Redistributions in binary form must reproduce the above copyright 
00012  *       notice, this list of conditions and the following disclaimer in the 
00013  *       documentation and/or other materials provided with the distribution.
00014  *     * Neither the name of the Novell nor the names of its contributors 
00015  *       may be used to endorse or promote products derived from this 
00016  *       software without specific prior written permission.
00017  * 
00018  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
00019  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
00020  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 
00021  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 
00022  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 
00023  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 
00024  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 
00025  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 
00026  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 
00027  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 
00028  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
00029  *--------------------------------------------------------------------------*/
00030 
00039 #include "xdas_util.h"
00040 
00041 #include <malloc.h>
00042 #include <string.h>
00043 
00044 #ifdef _WIN32
00045 # define strdup _strdup
00046 #endif
00047 
00063 static char * xdas_strdup(const char * sp, const char * limit)
00064 {
00065    size_t splen = limit? (limit - sp): strlen(sp);
00066    char * spdup = (char *)malloc(splen + 1);
00067    if (spdup != 0)
00068    {
00069       strncpy(spdup, sp, splen);
00070       spdup[splen] = 0;
00071    }
00072    return spdup;
00073 }
00074 
00091 static char * xdas_tokenize(char * str, const char * delims, 
00092       char esc, char ** nextok)
00093 {
00094    char * thistok;
00095    if (str) 
00096       *nextok = str;
00097    thistok = *nextok;
00098    if (thistok)
00099    {
00100       while ((*nextok = strpbrk(*nextok, delims)) != 0 
00101             && *nextok != str && (*nextok)[-1] == esc) 
00102          (*nextok)++;
00103       if (*nextok != 0)
00104          *(*nextok)++ = 0;
00105    }
00106    return thistok;
00107 }
00108 
00134 int xdas_parse_info(const char * info, const char * limit, char ** fields, unsigned maxflds)
00135 {
00136    unsigned i;
00137    char * info_copy, * saveptr;
00138 
00139 #define FLD_DELIMS   ":"
00140 #define ESC_CHAR     '%'
00141 
00142    /* make a working copy */
00143    if ((info_copy = xdas_strdup(info, limit)) == 0)
00144       return -1;
00145 
00146    /* convert control characters to spaces */
00147    for (saveptr = info_copy; *saveptr; saveptr++)
00148       if ((unsigned char)*saveptr < 32) *saveptr = ' ';
00149 
00150    /* tokenize the working copy */
00151    fields[0] = xdas_tokenize(info_copy, FLD_DELIMS, ESC_CHAR, &saveptr);
00152    for (i = 1; i < maxflds && fields[i-1]; i++)
00153       fields[i] = xdas_tokenize(0, FLD_DELIMS, ESC_CHAR, &saveptr);
00154 
00155    return saveptr? -2: 0;
00156 }
00157 

Generated on Thu Aug 20 22:33:05 2009 for OpenXDAS by  doxygen 1.5.6