/* cgi.h 汎用CGIライブラリ copyright (c) 1999- TaraChan */ #if !defined(__CGI_H) #define __CGI_H #include #include #include #include "stringxx.h" #define CGI_H_EOF_CHR "-EOF-\n" #define CGI_H_BUFFER_SIZE 1024 #define CGI_H_N_BUF 64 typedef struct{ char *name; char *value; } hash; /*関数のプロトタイプ---------------------------------------------------------*/ char *get_form_strings(void); /*【フォームからのデータ入手】 GET、POST両方から文字列を受け取ります。 受け取る文字列の形式は、CGIの規則どおりです。(name1=value1&name2=value2&...) 戻り値は、受け取った文字列の先頭のポインタです。文字列が受け取れなかったときも、 空文字列の先頭ポインタを返します。失敗したときは、NULLを返します。 */ int value_count(char *inport); /*【要素数のカウント】 要素の個数('&'の数+1)を返します。 戻り値が要素の個数です。 */ int cut_string(char *inport,int len,hash hashs[],int *index); /*【CGIのデータを切る】 文字列inportを、「=」「&」で分割し、hashに格納(注意)します。 *indexには、ハッシュの要素数が入ります。 戻り値は、0です。 (注)inport内を指すポインタとして格納するので、inportを開放するとnameとvalueの 値は消えてしまいます。 */ int decode_string(char *inport,int len); /*【デコード】 inportの文字列のデコードを行います。 具体的には、「%xx」「+」の変換となります。 戻り値は、成功すると0、文字列が無いか、失敗したときは-1を返します。 */ int encode_string(unsigned char *in,char *out,int len); /*【エンコード】 inportの文字列のエンコードを行います。outは、inの約3倍の大きさが 必要です。 戻り値は、成功すると0、文字列が無いか、失敗したときは-1を返します。 */ char *get_value(char *input,hash hashs[],int index); /*【ハッシュの値の取得】 hashのvalue中でnameがindexと同じ物を返します。 戻り値は、対応するvalue[]の先頭のポインタとなります。 対応するものが無ければ、NULLを返します。 */ int read_conf(const char *conf_file,hash hashs[],int *o_index); /* 【コンフィグファイルから値を読み込む】 conf_fileをコンフィグファイルとして読み込みます。 hashに値を格納し、要素数は*o_indexに入ります。 戻り値は、要素数です。失敗したときは-1を返します。 文字列hash内の文字列はcallocで確保されるので、開放が必要です。 */ /*コンフィグファイルの書式===============================*/ /* name = "value" */ /* 又は */ /* name _= */ /* value (複数行可能) */ /* -EOF- (この行には空白などを含めないこと)*/ /* (-EOF-の後には改行が必須) */ /*=======================================================*/ void str_conv(char *s,char *out,hash hashs[],int index,int n); /* 【[name]をhashで展開】  []で囲まれた変数値を展開します。sは入力文字列、outは出力文字列、 ハッシュ,indexは変数と個数、nは出力の最大 文字数です。  戻り値はありません。 */ /*---------------------------------------------------------------------------*/ char *get_form_strings(void){ int len; char *clen; char *data; char *data2; char *string; clen=getenv("CONTENT_LENGTH"); if(clen==NULL){ ALLOC_STR (data,1,return(NULL)); data[0]='\0'; }else{ len=atol(clen); ALLOC_STR(data,len+1,return(NULL)); scanf("%s",data); data[len]='\0'; } if (getenv("QUERY_STRING")==NULL){ ALLOC_STR(data2,1,return(NULL)); data2[0]='\0'; }else{ len=strlen(getenv("QUERY_STRING")); /*再利用*/ ALLOC_STR(data2,len+1,return(NULL)); strcpy(data2,getenv("QUERY_STRING")); } ALLOC_STR(string,strlen(data)+strlen(data2)+2,return(NULL)); /* '\0'と'&'の分 */ strcpy(string,data); if (data[0]!='\0' && data2[0]!='\0') strcat(string,"&"); strcat(string,data2); free(data); free(data2); return string; } int value_count(char *inport){ int count=0; while (*inport!='\0'){ if (*(inport++)=='&') count++; } return count+1; } int cut_string(char *inport,int len,hash hashs[],int *index) { int i=0,cur_index=0; *index=0; if(inport[0]=='\0') {return -1;} hashs[0].name=inport; hashs[0].value=inport; /*初期化*/ while((inport[i]!='\0' && i='A') ? inport[i]-'A'+10 : inport[i]-'0'); buf*=16; buf+=((inport[++i]>='A') ? inport[i]-'A'+10 : inport[i]-'0'); s1[j]=buf; } for(i=0;ilen-1) break; c1=*in/16; c2=*in-c1*16; c1=((c1<10) ? '0'+c1 : 'A'-10+c1); c2=((c2<10) ? '0'+c2 : 'A'-10+c2); *(out++)='%'; *(out++)=c1; *(out++)=c2; in++; } *out='\0'; return(0); } char *get_value(char *input,hash hashs[],int index){ int i; for (i=0;i