| version 1.3, 2004/09/27 01:20:46 |
version 1.9, 2005/06/16 05:07:24 |
|
|
| /* $OpenXM: OpenXM/src/kan96xx/plugin/oxcgi.c,v 1.2 2004/09/24 08:35:47 takayama Exp $ */ |
/* $OpenXM: OpenXM/src/kan96xx/plugin/oxcgi.c,v 1.8 2005/02/27 05:28:06 takayama Exp $ */ |
| #include <stdio.h> |
#include <stdio.h> |
| #include "datatype.h" |
#include "datatype.h" |
| #include "stackm.h" |
#include "stackm.h" |
| Line 28 struct object cgiUrlEncodingToKeyValuePair(char *s) { |
|
| Line 28 struct object cgiUrlEncodingToKeyValuePair(char *s) { |
|
| int vstart,vend; /* start of value, end of value */ |
int vstart,vend; /* start of value, end of value */ |
| int state; |
int state; |
| int nOfPairs; |
int nOfPairs; |
| struct object rob; |
struct object rob = OINIT; |
| struct object ob; |
struct object ob = OINIT; |
| int k; |
int k; |
| n = strlen(s); start = -1; |
n = strlen(s); start = -1; |
| for (i=0; i<n; i++) { |
for (i=0; i<n; i++) { |
| if (s[i] == '?') { start=i+1; break;} |
if (s[i] == '?') { start=i+1; break;} |
| } |
} |
| |
if (start == -1) { |
| |
start = 0; |
| |
for (i=0; i<n; i++) { |
| |
if (s[i] > ' ') { start = i; break; } |
| |
} |
| |
} |
| for (k=0; k<2; k++) { |
for (k=0; k<2; k++) { |
| /* k==0 path one. Count nOfPairs. */ |
/* k==0 path one. Count nOfPairs. */ |
| /* k==1 path two. generate array. */ |
/* k==1 path two. generate array. */ |
| Line 174 struct object urlEncodedStringToObj(char *s,int vstart |
|
| Line 180 struct object urlEncodedStringToObj(char *s,int vstart |
|
| [ not implemented yet. ] |
[ not implemented yet. ] |
| */ |
*/ |
| { |
{ |
| struct object rob; |
struct object rob = OINIT; |
| char *ts; |
char *ts; |
| char *ts2; |
char *ts2; |
| int i,j; |
int i,j; |
| Line 235 static test1() { |
|
| Line 241 static test1() { |
|
| } |
} |
| static test2() { |
static test2() { |
| char s[1000]; |
char s[1000]; |
| struct object ob; |
struct object ob = OINIT; |
| ob=cgiUrlEncodingToKeyValuePair("http://hoge.hoge?name=1231232&hoge=asdfsdf&foo=asdfasdf"); |
ob=cgiUrlEncodingToKeyValuePair("http://hoge.hoge?name=1231232&hoge=asdfsdf&foo=asdfasdf"); |
| printObject(ob,1,stdout); |
printObject(ob,1,stdout); |
| ob=cgiUrlEncodingToKeyValuePair("http://hoge.hoge?name=1231232&hoge=&foo=asdfasdf&hoge=A%41+%42%62y%21"); |
ob=cgiUrlEncodingToKeyValuePair("http://hoge.hoge?name=1231232&hoge=&foo=asdfasdf&hoge=A%41+%42%62y%21"); |
| Line 247 static test2() { |
|
| Line 253 static test2() { |
|
| |
|
| static test4() { |
static test4() { |
| char s[1000]; |
char s[1000]; |
| struct object ob; |
struct object ob = OINIT; |
| char *ts; |
char *ts; |
| int size; |
int size; |
| ob=cgiUrlEncodingToKeyValuePair("http://hoge.hoge?name=1231232&hoge=&foo=asdfasdf&hoge=A%41+%42%62y%21"); |
ob=cgiUrlEncodingToKeyValuePair("http://hoge.hoge?name=1231232&hoge=&foo=asdfasdf&hoge=A%41+%42%62y%21"); |
| Line 277 char *cgiKeyValuePairToUrlEncoding(struct object ob) { |
|
| Line 283 char *cgiKeyValuePairToUrlEncoding(struct object ob) { |
|
| } |
} |
| int checkKeyValuePairFormat(struct object ob,char *msg) { |
int checkKeyValuePairFormat(struct object ob,char *msg) { |
| int i,n; |
int i,n; |
| struct object eob,eob0,eob1; |
struct object eob = OINIT; |
| |
struct object eob0 = OINIT; |
| |
struct object eob1 = OINIT; |
| static char *fmt = NULL; |
static char *fmt = NULL; |
| int size; |
int size; |
| char *ss; |
char *ss; |
| Line 303 int checkKeyValuePairFormat(struct object ob,char *msg |
|
| Line 311 int checkKeyValuePairFormat(struct object ob,char *msg |
|
| |
|
| int cgiKeyValuePairToUrlEncodingFile2(struct object ob,FILE2 *fp) { |
int cgiKeyValuePairToUrlEncodingFile2(struct object ob,FILE2 *fp) { |
| int n,i; |
int n,i; |
| struct object eob,eob0,eob1; |
struct object eob = OINIT; |
| |
struct object eob0 = OINIT; |
| |
struct object eob1 = OINIT; |
| char *key, *s; |
char *key, *s; |
| checkKeyValuePairFormat(ob,"cgiKeyValuePairToUrlEncodingFile2"); |
checkKeyValuePairFormat(ob,"cgiKeyValuePairToUrlEncodingFile2"); |
| n = getoaSize(ob); |
n = getoaSize(ob); |
| Line 311 int cgiKeyValuePairToUrlEncodingFile2(struct object ob |
|
| Line 321 int cgiKeyValuePairToUrlEncodingFile2(struct object ob |
|
| eob = getoa(ob,i); |
eob = getoa(ob,i); |
| eob0 = getoa(eob,0); eob1 = getoa(eob,1); |
eob0 = getoa(eob,0); eob1 = getoa(eob,1); |
| key = KopString(eob0); |
key = KopString(eob0); |
| if (i == 0) { |
if ((i == 0) && (strcmp(key,"URL")==0)) { |
| if (strcmp(key,"URL") != 0) warningKan("Key word should be URL.\n"); |
|
| if (eob1.tag != Sdollar) errorKan1("%s\n","URL value must be a string."); |
if (eob1.tag != Sdollar) errorKan1("%s\n","URL value must be a string."); |
| fp2fputs(KopString(eob1),fp); |
fp2fputs(KopString(eob1),fp); |
| if ( n > 1 ) fp2fputc('?',fp); |
if ( n > 1 ) fp2fputc('?',fp); |
| Line 335 int cgiKeyValuePairToUrlEncodingFile2(struct object ob |
|
| Line 344 int cgiKeyValuePairToUrlEncodingFile2(struct object ob |
|
| |
|
| static struct object rStringToObj(char *s,int vstart,int vend,int mode) { |
static struct object rStringToObj(char *s,int vstart,int vend,int mode) { |
| /* mode has not yet been used. */ |
/* mode has not yet been used. */ |
| struct object rob; |
struct object rob = OINIT; |
| char *sss; int i; |
char *sss; int i; |
| int bytearray; |
int bytearray; |
| bytearray=0; |
bytearray=0; |
| Line 367 struct object cgiHttpToKeyValuePair(char *s,int size) |
|
| Line 376 struct object cgiHttpToKeyValuePair(char *s,int size) |
|
| int ssize,i,j,k; |
int ssize,i,j,k; |
| int nOfPairs, startbody,state, kstart,kend,vstart, vend,startline,endline; |
int nOfPairs, startbody,state, kstart,kend,vstart, vend,startline,endline; |
| int nextstart,path; |
int nextstart,path; |
| struct object rob,ob; |
struct object rob = OINIT; |
| |
struct object ob = OINIT; |
| ssize = strlen(s); |
ssize = strlen(s); |
| nOfPairs = 0; startbody = -1; |
nOfPairs = 0; startbody = -1; |
| /* state==0 : readline and set startline and endline; state = 1; |
/* state==0 : readline and set startline and endline; state = 1; |
| Line 450 char *cgiKeyValuePairToHttp(struct object ob,int *size |
|
| Line 460 char *cgiKeyValuePairToHttp(struct object ob,int *size |
|
| |
|
| int cgiKeyValuePairToHttpFile2(struct object ob,FILE2 *fp) { |
int cgiKeyValuePairToHttpFile2(struct object ob,FILE2 *fp) { |
| int n,i; |
int n,i; |
| struct object eob,eob0,eob1; |
struct object eob = OINIT; |
| |
struct object eob0 = OINIT; |
| |
struct object eob1 = OINIT; |
| char *key, *s; |
char *key, *s; |
| checkKeyValuePairFormat(ob,"cgiKeyValuePairToHttpFile2"); |
checkKeyValuePairFormat(ob,"cgiKeyValuePairToHttpFile2"); |
| n = getoaSize(ob); |
n = getoaSize(ob); |
| Line 486 int cgiKeyValuePairToHttpFile2(struct object ob,FILE2 |
|
| Line 498 int cgiKeyValuePairToHttpFile2(struct object ob,FILE2 |
|
| |
|
| static test3() { |
static test3() { |
| char *s; |
char *s; |
| struct object ob; |
struct object ob = OINIT; |
| s = "Pragma: no-cache\nContent-Length: 2915\nContent-Type: text/html\nConnection: close\n\n <DIV class=Section1> \n <P class=MsoNormal \n style=\"mso-list: none; mso-list-ins: \" 19991102T2025\"> \n </P> "; |
s = "Pragma: no-cache\nContent-Length: 2915\nContent-Type: text/html\nConnection: close\n\n <DIV class=Section1> \n <P class=MsoNormal \n style=\"mso-list: none; mso-list-ins: \" 19991102T2025\"> \n </P> "; |
| |
|
| ob=cgiHttpToKeyValuePair(s,strlen(s)); |
ob=cgiHttpToKeyValuePair(s,strlen(s)); |
| Line 547 struct object KooUrlEncodedStringToObj(struct object s |
|
| Line 559 struct object KooUrlEncodedStringToObj(struct object s |
|
| n = getByteArraySize(sob); |
n = getByteArraySize(sob); |
| }else errorKan1("%s\n","KooUrlEncodedStringToObj: argument must be a string."); |
}else errorKan1("%s\n","KooUrlEncodedStringToObj: argument must be a string."); |
| return urlEncodedStringToObj(s,0,n-1,0); |
return urlEncodedStringToObj(s,0,n-1,0); |
| |
} |
| |
|
| |
static struct object toTokens(char *s,int *sep,int nsep) { |
| |
/* s is the input, and sep are the separators. */ |
| |
/* -1 means <=' ' are separators */ |
| |
int nOfTokens,n,i,done,k,start,sav; |
| |
struct object rob = OINIT; |
| |
char *t; |
| |
|
| |
rob = NullObject; |
| |
if (nsep < 1) return rob; |
| |
if (sep[0] != -1) { |
| |
fprintf(stderr,"cgiToTokens: Not implemeted for this separator.\n"); |
| |
return rob; |
| |
} |
| |
|
| |
/* Count the number of tokens */ |
| |
n = strlen(s); i = 0; nOfTokens=0; |
| |
while (i < n) { |
| |
done = 0; |
| |
while (s[i] <= ' ') { |
| |
i++; if (i >= n) { done=1; break;} |
| |
} |
| |
if (done==1) break; |
| |
nOfTokens++; |
| |
while (s[i] > ' ') { |
| |
i++; if (i >= n) { done=1; break; } |
| |
} |
| |
if (done == 1) break; |
| |
} |
| |
|
| |
rob = newObjectArray(nOfTokens); |
| |
n = strlen(s); i = 0; k = 0; |
| |
while (i < n) { |
| |
done = 0; |
| |
while (s[i] <= ' ') { |
| |
i++; if (i >= n) { done=1; break;} |
| |
} |
| |
if (done==1) break; |
| |
start = i; |
| |
while (s[i] > ' ') { |
| |
i++; if (i >= n) { done=1; break; } |
| |
} |
| |
t = (char *) GC_malloc(i-start+1); |
| |
if (t == NULL) { fprintf(stderr,"No more memory.\n"); exit(10); } |
| |
t[i-start] = 0; |
| |
strncpy(t,&(s[start]),i-start); |
| |
putoa(rob,k,KpoString(t)); |
| |
k++; |
| |
if (done == 1) break; |
| |
} |
| |
|
| |
return rob; |
| |
} |
| |
|
| |
struct object KooToTokens(struct object ob,struct object sep) { |
| |
char *s; |
| |
int n; |
| |
int tmp[1]; |
| |
tmp[0] = -1; |
| |
if (ob.tag == Sdollar) { |
| |
s = KopString(ob); |
| |
n = strlen((char *)s); |
| |
}else errorKan1("%s\n","KooToTokens: the first argument must be a string."); |
| |
if (sep.tag == Sarray) { |
| |
if (getoaSize(sep) != 0) { |
| |
errorKan1("%s\n","This separators have not been implemented."); |
| |
} |
| |
}else errorKan1("%s\n","KooToTokens: the second argument(separators) must be an array."); |
| |
return toTokens(s,tmp,1); |
| } |
} |