001 //http://dict.org/rfc2229.txt 002 U8 *NetReadLn(I64 sock) { 003 I64 cnt=0,ch=0,c; 004 U8 *tmp=StrNew(""),*tmp2; 005 F64 st=tS; 006 while(st+1.>tS) { 007 c=NetRead(sock,&ch,1); 008 if(c==1) { 009 if(ch=='\r') { 010 NetRead(sock,&ch,1); //Skip '\n'? 011 ret:; 012 return tmp; 013 } 014 again: 015 if(MSize(tmp)>cnt+1) { 016 tmp[cnt++]=ch; 017 tmp[cnt]=0; 018 } else { 019 tmp2=tmp; 020 tmp=MAlloc(MSize(tmp)*3); 021 MemCpy(tmp,tmp2,cnt+1); 022 Free(tmp2); 023 goto again; 024 } 025 } 026 else if(cnt) 027 goto ret; 028 Yield; 029 if(-1!=NetPollForHangup(1,&sock)) { 030 Free(tmp); 031 return NULL; 032 } 033 } 034 err: 035 if(cnt) goto ret; 036 Free(tmp); 037 return NULL; 038 } 039 U0 NetPrintLn(I64 sock,U8 *fmt,...) { 040 U8 *tmp=StrPrintJoin(NULL,fmt,argc,argv); 041 if(StrLen(tmp)) NetWrite(sock,tmp,StrLen(tmp)); 042 NetWrite(sock,"\r\n",2); 043 Free(tmp); 044 } 045 046 047 048 U8 *sqstring(U8 *ptr,U8 **en) { 049 U8 buf[1024]; 050 I64 ch=0; 051 if(en) *en=ptr; 052 if(*ptr!='\'') return NULL; 053 ptr++; 054 while(*ptr&&*ptr!='\'') { 055 if(*ptr=='\\') { 056 buf[ch++]=*ptr; 057 ptr+=2; 058 } else 059 buf[ch++]=*ptr++; 060 } 061 buf[ch]=0; 062 if(en) *en=ptr; 063 return StrNew(buf); 064 } 065 066 U8 *dqstring(U8 *ptr,U8 **en) { 067 U8 buf[1024]; 068 I64 ch=0; 069 if(en) *en=ptr; 070 if(*ptr!='"') return NULL; 071 ptr++; 072 while(*ptr&&*ptr!='"') { 073 if(*ptr=='\\') { 074 buf[ch++]=*ptr; 075 ptr+=2; 076 } else 077 buf[ch++]=*ptr++; 078 } 079 buf[ch]=0; 080 if(en) *en=ptr; 081 return StrNew(buf); 082 } 083 084 U8 *qout(U8 *ptr,U8 **en) { 085 U8 *ret; 086 if(en) *en=ptr; 087 if(*ptr!='\\') return NULL; 088 ret=CAlloc(2); 089 ret[0]=ptr[1]; 090 ptr+=2; 091 if(en) *en=ptr; 092 return ret; 093 } 094 095 U8 *word(U8 *ptr,U8 **en) { 096 U8 buf[1024]; 097 I64 ch=0; 098 if(en) *en=ptr; 099 if(!Bt(char_bmp_alpha_numeric,*ptr)) return NULL; 100 while(Bt(char_bmp_alpha_numeric,*ptr)) 101 buf[ch++]=*ptr++; 102 buf[ch]=0; 103 if(en) *en=ptr; 104 return StrNew(buf); 105 } 106 U8 *string(U8 *ptr,U8 **en) { 107 U8 cat[1024],*tmp; 108 cat[0]=0; 109 while(TRUE) { 110 if(tmp=sqstring(ptr,&ptr)) { 111 CatPrint(cat,"%s",tmp); 112 Free(tmp); 113 } else if(tmp=dqstring(ptr,&ptr)) { 114 CatPrint(cat,"%s",tmp); 115 Free(tmp); 116 } if(tmp=qout(ptr,&ptr)) { 117 CatPrint(cat,"%s",tmp); 118 Free(tmp); 119 } 120 121 } 122 } 123 124 U8 *text(U8 *ptr,U8 **en) { 125 U8 buf[1024],*ret; 126 buf[0]=0; 127 enter: 128 if(*ptr==' '||*ptr==9) { 129 ++ptr; 130 CatPrint(buf," "); 131 goto enter; 132 } else if(ret=string(ptr,&ptr)) { 133 CatPrint(buf,"%s",ret); 134 Free(ret); 135 } else if(ret=word(ptr,&ptr)) { 136 CatPrint(buf,"%s",ret); 137 Free(ret); 138 } else { 139 ret=StrNew(buf); 140 return ret; 141 } 142 goto enter; 143 } 144 //command = cmd-wor params* 145 //params = word 146 #define INV_COMMAND "500" 147 #define BAD_PARAM "501" 148 #define UNIMP_PARAM "502" 149 #define UNAVAIL "420" 150 #define END_OF_WORLD "421" 151 152 //This is sent on intiali connect, 220 text cpabilites msg-id 153 #define ALLOWED_IN "220" 154 //Use LstSub 155 U8 *GetDictEntry(U8 *str,U8 *server="199.48.130.6") { 156 CNetAddr *a=NetAddrNew(server,2628); 157 U8 word[1024],dict[1024],db[1024]; 158 U8 *ptr; 159 U8 *ln; 160 I64 len=0; 161 U8 *def=NULL,*tmp; 162 U64 state='Connect'; 163 I64 sock=NetSocketNew; 164 NetConnect(sock,a); 165 while(state) { 166 ln=NetReadLn(sock); 167 if(!ln) break; 168 if(state=='Connect') { 169 if(StrNCmp(ln,"220",3)) { 170 state=0; 171 } else { 172 state='DEFINE'; 173 NetPrintLn(sock,"DEFINE * %s",str); 174 } 175 } else if(state=='DEFINE') { 176 if(!StrNCmp(ln,"552",3)) { 177 def=NULL; 178 state=0; 179 } else if(!StrNCmp(ln,"150",3)) { 180 state='151'; 181 } 182 } else if(state=='151') { 183 if(!StrNCmp(ln,"151",3)) { 184 state='151'; 185 if(def) def[len++]=0; 186 ptr=StrFirstOcc(ln,":"); 187 if(ptr) { 188 ptr++; 189 add: 190 tmp=CAlloc(len+StrLen(ptr)+2); 191 if(len) 192 MemCpy(tmp,def,len); 193 StrCpy(tmp+len,ptr); 194 len+=StrLen(ptr); 195 Free(def); 196 def=tmp; 197 } 198 } else if(!StrNCmp(ln,"250",3)) { 199 //Definition complete 200 tmp[len]=0; 201 state=0; 202 } else { 203 ptr=ln; 204 goto add; 205 } 206 } 207 Free(ln); 208 } 209 NetPrintLn(sock,"QUIT"); 210 NetAddrDel(a); 211 NetClose(sock); 212 return def; 213 } 214 "%s\n",GetDictEntry("poop","dict.org");