Home | History | Annotate | Download | only in libjasper
      1 /*
      2  * Copyright (c) 2001-2002 Michael David Adams.
      3  * All rights reserved.
      4  */
      5 
      6 /* __START_OF_JASPER_LICENSE__
      7  *
      8  * JasPer License Version 2.0
      9  *
     10  * Copyright (c) 2001-2006 Michael David Adams
     11  * Copyright (c) 1999-2000 Image Power, Inc.
     12  * Copyright (c) 1999-2000 The University of British Columbia
     13  *
     14  * All rights reserved.
     15  *
     16  * Permission is hereby granted, free of charge, to any person (the
     17  * "User") obtaining a copy of this software and associated documentation
     18  * files (the "Software"), to deal in the Software without restriction,
     19  * including without limitation the rights to use, copy, modify, merge,
     20  * publish, distribute, and/or sell copies of the Software, and to permit
     21  * persons to whom the Software is furnished to do so, subject to the
     22  * following conditions:
     23  *
     24  * 1.  The above copyright notices and this permission notice (which
     25  * includes the disclaimer below) shall be included in all copies or
     26  * substantial portions of the Software.
     27  *
     28  * 2.  The name of a copyright holder shall not be used to endorse or
     29  * promote products derived from the Software without specific prior
     30  * written permission.
     31  *
     32  * THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS
     33  * LICENSE.  NO USE OF THE SOFTWARE IS AUTHORIZED HEREUNDER EXCEPT UNDER
     34  * THIS DISCLAIMER.  THE SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS
     35  * "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
     36  * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
     37  * PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.  IN NO
     38  * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL
     39  * INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING
     40  * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
     41  * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
     42  * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.  NO ASSURANCES ARE
     43  * PROVIDED BY THE COPYRIGHT HOLDERS THAT THE SOFTWARE DOES NOT INFRINGE
     44  * THE PATENT OR OTHER INTELLECTUAL PROPERTY RIGHTS OF ANY OTHER ENTITY.
     45  * EACH COPYRIGHT HOLDER DISCLAIMS ANY LIABILITY TO THE USER FOR CLAIMS
     46  * BROUGHT BY ANY OTHER ENTITY BASED ON INFRINGEMENT OF INTELLECTUAL
     47  * PROPERTY RIGHTS OR OTHERWISE.  AS A CONDITION TO EXERCISING THE RIGHTS
     48  * GRANTED HEREUNDER, EACH USER HEREBY ASSUMES SOLE RESPONSIBILITY TO SECURE
     49  * ANY OTHER INTELLECTUAL PROPERTY RIGHTS NEEDED, IF ANY.  THE SOFTWARE
     50  * IS NOT FAULT-TOLERANT AND IS NOT INTENDED FOR USE IN MISSION-CRITICAL
     51  * SYSTEMS, SUCH AS THOSE USED IN THE OPERATION OF NUCLEAR FACILITIES,
     52  * AIRCRAFT NAVIGATION OR COMMUNICATION SYSTEMS, AIR TRAFFIC CONTROL
     53  * SYSTEMS, DIRECT LIFE SUPPORT MACHINES, OR WEAPONS SYSTEMS, IN WHICH
     54  * THE FAILURE OF THE SOFTWARE OR SYSTEM COULD LEAD DIRECTLY TO DEATH,
     55  * PERSONAL INJURY, OR SEVERE PHYSICAL OR ENVIRONMENTAL DAMAGE ("HIGH
     56  * RISK ACTIVITIES").  THE COPYRIGHT HOLDERS SPECIFICALLY DISCLAIM ANY
     57  * EXPRESS OR IMPLIED WARRANTY OF FITNESS FOR HIGH RISK ACTIVITIES.
     58  *
     59  * __END_OF_JASPER_LICENSE__
     60  */
     61 
     62 /*
     63  * Tag-Value Parser Library
     64  *
     65  * $Id: jas_tvp.c,v 1.2 2008-05-26 09:40:52 vp153 Exp $
     66  */
     67 
     68 /******************************************************************************\
     69 * Includes.
     70 \******************************************************************************/
     71 
     72 #include <assert.h>
     73 #include <stdio.h>
     74 #include <ctype.h>
     75 #include <stdlib.h>
     76 
     77 #include "jasper/jas_malloc.h"
     78 #include "jasper/jas_string.h"
     79 #include "jasper/jas_tvp.h"
     80 
     81 /******************************************************************************\
     82 * Macros.
     83 \******************************************************************************/
     84 
     85 /* Is the specified character valid for a tag name? */
     86 #define	JAS_TVP_ISTAG(x) \
     87     (isalpha(x) || (x) == '_' || isdigit(x))
     88 
     89 /******************************************************************************\
     90 * Code for creating and destroying a tag-value parser.
     91 \******************************************************************************/
     92 
     93 jas_tvparser_t *jas_tvparser_create(const char *s)
     94 {
     95     jas_tvparser_t *tvp;
     96     if (!(tvp = jas_malloc(sizeof(jas_tvparser_t)))) {
     97         return 0;
     98     }
     99     if (!(tvp->buf = jas_strdup(s))) {
    100         jas_tvparser_destroy(tvp);
    101         return 0;
    102     }
    103     tvp->pos = tvp->buf;
    104     tvp->tag = 0;
    105     tvp->val = 0;
    106     return tvp;
    107 }
    108 
    109 void jas_tvparser_destroy(jas_tvparser_t *tvp)
    110 {
    111     if (tvp->buf) {
    112         jas_free(tvp->buf);
    113     }
    114     jas_free(tvp);
    115 }
    116 
    117 /******************************************************************************\
    118 * Main parsing code.
    119 \******************************************************************************/
    120 
    121 /* Get the next tag-value pair. */
    122 int jas_tvparser_next(jas_tvparser_t *tvp)
    123 {
    124     char *p;
    125     char *tag;
    126     char *val;
    127 
    128     /* Skip any leading whitespace. */
    129     p = tvp->pos;
    130     while (*p != '\0' && isspace(*p)) {
    131         ++p;
    132     }
    133 
    134     /* Has the end of the input data been reached? */
    135     if (*p == '\0') {
    136         /* No more tags are present. */
    137         tvp->pos = p;
    138         return 1;
    139     }
    140 
    141     /* Does the tag name begin with a valid character? */
    142     if (!JAS_TVP_ISTAG(*p)) {
    143         return -1;
    144     }
    145 
    146     /* Remember where the tag name begins. */
    147     tag = p;
    148 
    149     /* Find the end of the tag name. */
    150     while (*p != '\0' && JAS_TVP_ISTAG(*p)) {
    151         ++p;
    152     }
    153 
    154     /* Has the end of the input data been reached? */
    155     if (*p == '\0') {
    156         /* The value field is empty. */
    157         tvp->tag = tag;
    158         tvp->val = "";
    159         tvp->pos = p;
    160         return 0;
    161     }
    162 
    163     /* Is a value field not present? */
    164     if (*p != '=') {
    165         if (*p != '\0' && !isspace(*p)) {
    166             return -1;
    167         }
    168         *p++ = '\0';
    169         tvp->tag = tag;
    170         tvp->val = "";
    171         tvp->pos = p;
    172         return 0;
    173     }
    174 
    175     *p++ = '\0';
    176 
    177     val = p;
    178     while (*p != '\0' && !isspace(*p)) {
    179         ++p;
    180     }
    181 
    182     if (*p != '\0') {
    183         *p++ = '\0';
    184     }
    185 
    186     tvp->pos = p;
    187     tvp->tag = tag;
    188     tvp->val = val;
    189 
    190     return 0;
    191 }
    192 
    193 /******************************************************************************\
    194 * Code for querying the current tag/value.
    195 \******************************************************************************/
    196 
    197 /* Get the current tag. */
    198 char *jas_tvparser_gettag(jas_tvparser_t *tvp)
    199 {
    200     return tvp->tag;
    201 }
    202 
    203 /* Get the current value. */
    204 char *jas_tvparser_getval(jas_tvparser_t *tvp)
    205 {
    206     return tvp->val;
    207 }
    208 
    209 /******************************************************************************\
    210 * Miscellaneous code.
    211 \******************************************************************************/
    212 
    213 /* Lookup a tag by name. */
    214 jas_taginfo_t *jas_taginfos_lookup(jas_taginfo_t *taginfos, const char *name)
    215 {
    216     jas_taginfo_t *taginfo;
    217     taginfo = taginfos;
    218     while (taginfo->id >= 0) {
    219         if (!strcmp(taginfo->name, name)) {
    220             return taginfo;
    221         }
    222         ++taginfo;
    223     }
    224     return 0;
    225 }
    226 
    227 /* This function is simply for convenience. */
    228 /* One can avoid testing for the special case of a null pointer, by
    229   using this function.   This function never returns a null pointer.  */
    230 jas_taginfo_t *jas_taginfo_nonull(jas_taginfo_t *taginfo)
    231 {
    232     static jas_taginfo_t invalidtaginfo = {
    233         -1, 0
    234     };
    235 
    236     return taginfo ? taginfo : &invalidtaginfo;
    237 }
    238