/* * ImapProxy - a caching IMAP proxy daemon * Copyright (C) 2002 Steven Van Acker * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * */ #include #include #include #include /* initialise */ int init_split_string(Split_string *p) { memset(p,0,sizeof(Split_string)); return 0; } /* make a split string, from a given string * the string will be split up in words * delim is a string with all the delimitors */ int make_split_string(char *buf,Split_string *x, char *delim) { char *p,*q,*newbuf; int i; p = buf; /* remove spaces to start with */ //while(*p == ' ') p++; while(*p && strchr(delim,*p)) p++; while(p) { /* if string ends here, don't add anything and bail out */ if(!*p) return 0; /* find the first space */ q = p; while(q && *q && !strchr(delim,*q)) q++; //q = strchr(p,' '); /* create some room */ x->numparts++; if(!(x->parts = (char **)realloc(x->parts,x->numparts * sizeof(char *)))) { debug("make_split_string(\"%s\",%p,\"%s\"): Out of memory.\n",buf,p,delim); return -1; } i = x->numparts - 1; if(q) { /* there are spaces behind the current word, so be carefull to not include them */ if(!(x->parts[i] = (char *)malloc(q - p + 1))) { debug("make_split_string(\"%s\",%p,\"%s\"): Out of memory.\n",buf,p,delim); return -1; } newbuf = x->parts[i]; strncpy(newbuf,p,q-p); newbuf[q-p] = '\0'; /* skip spaces again */ //while(*q == ' ') q++; while(*q && strchr(delim,*q)) q++; } else { /* no spaces after this word, meaning this is the last word */ if(!(x->parts[i] = strdup(p))) { debug("make_split_string(\"%s\",%p,\"%s\"): Out of memory.\n",buf,p,delim); return -1; } } p = q; } return 0; } /* same function as above, except that the string is cut off right before the first \r and \n */ int make_split_string_strip_crlf(char *buf,Split_string *p,char *delim) { char *q = NULL, *x = NULL; int ret = 0; q = strdup(buf); if(!q) { debug("make_split_string_strip_crlf(): Out of memory !\n"); return -1; } if((x = strchr(q,'\r'))) *x = '\0'; if((x = strchr(q,'\n'))) *x = '\0'; ret = make_split_string(q,p,delim); free(q); return ret; } /* delete the split string, and release the allocated space */ int delete_split_string(Split_string *p) { int i; if(!p->numparts) return 0; for(i = 0;i < p->numparts; i++) { free(p->parts[i]); } free(p->parts); p->parts = NULL; p->numparts = 0; return 0; } /* return the number of words */ int split_string_count_parts(Split_string *p) { return p->numparts; } /* return the i'th word, or NULL if i is out of range */ char *split_string_get(Split_string *p,int i) { if(i >= p->numparts || i < 0) return NULL; else return p->parts[i]; }