00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #include <stdlib.h>
00012 #include <stdio.h>
00013 #include <string.h>
00014 #include "libspopc.h"
00015
00016
00017
00018
00019
00020 char* nextline(char* string){
00021
00022
00023 while(((*string) != '\n')&&((*string) != '\0')){
00024 string++;
00025 }
00026 if(!(*string)){
00027 return (NULL);
00028 }
00029 return(string+1);
00030 }
00031
00032 char* retr2msg(char* data){
00033
00034
00035 char* msg=NULL;
00036 char* cur;
00037
00038 #ifdef EBUG
00039 fprintf(stderr,"<retr2msg>\n");
00040 #endif
00041 if((!data)||pop3_error(data)){
00042 return(NULL);
00043 }
00044 data=nextline(data);
00045 msg=(char*)malloc(strlen(data));
00046 if(!msg){
00047 #ifdef EBUG
00048 perror("retr2msg.malloc");
00049 #endif
00050 return(NULL);
00051 }
00052 cur=msg;
00053 while(*data){
00054 if(DOTBEGIN(data)){
00055 (*cur)=(*data);
00056 data+=2;
00057 cur++;
00058 }else{
00059 (*cur)=(*data);
00060 cur++;data++;
00061 }
00062 }
00063 (*(cur-2))='\0';
00064 #ifdef EBUG
00065 fprintf(stderr,"</retr2msg>\n");
00066 #endif
00067 return(msg);
00068 }
00069
00070 void freemsg(char* msg){
00071 free(msg);
00072 msg=NULL;
00073 }
00074
00075 int* list2array(char* poplist){
00076
00077
00078
00079 int* array=NULL;
00080 int l,s;
00081 int i=0;
00082 char* cur;
00083
00084 #ifdef EBUG
00085 fprintf(stderr,"<list2array>\n");
00086 #endif
00087 if((!poplist)||pop3_error(poplist)){
00088 return(NULL);
00089 }
00090 if(!dotline(poplist)){
00091
00092
00093
00094 for(cur=poplist;(*cur<'0')||(*cur>'9');cur++);
00095
00096 sscanf(cur,"%d %d\n",&i,&s);
00097 array=(int*)malloc((i+1)*sizeof(int));
00098 memset(array,0,(i+1)*sizeof(int));
00099 array[0]=i;
00100 array[i]=s;
00101 return(array);
00102 }
00103
00104
00105 for(cur=poplist;(*cur!='.')&&(*cur!='\n'); cur++);
00106 cur ++;
00107 l=1;
00108 while((*cur)!='.'){
00109 sscanf(cur,"%d %d\n",&i,&s);
00110 l++;
00111 array=(int*)realloc(array,l*sizeof(int));
00112 array[i]=s;
00113 cur=nextline(cur);
00114 }
00115 if(i){
00116 array[0]=i;
00117 }else{
00118 array=(int*)malloc(1*sizeof(int));
00119 array[0]=0;
00120 }
00121 #ifdef EBUG
00122 fprintf(stderr,"%d message(s)\n",i);
00123 fprintf(stderr,"</list2array>\n");
00124 #endif
00125 return(array);
00126 }
00127
00128 void freelistarray(int* array){
00129
00130 free(array);
00131 array=NULL;
00132 }
00133
00134 int listi2size(char* resp){
00135
00136 int i;
00137 int r;
00138
00139 if(pop3_error(resp)){
00140 return(0);
00141 }
00142 r=sscanf(resp+5,"%d\n",&i);
00143 if(!r){
00144 return(0);
00145 }
00146 return(i);
00147 }
00148
00149 int stat2last(char* resp){
00150
00151
00152 int n,s;
00153
00154 #ifdef EBUG
00155 fprintf(stderr,"<stat2last>\n");
00156 #endif
00157 if((!resp)||pop3_error(resp)){
00158 return(-1);
00159 }
00160 sscanf(resp+4,"%d %d\n",&n,&s);
00161 #ifdef EBUG
00162 fprintf(stderr,"last is %d\n",n);
00163 fprintf(stderr,"</stat2last>\n");
00164 #endif
00165 return(n);
00166 }
00167
00168 int stat2bytes(char* resp){
00169
00170
00171 int n,s;
00172
00173 #ifdef EBUG
00174 fprintf(stderr,"<stat2bytes>\n");
00175 #endif
00176 if((!resp)||pop3_error(resp)){
00177 return(-1);
00178 }
00179 sscanf(resp+4,"%d %d\n",&n,&s);
00180 #ifdef EBUG
00181 fprintf(stderr,"%d bytes stored\n",s);
00182 fprintf(stderr,"</stat2bytes>\n");
00183 #endif
00184 return(s);
00185 }
00186
00187 char** uidl2array(char* resp){
00188
00189
00190
00191 char** array=NULL;
00192 int l,i=0;
00193 char s[512];
00194 char* cur;
00195
00196 #ifdef EBUG
00197 fprintf(stderr,"<uidl2array>\n");
00198 #endif
00199 if((!resp)||pop3_error(resp)){
00200 return(NULL);
00201 }
00202 if(!dotline(resp)){
00203
00204
00205 #ifdef EBUG
00206 fprintf(stderr,"bad way of use of uidl2array()\n");
00207 #endif
00208
00209 for(cur=resp;(*cur<'0')||(*cur>'9');cur++);
00210
00211 sscanf(cur,"%d %s\n",&i,s);
00212 array=(char**)malloc((i+1)*sizeof(char*));
00213 memset(array,0,(i+1)*sizeof(char*));
00214 array[0]=(char*)malloc(512);
00215 sprintf(array[0],"%d",i);
00216 array[i]=strdup(s);
00217 return(array);
00218 }
00219
00220
00221 for(cur=resp;(*cur!='.')&&(*cur!='\n'); cur++);
00222 cur ++;
00223 l=1;
00224 while((*cur)!='.'){
00225 sscanf(cur,"%d %s\n",&i,s);
00226 l++;
00227 array=(char**)realloc(array,l*sizeof(char*));
00228 array[i]=(char*)malloc(512);
00229 array[i]=strncpy(array[i],s,512);
00230 cur=nextline(cur);
00231 }
00232 if(i){
00233 array[0]=(char*)malloc(4);
00234 sprintf(array[0],"%d",i);
00235
00236 }else{
00237 array=(char**)malloc(1*sizeof(char*));
00238 array[0]=(char*)malloc(2*sizeof(char));
00239 sprintf(array[0],"%d",0);
00240 }
00241 #ifdef EBUG
00242 fprintf(stderr,"%s signature(s)\n",array[0]);
00243 fprintf(stderr,"</uidl2array>\n");
00244 #endif
00245 return(array);
00246 }
00247
00248 void freeuidlarray(char** array){
00249
00250 int i,last;
00251 last= atoi(array[0]);
00252 for (i=1;i<=last;i++){
00253 free(array[i]);
00254 }
00255 free(array[0]);
00256 free(array);
00257 array=NULL;
00258 }
00259
00260 char* uidli2sig(char* resp){
00261
00262
00263 char* sig=NULL;
00264
00265 if(pop3_error(resp)){
00266 return(NULL);
00267 }
00268 sig=strdup(resp+5);
00269 if(sig[1]=='.'){
00270 free(sig);
00271 return(NULL);
00272 }
00273 return(sig);
00274 }
00275