=============================================================================== Cockatrice - CGI programming library for C language Copyright (C) 2000-2002 阿部康一/Kouichi ABE (WALL) kouichi@MysticWALL.COM =============================================================================== 『C 言語用 CGI プログラミングライブラリの使い方』 1. はじめに 本文書では、C 言語用 CGI プログラミングライブラリ Cockatrice の 使用方法について説明します。 インストールの方法などについては、README ファイルを御覧ください。 デフォルトでのインストールでは、必要なヘッダファイルとライブラリは、 /usr/local/include/cockatrice.h /usr/local/lib/libcgi.a /usr/local/lib/libcgi.so.1.0 にインストールされます。 2. 使用方法 2.1. 基本的な使用方法におけるソースコード #include #include int main(argc, argv) int argc; char * argv[]; { CGI * cgi; cgi = newCGI(HTML4_Strict); cgi->header("text/html"); cgi->html->html.begin(); cgi->html->head.begin(); cgi->html->title("WEB PAGE TITLE"); cgi->html->head.end(); cgi->html->body.begin(); ... cgi->html->body.end(); cgi->html->html.end(); cgi->done(); return 0; } 2.2. Cockatrice の使用 CGI * newCGI(dtd_t dtd); Cockatrice を使用するには、必ず newCGI() を呼び出します。 引数 dtd は HTML4 ドキュメントの次のいずれかの型を指定します。 HTML4_Strict HTML4_Transitional HTML4_Frameset 上記については、http://www.w3.org/TR/html401 を参照してください。 (例) int main() { CGI * cgi; ... cgi = newCGI(HTML4_Transitional); ... } 2.3. CGI パラメータの取得 String cgi->param(String); CGI パラメータの取得には、param() を使用します。 たとえば、次のようなフォームを考えます。 ...
Name: E-Mail: ...
上記フォームではパラメータとして、名前と電子メールアドレスを 記入してもらいます。 CGI ライブラリでは、次のようにしてパラメータを取得します。 cgi->param("name"); cgi->param("email"); つまり、input タグの name 属性で指定した名前を param() の引数として 取り出すことができます。この例では、POST メソッドを利用していますが、 GET メソッドでも同様の方法です。 cgi->param() の返す値は、文字列です。たとえば、 fprintf(stdout, "Input value: %s\n", cgi->param("email")); では、入力された電子メールアドレスが表示されます。 checkbox などの複数の選択値を使用するには VList * cgi->params(String); を利用します。たとえば、次のようなフォームを考えます。 ...
いちご
りんご
みかん
ぶどう
もも
なし
かき
...
上記フォームでは果物の名前を好きなだけ選択できます。 Cockatrice では、次のようにしてパラメータを取得します。 VList * vp; for (vp = cgi->params("fruits"); vp != NULL; vp = vp->next) { fprintf(stdout, "Fruit: %s\n", vp->value); } 2.4. Cookie の使用 2.4.1. パラメータの取得 String cgi->cookie(String); Cookie のパラメータ(NAME=VALUE)の取得には、cookie() を使います。 cgi->cookie("NAME") とすれば、NAME に設定された VALUE を文字列として 返します。 2.4.2. パラメータの設定 void cgi->setCookie.Name(String, String); void cgi->setCookie.Comment(String, String); void cgi->setCookie.Domain(String, String); void cgi->setCookie.MaxAge(String, unsigned int); void cgi->setCookie.Path(String, String); void cgi->setCookie.Secure(String, bool_t); Cookie の NAME=VALUE を設定するには、setCookie.Name() を使います。 (例)cgi->setCookie.Name("NAME", "阿部康一"); Cookie のコメントを設定するには、setCookie.Comment() を使います。 デフォルトは、コメントなしです。 (例)cgi->setCookie.Comment("NAME", "Cookie に関する説明"); Cookie のドメインを設定するには、setCookie.Domain() を使います。 デフォルトは、アクセスしたサーバのドメインになります。 (例)cgi->setCookie.Domain("NAME", "MysticWALL.COM"); Cookie の有効期限を設定するには、setCookie.MaxAge() を使います。 デフォルトは、即失効(つまり、キャッシュされない)になります。 引数は、秒です。以下の例は、10分間の有効期限を表します。 (例)cgi->setCookie.MaxAge("NAME", 600); Cookie の有効パスを設定するには、setCookie.Path() を使います。 デフォルトは、無指定(つまり、ブラウザにお任せ)になります。 (例)cgi->setCookie.Path("NAME", "/database"); Cookie が安全かを設定するには、setCookie.Secure() を使います。 デフォルトは、Non-Secure です。 (例)cgi->setCookie.Secure("NAME", TRUE); 2.5. セッション管理 Cockatrice では簡単なセッション管理機能を提供します。 2.5.1. セッション管理データベースのオープンとクローズ int cgi->session.openDB(const String); int cgi->session.closeDB(void); int cgi->session.openDB(const String); Cockatrice のセッション管理を利用するには、session.openDB() を 使ってデータベースを開きます。引数には、利用するデータベースの パス名を指定します。 データベースのオープンに成功した場合は 0 を、失敗した場合には -1 を返します。 int cgi->session.closeDB(void); 現在利用しているセッションデータベースを閉じます。 成功した場合には 0 を、失敗した場合には -1 を返します。 2.5.2. セッションの有効期間の設定 void cgi->session.setExpires(unsigned int); デフォルトの有効期間は20分です。有効期間を変更するには、 session.setExpires() を利用します。引数には、秒数での値を指定します。 引数に 0 を指定した場合は、デフォルトの有効期間になります。 2.5.3. セッションIDの生成 String cgi->session.generateID(void); String cgi->session.generateID1(const String); String cgi->session.generateID2(const String, const String); セッションIDを生成します。 session.generateID() は Cockatrice が自動的に生成します。 session.generateID1() は、文字列を引数として、それを元に生成します。 session.generateID2() は、2つの文字列を引数とします。 セッションID の生成に成功した場合は、セッションIDの文字列を 失敗した場合には NULL を返します。 2.5.4. セッションIDの検査 int cgi->session.validateID(const String); セッションIDが Cockatrice で生成された正当なセッションIDかどうか チェックするには、 session.validateID() を利用します。 正当なセッションID の場合は 0 を、期限が切れた場合は 1 を、 そうでない場合は -1 を返します。 2.5.5. セッションIDの削除 int cgi->session.deleteID(const String); 有効期間内にセッションIDを削除するには、session.deleteID() を 利用します。Cockatrice では、セッションの有効期間が切れた ID は 管理データベースから自動的に削除されます。 セッションIDの削除に成功した場合は 0 を、失敗した場合には -1 を 返します。 2.5.6. 有効なセッションIDのカウント int cgi->session.countValidID(void); 現時点で有効なセッションIDをカウントします。 戻り値には、成功した場合は有効なID数を、エラーの場合は -1 を返します。 2.6. アップロードファイルの操作 FORM の FILE タイプを利用したアップロードファイルの操作には、 upload.open()、upload.store()、upload.digest() を利用します。 2.6.1 アップロードファイルのオープン FILE * cgi->upload.open(String); アップロードされたファイルをオープンして、操作できます。 fclose() した場合は、その後のアクセスは不能となります。 成功した場合にはファイルポインタを、失敗した場合には NULL を返します。 2.6.2 アップロードファイルの保存 int cgi->upload.store(String, String); アップロードファイルを指定されたファイル名で保存します。 成功した場合には 0 を、失敗した場合には -1 を返します。 一般的な、ファイルアップロードのための HTML ファイルは、 以下のような構造となります。 ...
Name: E-Mail: File1: File2: ...
CGI プログラムでは、次のようにしてアップロードされたファイルに アクセスします。アップロードされたファイルを、保存するには、 次のようなコードを書きます。ただし、概要だけのコードです。 #include #include int main() { CGI * cgi; cgi = newCGI(HTML4_Strict); ... cgi->upload.store("fname1", "upload1.txt"); cgi->upload.store("fname2", "upload2.txt"); ... cgi->done(); ... return 0; } 2.6.3 アップロードファイルのダイジェスト(MD5/SHA1) String cgi->upload.digest(String, digest_t); アップロードファイルのダイジェストを計算します。 ファイルの整合性などの検査に利用できます。 digest_t には、DIGEST_MD5 か DIGEST_SHA1 を指定できます。 成功した場合には指定したアルゴリズムでのダイジェストの値を、 失敗した場合には NULL を返します。 2.7. 環境変数の取得 String cgi->getenv(String); 環境変数の取得には、getenv() を利用します。 (例)cgi->getenv("REMOTE_HOST"); また、ウェブサーバで設定される主な環境変数は、 次の関数によって取得可能です。 ただし、CGI スクリプト名だけは、cgi->script_name でもアクセスできます。 String cgi->env.server_software(); String cgi->env.server_name(); String cgi->env.gateway_interface(); String cgi->env.server_protocol(); unsigned int cgi->env.server_port(); String cgi->env.request_method(); String cgi->env.script_name(); String cgi->env.path_info(); String cgi->env.path_translated(); String cgi->env.remote_host(); String cgi->env.remote_addr(); unsigned int cgi->env.remote_port(); String cgi->env.auth_type(); String cgi->env.remote_user(); String cgi->env.remote_ident(); String cgi->env.accept(); String cgi->env.accept_encoding(); String cgi->env.accept_language(); String cgi->env.user_agent(); String cgi->env.referer(); String cgi->env.document_root(); String cgi->env.server_root(); String cgi->env.server_admin(); 2.8. レスポンスヘッダの送信 2.8.1. レスポンスヘッダの送信(データ送信) void cgi->header(const String); CGI ライブラリを利用して作成したデータを送信する場合は、 header() を利用します。Content-Type を引数に取ります。 (例)cgi->header("text/html"); Cookie が設定されている場合は、適切な HTTP ヘッダを生成して クライアントに送信します。 また、HTML 作成のための支援関数もあります。 4. 章で説明します。 2.8.2. リダイレクト void cgi->redirect(const String); URL を引数に取り、レスポンスコード 302 の応答で、 Location フィールドを返します。 (例)cgi->redirect("http://www.MysticWALL.COM/index-j.html"); 上記の出力は、 Status: 302 Moved[CRLF] Location: http://www.MysticWALL.COM/index-j.html[CRLF] [CRLF] となります。[CRLF] は明示的に表現しているだけです。 2.9. その他 2.9.1. ファイルのロック int cgi->util.lock(String); int cgi->util.unlock(String); 電子掲示板システムなどのような、ファイルの書き込みを排他制御する 必要がある CGI プログラムで、ファイルをロックしたい場合には、 util.lock() / util.unlock() を利用します。 util.lock() は、ロックに成功した場合に、0 を返します。 util.unlock() は、ロックの解除に成功した場合に、-1 を返します。 (例) cgi->util.lock("/home/kouichi/public_html/bbs.db"); cgi->util.unlock("/home/kouichi/public_html/bbs.db"); 2.9.2. URI のエスケープ/アンエスケープ String cgi->util.escapeURI(String); String cgi->util.unescapeURI(String); util.escapeURI() は、URI に用いることができない記号や日本語を %nn の形式にエンコードします。util.unescapeURI() は、 util.escapeURI() でエンコードされた文字列をデコードします。 例えば、"かべちゃん" は、"%A4%AB%A4%D9%A4%C1%A4%E3%A4%F3" に 変換されます。この例では、漢字コードは日本語 EUC コードです。 (例) cgi->util.escapeURI("かべちゃん"); cgi->util.unescapeURI("%A4%AB%A4%D9%A4%C1%A4%E3%A4%F3"); 2.9.3 文字列のダイジェスト(MD5/SHA1) String cgi->util.digest(String, digest_t); 文字列のダイジェストを計算します。 ダイジェストを利用したパスワードの整合性などの検査に利用できます。 digest_t には、DIGEST_MD5 か DIGEST_SHA1 を指定できます。 2.9.4. 日付と時刻 String cgi->date.today(void); int cgi->date.year(void); int cgi->date.month(void); int cgi->date.day(void); int cgi->date.wday(void); bool_t cgi->date.isFestival(int, int, int); int cgi->date.getWDay(int, int, int); String cgi->date.time(void); 現在の日付と時刻を取得するには、date.today() と date.time() を 利用します。 date.today() は、「2001/02/03(Sat)」の形式の日付を返します。 date.time() は、「23:58:10」の形式の時刻を返します。 (例) cgi->date.today(); cgi->date.time(); また、今日の西暦、月、日、曜日を取得するには、それぞれ date.year(), date.month(), date.day(), date.wday() を利用します。 今日が2002年4月7日(日)なら、 date.year() は「2002」を、 date.month() は「4」を、 date.day() は「7」を、date.wday() は 「0」を返します。 date.wday() で返される数値は、日曜日が「0」で土曜日が「6」です。 date.isFestival() は、西暦、月、日を引数に取り、祝日であれば TRUE を返します。違う場合は、FALSE を返します。 祝日は、2002年4月7日現在の日本国の祝日に限定されています。 date.getWDay() は、西暦、月、日を引数に取り、曜日を返します。 曜日は、日曜日が「0」で土曜日が「6」です。 2.9.5. 文字列検査 int cgi->check.empty(const String); int cgi->check.digit(const String); int cgi->check.alphabet(const String); int cgi->check.username(const String); int cgi->check.hostname(const String); int cgi->check.domainname(const String); int cgi->check.email(const String); int cgi->check.range(const String, int, int); int cgi->check.ipaddr(const String); int cgi->check.ipaddr2(const String); int cgi->check.ipaddr3(const String); int cgi->check.empty(const String); 引数の文字列が空かどうかチェックします。 空文字列の場合は 0 を、そうでない場合は -1 を返します。 int cgi->check.digit(const String); 引数の文字列が数字かどうかチェックします。 数字の場合は 0 を、そうでない場合は -1 を返します。 int cgi->check.alphabet(const String); 引数の文字列がアルファベットかどうかチェックします。 アルファベットの場合は 0 を、そうでない場合は -1 を返します。 int cgi->check.username(const String); 引数の文字列がユーザ名かどうかチェックします。 ユーザ名の場合は 0 を、そうでない場合は -1 を返します。 ユーザ名は '^[a-z][a-z0-9]+$' の正規表現にマッチする文字列です。 int cgi->check.hostname(const String); 引数の文字列がホスト名かどうかチェックします。 ホスト名の場合は 0 を、そうでない場合は -1 を返します。 ホスト名は '^[a-zA-Z][a-zA-Z0-9]+$' の正規表現にマッチする文字列です。 int cgi->check.domainname(const String); 引数の文字列がドメイン名かどうかチェックします。 ドメイン名の場合は 0 を、そうでない場合は -1 を返します。 ドメイン名は '^[a-zA-Z0-9][a-zA-Z0-9-.]*[a-zA-Z0-9]+$' の正規表現にマッチする文字列です。 int cgi->check.email(const String); 引数の文字列がメールアドレスかどうかチェックします。 メールアドレスの場合は 0 を、そうでない場合は -1 を返します。 メールアドレスは '^[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9]+@<ドメイン名>' の正規表現にマッチする文字列です。 int cgi->check.range(const String, int, int); cgi->check.range(param, 0, 100); のように使用し、引数 param が数字で、 かつその値が 0 〜 100 の間であるならば 0 を返します。 そうでない場合は、-1 を返します。 範囲の検査は、0 ≦ param ≦ 100 です。 int cgi->check.ipaddr(const String); 引数の文字列が IP アドレスかどうか調べます。IP アドレスの場合は 0 を、 そうでない場合は -1 を返します。 IP アドレスの形式は、aaa.bbb.ccc.ddd です。 int cgi->check.ipaddr2(const String); 引数の文字列がマスク長付き IP アドレスかどうか調べます。 マスク長付き IP アドレスの場合は 0 を、そうでない場合は -1 を返します。 マスク長付き IP アドレスの形式は、aaa.bbb.ccc.ddd/mm です。 int cgi->check.ipaddr3(const String); 引数の文字列がポート番号付き IP アドレスかどうか調べます。 ポート番号付き IP アドレスの場合は 0 を、そうでない場合は -1 を 返します。 ポート番号付き IP アドレスの形式は、aaa.bbb.ccc.ddd:pp です。 2.9.6. CGI ライブラリの使用終了 void cgi->done(void); CGI ライブラリの使用を終了するには、done() を呼び出します。 ライブラリの終了時には、必ず呼び出すようにしてください。 また、シグナルハンドラの実装の際には、そこで即終了する場合は 問題ないですが、プログラムの実行を継続する場合には、必ず呼び 出すようにしてください。 2.9.7. 一時作業ディレクトリ String cgi->tmpdir; CGI ライブラリを使用時に、一時的な作業ディレクトリを利用したい場合は、 tmpdir に設定されたディレクトリを利用できます。 cgi->tmpdir は、安全な一時作業ディレクトリを提供します。 3. CGI プログラムのコンパイル 基本的な使い方は、ソースコードに次の一行を書き、 #include コンパイル時に cgi と md ライブラリをリンクします。 漢字コード変換ライブラリ wkf を利用する場合は、 wkf ライブラリも一緒にリンクします。 例えば、環境変数の一覧表示プログラムの場合は、次のような ソースコードになります。ファイル名は、printenv.c とします。 #include #include #include int main(argc, argv, environ) int argc; char * argv[]; char * environ[]; { CGI * cgi; String key; String value; cgi = newCGI(HTML4_Transitional); cgi->header("text/html"); cgi->html->html.attr.lang = "ja"; cgi->html->html.begin(); cgi->html->head.begin(); cgi->html->title("Environment Variables"); cgi->html->head.end(); cgi->html->body.begin(); cgi->html->div.attr.trans.align = ALIGN_CENTER; cgi->html->div.begin(); cgi->html->table.attr.border = 1; cgi->html->table.begin(); while (*environ) { key = *environ++; value = (String)strchr(key, '='); if (value != NULL) { *value++ = EOL; } cgi->html->tr.begin(); cgi->html->td.begin(); cgi->html->print(key); cgi->html->td.end(); cgi->html->td.begin(); cgi->html->printe(value); cgi->html->td.end(); cgi->html->tr.end(); } cgi->html->table.end(); cgi->html->div.end(); cgi->html->body.end(); cgi->html->html.end(); cgi->done(); return 0; } 上記のソースコードのコンパイルは次のようにします。 '%' はシェルプロンプトです。 % gcc -o printenv.cgi -I/usr/local/include -L/usr/local/lib printenv.c -lcgi -lwkf -lmd コンパイル後の使用方法は、次のようになります。 % w3m http://localhost/cgi-bin/printenv.cgi 以下は、表示例です。 ┌──────────┬────────────────────┐ │PATH │/bin:/usr/bin:/usr/local/bin │ ├──────────┼────────────────────┤ │SERVER_SOFTWARE │Wyvern/2.0.8 │ ├──────────┼────────────────────┤ │GATEWAY_INTERFACE │CGI/1.1 │ ├──────────┼────────────────────┤ │SERVER_PROTOCOL │HTTP/1.0 │ ├──────────┼────────────────────┤ │SERVER_PORT │80 │ ├──────────┼────────────────────┤ │SERVER_ROOT │/usr/local/wyvern │ ├──────────┼────────────────────┤ │SERVER_NAME │swordfish.MysticWALL.COM │ ├──────────┼────────────────────┤ │SERVER_ADMIN │kouichi@MysticWALL.COM │ ├──────────┼────────────────────┤ │DOCUMENT_ROOT │/home/kouichi/MysticWALL │ ├──────────┼────────────────────┤ │REQUEST_METHOD │GET │ ├──────────┼────────────────────┤ │SCRIPT_NAME │/cgi-bin/printenv.cgi │ ├──────────┼────────────────────┤ │QUERY_STRING │ │ ├──────────┼────────────────────┤ │REMOTE_ADDR │::ffff:127.0.0.1 │ ├──────────┼────────────────────┤ │REMOTE_PORT │2379 │ ├──────────┼────────────────────┤ │AUTH_TYPE │Basic │ ├──────────┼────────────────────┤ │REMOTE_IDENT │kouichi │ ├──────────┼────────────────────┤ │HTTP_ACCEPT │text/*, image/*, video/*, application/* │ ├──────────┼────────────────────┤ │HTTP_ACCEPT_ENCODING│gzip, compress, bzip, bzip2, deflate │ ├──────────┼────────────────────┤ │HTTP_ACCEPT_LANGUAGE│ja │ ├──────────┼────────────────────┤ │HTTP_USER_AGENT │Mozilla/5.0 │ └──────────┴────────────────────┘ 4. HTML 作成支援関数 HTML 作成支援関数は HTML/4.01 に準拠しています。 newCGI() の引数に指定した DTD バージョンに応じて HTML 文書を出力します。 html->html.begin() HTML 文書の作成を開始します。 (例)cgi->html->html.begin(); 属性としては、lang が指定できます。 属性の初期化は、cgi->html->html.init() で行います。 (例)cgi->html->html.attr.lang = "ja"; 出力例 html->html.end() HTML 文書の作成を終了します。 (例)cgi->html->html.end(); html->head.begin() タグの作成を開始します。 (例)cgi->html->head.begin(); 属性としては、lang が指定できます。 属性の初期化は、cgi->html->head.init() で行います。 (例)cgi->html->head.attr.lang = "ja"; html->head.end() タグを終了します。 (例)cgi->html->head.end(); html->title(title) タグに指定する「タイトル」を引数に取ります。 (例)cgi->html->title("Cockatrice の使い方"); html->meta.name(name, content) <meta name="name" content="content"> タグを作成します。 html->meta.http_equiv(http_equiv, content) <meta http-equiv="name" content="content"> タグを作成します。 html->LINK; <link> タグを作成します。 属性としては、href, type, rel, rev, media, charset が指定できます。 属性の初期化は、cgi->html->link.init() で行います。 href := URI type := MIMEタイプ(text/css など) rel := LINK_NONE | LINK_ALTERNATE | LINK_STYLESHEET | LINK_START | LINK_NEXT | LINK_PREV | LINK_CONTENTS | LINK_INDEX | LINK_GLOSSARY | LINK_COPYRIGHT | LINK_CHAPTER | LINK_SECTION | LINK_SUBSECTION | LINK_APPENDIX | LINK_HELP | LINK_BOOKMARK rev := LINK_NONE | LINK_ALTERNATE | LINK_STYLESHEET | LINK_START | LINK_NEXT | LINK_PREV | LINK_CONTENTS | LINK_INDEX | LINK_GLOSSARY | LINK_COPYRIGHT | LINK_CHAPTER | LINK_SECTION | LINK_SUBSECTION | LINK_APPENDIX | LINK_HELP | LINK_BOOKMARK media:= MEDIA_NONE | MEDIA_ALL | MEDIA_AURAL | MEDIA_BRAILLE | MEDIA_EMBOSSED | MEDIA_HANDHELD | MEDIA_PRINT | MEDIA_PROJECTION | MEDIA_SCREEN | MEDIA_TTY | MEDIA_TV charset := EUC-JP など html->base(URI) <base> タグに指定する「URI」を引数に取ります。 (例)cgi->html->base("http://www.MysticWALL.COM/"); html->body.begin(); html->body.end(); ごめんなさい。 ここで力尽きたので、関数一覧を参照してください。 A. 関数一覧 CGI * newCGI(dtd_t); dtd_t := HTML4_Strict | HTML4_Transition | HTML4_Frameset String cgi->script_name; String cgi->tmpdir; String cgi->param(const String); VList * cgi->params(const String); String cgi->cookie(const String); String cgi->setCookie.Name(const String, const String); String cgi->setCookie.Comment(const String, const String); String cgi->setCookie.Domain(const String, const String); String cgi->setCookie.MaxAge(const String, unsigned int); String cgi->setCookie.Path(const String, const String); String cgi->setCookie.Secure(const String, bool_t); int cgi->session.changeDB(const String); void cgi->session.setExpires(unsigned int); String cgi->session.generateID(void); String cgi->session.generateID1(const String); String cgi->session.generateID2(const String, const String); int cgi->session.validateID(const String); int cgi->session.deleteID(const String); FILE * cgi->upload.open(const String); int cgi->upload.store(const String, const String); String cgi->upload.digest(const String, digest_t); digest_t := DIGEST_MD5 | DIGEST_SHA1 String cgi->getenv(const String); String cgi->env.server_software(void); String cgi->env.server_name(void); String cgi->env.gateway_interface(void); String cgi->env.server_protocol(void); unsignedi int cgi->env.server_port(void); String cgi->env.request_method(void); String cgi->env.script_name(void); String cgi->env.path_info(void); String cgi->env.path_translated(void); String cgi->env.remote_host(void); String cgi->env.remote_addr(void); unsigned int cgi->env.remote_port(void); String cgi->env.auth_type(void); String cgi->env.remote_user(void); String cgi->env.remote_ident(void); String cgi->env.accept(void); String cgi->env.accept_encoding(void); String cgi->env.accept_language(void); String cgi->env.user_agent(void); String cgi->env.referer(void); String cgi->env.document_root(void); String cgi->env.server_root(void); String cgi->env.server_admin(void); String cgi->util.lock(const String); String cgi->util.unlock(const String); String cgi->util.escape(const String); String cgi->util.unescape(const String); String cgi->util.digest(const String, digest_t); String cgi->date.today(void); int cgi->date.year(void); int cgi->date.month(void); int cgi->date.day(void); int cgi->date.wday(void); bool_t cgi->date.isFestival(int, int, int); int cgi->date.getWDay(int, int, int); String cgi->date.time(void); void cgi->done(void); void cgi->header(const String); void cgi->redirect(const String); void cgi->html->html.begin(void); void cgi->html->html.end(void); void cgi->html->html.attr.init(void); (*) String cgi->html->html.attr.lang; void cgi->html->head.begin(void); void cgi->html->head.end(void); (*) String cgi->html->head.attr.lang; void cgi->html->head.attr.init(void); void cgi->html->title(const String); void cgi->html->meta.name(const String, const String); void cgi->html->meta.http_equiv(const String, const String); (*) String cgi->html->meta.attr.lang; void cgi->html->meta.attr.init(void); void cgi->html->LINK; (*) String cgi->html->link.attr.href; (*) String cgi->html->link.attr.type; (*) link_t cgi->html->link.attr.rel; (*) link_t cgi->html->link.attr.rev; link_t := LINK_NONE | LINK_ALTERNATE | LINK_STYLESHEET | LINK_START | LINK_NEXT | LINK_PREV | LINK_CONTENTS | LINK_INDEX | LINK_GLOSSARY | LINK_COPYRIGHT | LINK_CHAPTER | LINK_SECTION | LINK_SUBSECTION | LINK_APPENDIX | LINK_HELP | LINK_BOOKMARK (*) media_t cgi->html->link.attr.media; media_t := MEDIA_NONE | MEDIA_ALL | MEDIA_AURAL | MEDIA_BRAILLE | MEDIA_EMBOSSED | MEDIA_HANDHELD | MEDIA_PRINT | MEDIA_PROJECTION | MEDIA_SCREEN | MEDIA_TTY | MEDIA_TV (*) String cgi->html->link.attr.charset; void cgi->html->link.attr.init(void); void cgi->html->base(const String); void cgi->html->style.begin(const String, media_t); void cgi->html->style.end(void); void cgi->html->body.begin(void); void cgi->html->body.end(void); (*) String cgi->html->body.attr.trans.background; (*) String cgi->html->body.attr.trans.bgcolor; (*) String cgi->html->body.attr.trans.text; (*) String cgi->html->body.attr.trans.link; (*) String cgi->html->body.attr.trans.vlink; (*) String cgi->html->body.attr.trans.alink; (*) String cgi->html->body.attr.id; (*) String cgi->html->body.attr.class; (*) String cgi->html->body.attr.lang; (*) String cgi->html->body.attr.title; (*) String cgi->html->body.attr.style; void cgi->html->body.init(void); void cgi->html->SPAN(const String); (*) align_t cgi->html->span.attr.trans.align; align_t := ALIGN_LEFT | ALIGN_CENTER | ALIGN_RIGHT | ALIGN_JUSTIFY; (*) String cgi->html->span.attr.id; (*) String cgi->html->span.attr.class; (*) String cgi->html->span.attr.lang; (*) String cgi->html->span.attr.title; (*) String cgi->html->span.attr.style; void cgi->html->span.init(void); void cgi->html->H1(const String); void cgi->html->H2(const String); void cgi->html->H3(const String); void cgi->html->H4(const String); void cgi->html->H5(const String); void cgi->html->H6(const String); (*) String cgi->html->h?.attr.id; (*) String cgi->html->h?.attr.class; (*) String cgi->html->h?.attr.lang; (*) String cgi->html->h?.attr.title; (*) String cgi->html->h?.attr.style; (*) align_t cgi->html->h?.attr.trans.align; align_t := ALIGN_LEFT | ALIGN_CENTER | ALIGN_RIGHT | ALIGN_JUSTIFY; void cgi->html->h?.init(void); void cgi->html->div.begin(void); void cgi->html->div.end(void); (*) align_t cgi->html->div.attr.trans.align; align_t := ALIGN_LEFT | ALIGN_CENTER | ALIGN_RIGHT | ALIGN_JUSTIFY; (*) String cgi->html->div.attr.id; (*) String cgi->html->div.attr.class; (*) String cgi->html->div.attr.lang; (*) String cgi->html->div.attr.title; (*) String cgi->html->div.attr.style; void cgi->html->div.init(void); void cgi->html->p.begin(void); void cgi->html->p.end(void); (*) align_t cgi->html->p.attr.trans.align; align_t := ALIGN_LEFT | ALIGN_CENTER | ALIGN_RIGHT | ALIGN_JUSTIFY; (*) String cgi->html->p.attr.id; (*) String cgi->html->p.attr.class; (*) String cgi->html->p.attr.lang; (*) String cgi->html->p.attr.title; (*) String cgi->html->p.attr.style; void cgi->html->p.init(void); void cgi->html->address.begin(void); void cgi->html->address.end(void); (*) String cgi->html->address.attr.id; (*) String cgi->html->address.attr.class; (*) String cgi->html->address.attr.lang; void cgi->html->address.init(void); void cgi->html->pre.begin(void); void cgi->html->pre.end(void); (*) String cgi->html->pre.attr.id; (*) String cgi->html->pre.attr.class; (*) String cgi->html->pre.attr.lang; (*) String cgi->html->pre.attr.title; (*) String cgi->html->pre.attr.style; void cgi->html->pre.init(void); void cgi->html->BR; (*) clear_t cgi->html->br.attr.trans.clear; clear_t := CLEAR_NONE | CLEAR_LEFT | CLEAR_RIGHT | CLEAR_ALL (*) String cgi->html->br.attr.id; (*) String cgi->html->br.attr.class; (*) String cgi->html->br.attr.title; (*) String cgi->html->br.attr.style; void cgi->html->br.init(void); void cgi->html->EM(const String); (*) String cgi->html->em.attr.id; (*) String cgi->html->em.attr.class; (*) String cgi->html->em.attr.lang; (*) String cgi->html->em.attr.title; (*) String cgi->html->em.attr.style; void cgi->html->em.init(void); void cgi->html->STRONG(const String); (*) String cgi->html->strong.attr.id; (*) String cgi->html->strong.attr.class; (*) String cgi->html->strong.attr.lang; (*) String cgi->html->strong.attr.title; (*) String cgi->html->strong.attr.style; void cgi->html->strong.init(void); void cgi->html->HR; (*) align_t cgi->html->hr.attr.trans.align; align_t := ALIGN_LEFT | ALIGN_CENTER | ALIGN_RIGHT (*) bool_t cgi->html->hr.attr.trans.noshade; (*) Pixels cgi->html->hr.attr.trans.size; (*) Length cgi->html->hr.attr.trans.width; (*) String cgi->html->hr.attr.id; (*) String cgi->html->hr.attr.class; (*) String cgi->html->hr.attr.title; (*) String cgi->html->hr.attr.style; void cgi->html->hr.init(void); void cgi->html->IMG(const String, const String, Length, Length); (*) align_t cgi->html->img.attr.trans.align; align_t := ALIGN_TOP | ALIGN_MIDDLE | ALIGN_BOTTOM | ALIGN_LEFT | ALIGN_RIGHT (*) Length cgi->html->img.attr.trans.border; (*) Pixels cgi->html->img.attr.trans.hspace; (*) Pixels cgi->html->img.attr.trans.vspace; (*) String cgi->html->img.attr.id; (*) String cgi->html->img.attr.class; (*) String cgi->html->img.attr.lang; (*) String cgi->html->img.attr.title; (*) String cgi->html->img.attr.style; void cgi->html->img.init(void); void cgi->html->ul.begin(void); void cgi->html->ul.end(void); (*) bullet_t cgi->html->ul.attr.trans.bullet; bullet_t := BULLET_DISC | BULLET_CIRCLE | BULLET_SQUARE (*) bool_t cgi->html->ul.attr.trans.compact; (*) String cgi->html->ul.attr.id; (*) String cgi->html->ul.attr.class; (*) String cgi->html->ul.attr.lang; (*) String cgi->html->ul.attr.title; (*) String cgi->html->ul.attr.style; void cgi->html->ul.init(void); void cgi->html->ol.begin(void); void cgi->html->ol.end(void); (*) numbering_t cgi->html->ol.attr.trans.numbering; numbering_t := NUMBERING_NONE | NUMBERING_ARABIC_NUMBER | NUMBERING_LOWER_ALPHA | NUMBERING_UPPER_ALPHA | NUMBERING_LOWER_ROMAN | NUMBERING_UPPER_ROMAN (*) int cgi->html->ol.attr.trans.start; (*) bool_t cgi->html->ol.attr.trans.compact; (*) String cgi->html->ol.attr.id; (*) String cgi->html->ol.attr.class; (*) String cgi->html->ol.attr.lang; (*) String cgi->html->ol.attr.title; (*) String cgi->html->ol.attr.style; void cgi->html->ol.init(void); void cgi->html->LI; void cgi->html->li.begin(void); void cgi->html->li.end(void); (*) style_t cgi->html->li.attr.trans.style; style_t := STYLE_DISC | STYLE_CIRCLE | STYLE_SQUARE | STYLE_NONE | STYLE_ARABIC_NUMBER | STYLE_LOWER_ALPHA | STYLE_UPPER_ALPHA | STYLE_LOWER_ROMAN | STYLE_UPPER_ROMAN (*) int cgi->html->li.attr.trans.value; (*) String cgi->html->li.attr.id; (*) String cgi->html->li.attr.class; (*) String cgi->html->li.attr.lang; (*) String cgi->html->li.attr.title; (*) String cgi->html->li.attr.style; void cgi->html->li.init(void); void cgi->html->table.begin(void); void cgi->html->table.end(void); (*) String cgi->html->table.attr.summary; (*) Length cgi->html->table.attr.width; (*) frame_t cgi->html->table.attr.frame; frame_t := FRAME_VOID | FRAME_ABOVE | FRAME_BELOW | FRAME_BESIDES | FRAME_LHS | FRAME_RHS | FRAME_VSIDES | FRAME_BOX | FRAME_BORDER (*) rules_t cgi->html->table.attr.rules; rules_t := RULES_NONE | RULES_GROUPS | RULES_ROWS | RULES_COLS | RULES_ALL (*) Pixels cgi->html->table.attr.border; (*) Length cgi->html->table.attr.cellspacing; (*) Length cgi->html->table.attr.cellpadding; (*) align_t cgi->html->table.attr.trans.align; align_t := ALIGN_LEFT | ALIGN_CENTER | ALIGN_RIGHT (*) String cgi->html->table.attr.trans.bgcolor; (*) String cgi->html->table.attr.id; (*) String cgi->html->table.attr.class; (*) String cgi->html->table.attr.lang; (*) String cgi->html->table.attr.title; (*) String cgi->html->table.attr.style; void cgi->html->table.init(void); void cgi->html->CAPTION(const String); (*) align_t cgi->html->caption.attr.trans.align; align_t := ALIGN_TOP | ALIGN_BOTTOM | ALIGN_LEFT | ALIGN_RIGHT (*) String cgi->html->caption.attr.id; (*) String cgi->html->caption.attr.class; (*) String cgi->html->caption.attr.lang; (*) String cgi->html->caption.attr.title; (*) String cgi->html->caption.attr.style; void cgi->html->caption.init(void); void cgi->html->tr.begin(void); void cgi->html->tr.end(void); (*) align_t cgi->html->tr.attr.align; align_t := ALIGN_LEFT | ALIGN_CENTER | ALIGN_RIGHT | ALIGN_JUSTIFY | ALIGN_CHAR (*) align_t cgi->html->tr.attr.valign; align_t := ALIGN_TOP | ALIGN_MIDDLE | ALIGN_BOTTOM | ALIGN_BASELINE (*) String cgi->html->tr.attr.Char; (*) Length cgi->html->tr.attr.charoff; (*) Length cgi->html->tr.attr.trans.bgcolor; (*) String cgi->html->tr.attr.id; (*) String cgi->html->tr.attr.class; (*) String cgi->html->tr.attr.lang; (*) String cgi->html->tr.attr.title; (*) String cgi->html->tr.attr.style; void cgi->html->tr.init(void); void cgi->html->th.begin(void); void cgi->html->th.end(void); (*) scope_t cgi->html->th.attr.scope; scope_t := SCOPE_ROW | SCOPE_COL | SCOPE_ROWGROUP | SCOPE_COLGROUP (*) String cgi->html->th.attr.abbr; (*) String cgi->html->th.attr.axis; (*) int cgi->html->th.attr.rowspan; (*) int cgi->html->th.attr.colspan; (*) align_t cgi->html->th.attr.align; align_t := ALIGN_LEFT | ALIGN_CENTER | ALIGN_RIGHT | ALIGN_JUSTIFY | ALIGN_CHAR (*) align_t cgi->html->th.attr.valign; align_t := ALIGN_TOP | ALIGN_MIDDLE | ALIGN_BOTTOM | ALIGN_BASELINE (*) String cgi->html->th.attr.Char; (*) Length cgi->html->th.attr.charoff; (*) bool_t cgi->html->th.attr.trans.nowrap; (*) Pixels cgi->html->th.attr.trans.width; (*) Pixels cgi->html->th.attr.trans.height; (*) String cgi->html->th.attr.trans.bgcolor; (*) String cgi->html->th.attr.id; (*) String cgi->html->th.attr.class; (*) String cgi->html->th.attr.lang; (*) String cgi->html->th.attr.title; (*) String cgi->html->th.attr.style; void cgi->html->th.init(void); void cgi->html->a.href(const String, const String); void cgi->html->a.name(const String, const String); (*) String cgi->html->a.attr.type; (*) link_t cgi->html->a.attr.rel; (*) link_t cgi->html->a.attr.rev; link_t := LINK_NONE | LINK_ALTERNATE | LINK_STYLESHEET | LINK_START | LINK_NEXT | LINK_PREV | LINK_CONTENTS | LINK_INDEX | LINK_GLOSSARY | LINK_COPYRIGHT | LINK_CHAPTER | LINK_SECTION | LINK_SUBSECTION | LINK_APPENDIX | LINK_HELP | LINK_BOOKMARK (*) String cgi->html->a.attr.target; (*) String cgi->html->a.attr.id; (*) String cgi->html->a.attr.class; (*) String cgi->html->a.attr.lang; (*) String cgi->html->a.attr.title; (*) String cgi->html->a.attr.style; void cgi->html->a.attr.init(void); void cgi->html->form.begin(const String, method_t); method_t := METHOD_GET | METHOD_POST void cgi->html->form.end(void); (*) String cgi->html->form.attr.id; (*) String cgi->html->form.attr.class; (*) String cgi->html->form.attr.lang; (*) String cgi->html->form.attr.title; (*) String cgi->html->form.attr.style; void cgi->html->form.attr.init(void); void cgi->html->multipart_form.begin(const String, method_t); method_t := METHOD_GET | METHOD_POST void cgi->html->multipart_form.end(void); (*) String cgi->html->multipart_form.attr.id; (*) String cgi->html->multipart_form.attr.class; (*) String cgi->html->multipart_form.attr.lang; (*) String cgi->html->multipart_form.attr.title; (*) String cgi->html->multipart_form.attr.style; void cgi->html->multipart_form.attr.init(void); void cgi->html->input.text(const String, const String, Pixels, Pixels); void cgi->html->input.password(const String, const String, Pixels, Pixels); void cgi->html->input.checkbox(const String, const String, bool_t); void cgi->html->input.radio(const String, const String, bool_t); void cgi->html->input.submit(const String, const String); void cgi->html->input.reset(const String, const String); void cgi->html->input.file(const String, const String, Pixels, Pixels); void cgi->html->input.hidden(const String, const String); void cgi->html->input.image(const String, const String, const String); void cgi->html->input.button(const String, const String); void cgi->html->input.end(void); (*) bool_t cgi->html->input.attr.readonly; (*) bool_t cgi->html->input.attr.disabled; (*) align_t cgi->html->input.attr.trans.align; align_t := ALIGN_TOP | ALIGN_MIDDLE | ALIGN_BOTTOM | ALIGN_LEFT | ALIGN_RIGHT (*) String cgi->html->input.attr.id; (*) String cgi->html->input.attr.class; (*) String cgi->html->input.attr.lang; (*) String cgi->html->input.attr.title; (*) String cgi->html->input.attr.style; void cgi->html->input.attr.init(void); void cgi->html->select.begin(const String, Pixels, bool_t); void cgi->html->select.end(void); (*) String cgi->html->select.attr.id; (*) String cgi->html->select.attr.class; (*) String cgi->html->select.attr.lang; (*) String cgi->html->select.attr.title; (*) String cgi->html->select.attr.style; void cgi->html->select.attr.init(void); void cgi->html->OPTION(const String, const String, bool_t); (*) String cgi->html->option.attr.label; (*) bool_t cgi->html->option.attr.disabled; (*) String cgi->html->option.attr.id; (*) String cgi->html->option.attr.class; (*) String cgi->html->option.attr.lang; (*) String cgi->html->option.attr.title; (*) String cgi->html->option.attr.style; void cgi->html->option.attr.init(void); void cgi->html->textarea.begin(const String, Number, Number); void cgi->html->textarea.end(void); (*) bool_t cgi->html->textarea.attr.readonly; (*) bool_t cgi->html->textarea.attr.disabled; (*) String cgi->html->textarea.attr.id; (*) String cgi->html->textarea.attr.class; (*) String cgi->html->textarea.attr.lang; (*) String cgi->html->textarea.attr.title; (*) String cgi->html->textarea.attr.style; void cgi->html->textarea.attr.init(void); # # Traditonal # void cgi->html->font(const String, const String, const String); void cgi->html->center.begin(void); void cgi->html->center.end(void); void cgi->html->iframe.begin(const String, Length, Length); void cgi->html->iframe.end(void); (*) scrolling_t cgi->html->iframe.attr.scrolling; scrolling_t := SCROLLING_AUTO | SCROLLING_YES | SCROLLING_NO (*) bool_t cgi->html->iframe.attr.frameborder; (*) Pixels cgi->html->iframe.attr.marginwidth; (*) Pixels cgi->html->iframe.attr.marginheight; (*) align_t cgi->html->iframe.attr.align; align_t := ALIGN_LEFT | ALIGN_CENTER | ALIGN_RIGHT | ALIGN_JUSTIFY void cgi->html->iframe.init(void); # # Frameset # void cgi->html->frameset.begin(Length, Length); void cgi->html->frameset.end(void); void cgi->html->FRAME(const String); (*) bool_t cgi->html->frame.attr.noresize; (*) scrolling_t cgi->html->frame.attr.scrolling; scrolling_t := SCROLLING_AUTO | SCROLLING_YES | SCROLLING_NO (*) bool_t cgi->html->frame.attr.frameborder; (*) Pixels cgi->html->frame.attr.marginwidth; (*) Pixels cgi->html->frame.attr.marginheight; void cgi->html->frame.init(void); void cgi->html->noframes.begin(void); void cgi->html->noframes.end(void); void cgi->html->print(const String); void cgi->html->printe(const String); void cgi->html->printf(const String, ...);