xmpp/xode_str.c
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
00022
00023
00024
00025
00026
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 }