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");