--- /dev/null
+#include "ml-fetch.h"
+#include "ml.h"
+#include "mlenv.h"
+#include "motorenv.h"
+#include "motoroutput.h"
+#include "util_check.h"
+#include "util_string.h"
+#include "iconv_glue.h"
+#include "utf8.h"
+#include "expr.h"
+#include "ustring.h"
+#include <fetch.h>
+#include <iostream>
+
+/*DOC:
+==fetch==
+
+*/
+void MLFetch::clear () {
+ if (fetch) {
+ fetchFreeURL (fetch);
+ fetch = NULL;
+ }
+}
+
+void MLFetch::parseURL (const ustring& url) {
+ if (fetch)
+ clear ();
+ fetch = fetchParseURL (url.c_str ());
+}
+
+ustring MLFetch::queryString (MNode* e) {
+ ustring ans;
+ int c = 0;
+ MNode* a;
+
+ while (e) {
+ a = e->car ();
+ if (a) {
+ if (c > 0)
+ ans.append (uAmp);
+ ans.append (urlencode (cv (to_string (a->car ())))).append (uEq).append (urlencode (cv (to_string (a->cdr ()))));
+ }
+ nextNode (e);
+ }
+ return ans;
+}
+
+
+
+/*DOC:
+==$fetch==
+ ($fetch URL [#post] [#sjis] [:id STRING] [:password STRING | :pw STRING] [:query '((NAME. VALUE) ...)] [:cookie '((NAME . VALUE) ...)] [:header '((NAME . VALUE) ...)] [SUBFUNCTION...])
+
+*/
+//#MFUNC $fetch ml_fetch cMLFetchID
+MNode* ml_fetch (MNode* cell, MlEnv* mlenv) {
+ MNode* arg = cell->cdr ();
+ MLFetch obj (mlenv);
+ ustring url;
+ MNodePtr query;
+ std::vector<MNode*> params;
+ std::vector<MNode*> keywords;
+ MNode* rest;
+ MNodePtr ans;
+ static paramList kwlist[] = {
+ {CharConst ("query"), false},
+ {CharConst ("sjis"), true},
+ {NULL, 0, 0}
+ };
+
+ setParams (arg, 1, ¶ms, kwlist, &keywords, &rest);
+ url = eval_str (params[0], mlenv);
+ if (keywords[0]) // query
+ query = eval (keywords[4], mlenv);
+ if (keywords[1]) // sjis
+ obj.sjis = true;
+
+ obj.parseURL (url);
+
+ mlenv->setMStack (&obj);
+ ans = progn (rest, mlenv);
+ if (mlenv->breaksym ()
+ && (mlenv->breaksym ()->isNil () || eq (mlenv->breaksym (), cell->car ()))) {
+ mlenv->setBreaksym (NULL);
+ }
+
+ return mlenv->retval = ans ();
+}
+
+/*DOC:
+===subfunctions of $fetch===
+
+*/
+/*DOC:
+====http-response====
+ (http-response) -> STRING
+
+*/
+//#SFUNC http-response ml_fetch_http_response
+MNode* ml_fetch_http_response (MNode* cell, MlEnv* mlenv, MLFunc* mobj) {
+ MNode* arg = cell->cdr ();
+ MLFetch* obj = (MLFetch*)mobj;
+
+ if (obj->fetch) {
+ FILE* f;
+ ustring ans;
+ size_t s;
+ char b[65536];
+
+ f = fetchGet (obj->fetch, NULL);
+ if (f) {
+ while ((s = fread (b, 1, 65536, f)) > 0) {
+ ans.append (b, s);
+ }
+ fclose (f);
+ }
+ if (obj->sjis) {
+ iconv_t cd;
+ size_t isize, rsize, osize;
+ ustring ans2;
+ const char* p;
+ char* obuf;
+ char b[65536];
+
+ cd = iconv_open ("UTF-8", "SHIFT_JIS");
+ if (cd != ICONV_ERR) {
+ isize = ans.length ();
+ p = ans.begin ().base ();
+ while (isize > 0) {
+ obuf = b;
+ osize = 65536;
+#ifdef Linux
+ rsize = ::iconv (cd, (char**)&p, &isize, &obuf, &osize);
+#else
+ rsize = ::iconv (cd, &p, &isize, &obuf, &osize);
+#endif
+ if (obuf - b <= 0)
+ break;
+ ans2.append (b, obuf - b);
+ }
+ iconv_close (cd);
+ }
+ ans2 = fixUTF8 (ans2);
+ return newMNode_str (new ustring (ans2));
+ } else {
+ ans = fixUTF8 (ans);
+ return newMNode_str (new ustring (ans));
+ }
+ }
+
+ return NULL;
+}
+
+/*DOC:
+====http-response-file====
+ (http-response-file FILENAME) -> NIL
+
+*/
+//#SFUNC http-response-file ml_fetch_http_response_file
+MNode* ml_fetch_http_response_file (MNode* cell, MlEnv* mlenv, MLFunc* mobj) {
+ MNode* arg = cell->cdr ();
+ MLFetch* obj = (MLFetch*)mobj;
+
+ return NULL;
+}
+
+/*DOC:
+====http-response-output====
+ (http-response-output [#continue | :continue BOOL]) -> NIL
+
+*/
+//#SFUNC http-response-output ml_fetch_http_response_output
+MNode* ml_fetch_http_response_output (MNode* cell, MlEnv* mlenv, MLFunc* mobj) {
+ MNode* arg = cell->cdr ();
+ MLFetch* obj = (MLFetch*)mobj;
+ bool cflag = false;
+ std::vector<MNode*> params;
+ std::vector<MNode*> keywords;
+ static paramList kwlist[] = {
+ {CharConst ("continue"), true},
+ {NULL, 0, 0}
+ };
+
+ assert (0);
+
+ setParams (arg, 0, ¶ms, kwlist, &keywords, NULL);
+ if (keywords[0] && eval_bool (keywords[0], mlenv))
+ cflag = true;
+
+ if (! cflag)
+ mlenv->breakProg ();
+
+ if (obj->fetch) {
+ FILE* f;
+ ustring ans;
+ size_t s;
+ char b[65536];
+
+ f = fetchGet (obj->fetch, NULL);
+ if (f) {
+ while ((s = fread (b, 1, 65536, f)) > 0) {
+ ans.append (b, s);
+ }
+ fclose (f);
+ }
+ return newMNode_str (new ustring (ans));
+ }
+
+ return NULL;
+}
+++ /dev/null
-/*-
- * Copyright (c) 1990, 1993, 1994
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)db.h 8.7 (Berkeley) 6/16/94
- * $FreeBSD: src/include/db.h,v 1.5.36.1 2010/02/10 00:26:20 kensmith Exp $
- */
-
-#ifndef _DB_185_H_
-#define _DB_185_H_
-
-#include <sys/types.h>
-#include <sys/cdefs.h>
-
-#include <limits.h>
-
-#define RET_ERROR -1 /* Return values. */
-#define RET_SUCCESS 0
-#define RET_SPECIAL 1
-
-#define MAX_PAGE_NUMBER 0xffffffff /* >= # of pages in a file */
-typedef u_int32_t pgno_t;
-#define MAX_PAGE_OFFSET 65535 /* >= # of bytes in a page */
-typedef u_int16_t indx_t;
-#define MAX_REC_NUMBER 0xffffffff /* >= # of records in a tree */
-typedef u_int32_t recno_t;
-
-/* Key/data structure -- a Data-Base Thang. */
-typedef struct {
- void *data; /* data */
- size_t size; /* data length */
-} DBT1;
-
-/* Routine flags. */
-#define R_CURSOR 1 /* del, put, seq */
-#define __R_UNUSED 2 /* UNUSED */
-#define R_FIRST 3 /* seq */
-#define R_IAFTER 4 /* put (RECNO) */
-#define R_IBEFORE 5 /* put (RECNO) */
-#define R_LAST 6 /* seq (BTREE, RECNO) */
-#define R_NEXT 7 /* seq */
-#define R_NOOVERWRITE 8 /* put */
-#define R_PREV 9 /* seq (BTREE, RECNO) */
-#define R_SETCURSOR 10 /* put (RECNO) */
-#define R_RECNOSYNC 11 /* sync (RECNO) */
-
-typedef enum { DB1_BTREE, DB1_HASH, DB1_RECNO } DB1TYPE;
-
-/*
- * !!!
- * The following flags are included in the dbopen(3) call as part of the
- * open(2) flags. In order to avoid conflicts with the open flags, start
- * at the top of the 16 or 32-bit number space and work our way down. If
- * the open flags were significantly expanded in the future, it could be
- * a problem. Wish I'd left another flags word in the dbopen call.
- *
- * !!!
- * None of this stuff is implemented yet. The only reason that it's here
- * is so that the access methods can skip copying the key/data pair when
- * the DB_LOCK flag isn't set.
- */
-#if UINT_MAX > 65535
-#define DB_LOCK 0x20000000 /* Do locking. */
-#define DB_SHMEM 0x40000000 /* Use shared memory. */
-#define DB_TXN 0x80000000 /* Do transactions. */
-#else
-#define DB_LOCK 0x2000 /* Do locking. */
-#define DB_SHMEM 0x4000 /* Use shared memory. */
-#define DB_TXN 0x8000 /* Do transactions. */
-#endif
-
-/* Access method description structure. */
-typedef struct __db1 {
- DB1TYPE type; /* Underlying db type. */
- int (*close)(struct __db1 *);
- int (*del)(const struct __db1 *, const DBT1 *, u_int);
- int (*get)(const struct __db1 *, const DBT1 *, DBT1 *, u_int);
- int (*put)(const struct __db1 *, DBT1 *, const DBT1 *, u_int);
- int (*seq)(const struct __db1 *, DBT1 *, DBT1 *, u_int);
- int (*sync)(const struct __db1 *, u_int);
- void *internal; /* Access method private. */
- int (*fd)(const struct __db1 *);
-} DB1;
-
-#define BTREEMAGIC 0x053162
-#define BTREEVERSION 3
-
-/* Structure used to pass parameters to the btree routines. */
-typedef struct {
-#define R_DUP 0x01 /* duplicate keys */
- u_long flags;
- u_int cachesize; /* bytes to cache */
- int maxkeypage; /* maximum keys per page */
- int minkeypage; /* minimum keys per page */
- u_int psize; /* page size */
- int (*compare) /* comparison function */
- (const DBT1 *, const DBT1 *);
- size_t (*prefix) /* prefix function */
- (const DBT1 *, const DBT1 *);
- int lorder; /* byte order */
-} BTREE1INFO;
-
-#define HASHMAGIC 0x061561
-#define HASHVERSION 2
-
-/* Structure used to pass parameters to the hashing routines. */
-typedef struct {
- u_int bsize; /* bucket size */
- u_int ffactor; /* fill factor */
- u_int nelem; /* number of elements */
- u_int cachesize; /* bytes to cache */
- u_int32_t /* hash function */
- (*hash)(const void *, size_t);
- int lorder; /* byte order */
-} HASH1INFO;
-
-/* Structure used to pass parameters to the record routines. */
-typedef struct {
-#define R_FIXEDLEN 0x01 /* fixed-length records */
-#define R_NOKEY 0x02 /* key not required */
-#define R_SNAPSHOT 0x04 /* snapshot the input */
- u_long flags;
- u_int cachesize; /* bytes to cache */
- u_int psize; /* page size */
- int lorder; /* byte order */
- size_t reclen; /* record length (fixed-length records) */
- u_char bval; /* delimiting byte (variable-length records */
- char *bfname; /* btree file name */
-} RECNO1INFO;
-
-#ifdef __DBINTERFACE_PRIVATE
-/*
- * Little endian <==> big endian 32-bit swap macros.
- * M_32_SWAP swap a memory location
- * P_32_SWAP swap a referenced memory location
- * P_32_COPY swap from one location to another
- */
-#define M_32_SWAP(a) { \
- u_int32_t _tmp = a; \
- ((char *)&a)[0] = ((char *)&_tmp)[3]; \
- ((char *)&a)[1] = ((char *)&_tmp)[2]; \
- ((char *)&a)[2] = ((char *)&_tmp)[1]; \
- ((char *)&a)[3] = ((char *)&_tmp)[0]; \
-}
-#define P_32_SWAP(a) { \
- u_int32_t _tmp = *(u_int32_t *)a; \
- ((char *)a)[0] = ((char *)&_tmp)[3]; \
- ((char *)a)[1] = ((char *)&_tmp)[2]; \
- ((char *)a)[2] = ((char *)&_tmp)[1]; \
- ((char *)a)[3] = ((char *)&_tmp)[0]; \
-}
-#define P_32_COPY(a, b) { \
- ((char *)&(b))[0] = ((char *)&(a))[3]; \
- ((char *)&(b))[1] = ((char *)&(a))[2]; \
- ((char *)&(b))[2] = ((char *)&(a))[1]; \
- ((char *)&(b))[3] = ((char *)&(a))[0]; \
-}
-
-/*
- * Little endian <==> big endian 16-bit swap macros.
- * M_16_SWAP swap a memory location
- * P_16_SWAP swap a referenced memory location
- * P_16_COPY swap from one location to another
- */
-#define M_16_SWAP(a) { \
- u_int16_t _tmp = a; \
- ((char *)&a)[0] = ((char *)&_tmp)[1]; \
- ((char *)&a)[1] = ((char *)&_tmp)[0]; \
-}
-#define P_16_SWAP(a) { \
- u_int16_t _tmp = *(u_int16_t *)a; \
- ((char *)a)[0] = ((char *)&_tmp)[1]; \
- ((char *)a)[1] = ((char *)&_tmp)[0]; \
-}
-#define P_16_COPY(a, b) { \
- ((char *)&(b))[0] = ((char *)&(a))[1]; \
- ((char *)&(b))[1] = ((char *)&(a))[0]; \
-}
-#endif
-
-__BEGIN_DECLS
-DB1 *dbopen(const char *, int, int, DB1TYPE, const void *);
-
-#ifdef __DBINTERFACE_PRIVATE
-DB1 *__bt_open(const char *, int, int, const BTREE1INFO *, int);
-DB1 *__hash_open(const char *, int, int, const HASH1INFO *, int);
-DB1 *__rec_open(const char *, int, int, const RECNO1INFO *, int);
-void __dbpanic(DB1 *dbp);
-#endif
-__END_DECLS
-#endif /* !_DB_185_H_ */