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