vx32

Local 9vx git repository for patches.
git clone git://r-36.net/vx32
Log | Files | 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 }