Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00027 #include "xode.h"
00028
00029 xode_pool xode_spool_getpool(const xode_spool s)
00030 {
00031 if(s == NULL)
00032 return NULL;
00033
00034 return s->p;
00035 }
00036
00037 int xode_spool_getlen(const xode_spool s)
00038 {
00039 if(s == NULL)
00040 return 0;
00041
00042 return s->len;
00043 }
00044
00045 void xode_spool_free(xode_spool s)
00046 {
00047 xode_pool_free(xode_spool_getpool(s));
00048 }
00049
00050 xode_spool xode_spool_newfrompool(xode_pool p)
00051 {
00052 xode_spool s;
00053
00054 s = xode_pool_malloc(p, sizeof(struct xode_spool_struct));
00055 s->p = p;
00056 s->len = 0;
00057 s->last = NULL;
00058 s->first = NULL;
00059 return s;
00060 }
00061
00062 xode_spool xode_spool_new(void)
00063 {
00064 return xode_spool_newfrompool(xode_pool_heap(512));
00065 }
00066
00067 void xode_spool_add(xode_spool s, char *str)
00068 {
00069 struct xode_spool_node *sn;
00070 int len;
00071
00072 if(str == NULL)
00073 return;
00074
00075 len = strlen(str);
00076 if(len == 0)
00077 return;
00078
00079 sn = xode_pool_malloc(s->p, sizeof(struct xode_spool_node));
00080 sn->c = xode_pool_strdup(s->p, str);
00081 sn->next = NULL;
00082
00083 s->len += len;
00084 if(s->last != NULL)
00085 s->last->next = sn;
00086 s->last = sn;
00087 if(s->first == NULL)
00088 s->first = sn;
00089 }
00090
00091 void xode_spooler(xode_spool s, ...)
00092 {
00093 va_list ap;
00094 char *arg = NULL;
00095
00096 if(s == NULL)
00097 return;
00098
00099 va_start(ap, s);
00100
00101
00102 while(1)
00103 {
00104 arg = va_arg(ap,char *);
00105 if((void*)arg == (void*)s || arg == NULL)
00106 break;
00107 else
00108 xode_spool_add(s, arg);
00109 }
00110
00111 va_end(ap);
00112 }
00113
00114 char *xode_spool_tostr(xode_spool s)
00115 {
00116 char *ret,*tmp;
00117 struct xode_spool_node *next;
00118
00119 if(s == NULL || s->len == 0 || s->first == NULL)
00120 return NULL;
00121
00122 ret = xode_pool_malloc(s->p, s->len + 1);
00123 *ret = '\0';
00124
00125 next = s->first;
00126 tmp = ret;
00127 while(next != NULL)
00128 {
00129 tmp = strcat(tmp,next->c);
00130 next = next->next;
00131 }
00132
00133 return ret;
00134 }
00135
00136
00137 char *xode_spool_str(xode_pool p, ...)
00138 {
00139 va_list ap;
00140 xode_spool s;
00141 char *arg = NULL;
00142
00143 if(p == NULL)
00144 return NULL;
00145
00146 s = xode_spool_newfrompool(p);
00147
00148 va_start(ap, p);
00149
00150
00151 while(1)
00152 {
00153 arg = va_arg(ap,char *);
00154 if((void*)arg == (void*)p)
00155 break;
00156 else
00157 xode_spool_add(s, arg);
00158 }
00159
00160 va_end(ap);
00161
00162 return xode_spool_tostr(s);
00163 }
00164
00165
00166 char *xode_strunescape(xode_pool p, char *buf)
00167 {
00168 int i,j=0;
00169 char *temp;
00170
00171 if (p == NULL || buf == NULL) return(NULL);
00172
00173 if (strchr(buf,'&') == NULL) return(buf);
00174
00175 temp = xode_pool_malloc(p,strlen(buf)+1);
00176
00177 if (temp == NULL) return(NULL);
00178
00179 for(i=0;i<strlen(buf);i++)
00180 {
00181 if (buf[i]=='&')
00182 {
00183 if (strncmp(&buf[i],"&",5)==0)
00184 {
00185 temp[j] = '&';
00186 i += 4;
00187 } else if (strncmp(&buf[i],""",6)==0) {
00188 temp[j] = '\"';
00189 i += 5;
00190 } else if (strncmp(&buf[i],"'",6)==0) {
00191 temp[j] = '\'';
00192 i += 5;
00193 } else if (strncmp(&buf[i],"<",4)==0) {
00194 temp[j] = '<';
00195 i += 3;
00196 } else if (strncmp(&buf[i],">",4)==0) {
00197 temp[j] = '>';
00198 i += 3;
00199 }
00200 } else {
00201 temp[j]=buf[i];
00202 }
00203 j++;
00204 }
00205 temp[j]='\0';
00206 return(temp);
00207 }
00208
00209
00210 char *xode_strescape(xode_pool p, char *buf)
00211 {
00212 int i,j,oldlen,newlen;
00213 char *temp;
00214
00215 if (p == NULL || buf == NULL) return(NULL);
00216
00217 oldlen = newlen = strlen(buf);
00218 for(i=0;i<oldlen;i++)
00219 {
00220 switch(buf[i])
00221 {
00222 case '&':
00223 newlen+=5;
00224 break;
00225 case '\'':
00226 newlen+=6;
00227 break;
00228 case '\"':
00229 newlen+=6;
00230 break;
00231 case '<':
00232 newlen+=4;
00233 break;
00234 case '>':
00235 newlen+=4;
00236 break;
00237 }
00238 }
00239
00240 if(oldlen == newlen) return buf;
00241
00242 temp = xode_pool_malloc(p,newlen+1);
00243
00244 if (temp==NULL) return(NULL);
00245
00246 for(i=j=0;i<oldlen;i++)
00247 {
00248 switch(buf[i])
00249 {
00250 case '&':
00251 memcpy(&temp[j],"&",5);
00252 j += 5;
00253 break;
00254 case '\'':
00255 memcpy(&temp[j],"'",6);
00256 j += 6;
00257 break;
00258 case '\"':
00259 memcpy(&temp[j],""",6);
00260 j += 6;
00261 break;
00262 case '<':
00263 memcpy(&temp[j],"<",4);
00264 j += 4;
00265 break;
00266 case '>':
00267 memcpy(&temp[j],">",4);
00268 j += 4;
00269 break;
00270 default:
00271 temp[j++] = buf[i];
00272 }
00273 }
00274 temp[j] = '\0';
00275 return temp;
00276 }