jas_tvp.c - vx32 - Local 9vx git repository for patches.
 (HTM) git clone git://r-36.net/vx32
 (DIR) Log
 (DIR) Files
 (DIR) Refs
       ---
       jas_tvp.c (6925B)
       ---
            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) 1999-2000 Image Power, Inc.
           11  * Copyright (c) 1999-2000 The University of British Columbia
           12  * Copyright (c) 2001-2003 Michael David Adams
           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 1918 2005-07-24 14:12:08Z baford $
           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 }