obsolete/jabber_k/xode_str.c

00001 /*
00002  * $Id$
00003  *
00004  *  This program is free software; you can redistribute it and/or modify
00005  *  it under the terms of the GNU General Public License as published by
00006  *  the Free Software Foundation; either version 2 of the License, or
00007  *  (at your option) any later version.
00008  *
00009  *  This program is distributed in the hope that it will be useful,
00010  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
00011  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00012  *  GNU General Public License for more details.
00013  *
00014  *  You should have received a copy of the GNU General Public License
00015  *  along with this program; if not, write to the Free Software
00016  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
00017  *
00018  *  Jabber
00019  *  Copyright (C) 1998-1999 The Jabber Team http://jabber.org/
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     /* loop till we hit our end flag, the first arg */
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 /* convenience :) */
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     /* loop till we hit our end flag, the first arg */
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],"&amp;",5)==0)
00179             {
00180                 temp[j] = '&';
00181                 i += 4;
00182             } else if (strncmp(&buf[i],"&quot;",6)==0) {
00183                 temp[j] = '\"';
00184                 i += 5;
00185             } else if (strncmp(&buf[i],"&apos;",6)==0) {
00186                 temp[j] = '\'';
00187                 i += 5;
00188             } else if (strncmp(&buf[i],"&lt;",4)==0) {
00189                 temp[j] = '<';
00190                 i += 3;
00191             } else if (strncmp(&buf[i],"&gt;",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],"&amp;",5);
00247             j += 5;
00248             break;
00249         case '\'':
00250             memcpy(&temp[j],"&apos;",6);
00251             j += 6;
00252             break;
00253         case '\"':
00254             memcpy(&temp[j],"&quot;",6);
00255             j += 6;
00256             break;
00257         case '<':
00258             memcpy(&temp[j],"&lt;",4);
00259             j += 4;
00260             break;
00261         case '>':
00262             memcpy(&temp[j],"&gt;",4);
00263             j += 4;
00264             break;
00265         default:
00266             temp[j++] = buf[i];
00267         }
00268     }
00269     temp[j] = '\0';
00270     return temp;
00271 }