diff --git a/qse/Makefile.in b/qse/Makefile.in index 38b76b61..5fa237b7 100644 --- a/qse/Makefile.in +++ b/qse/Makefile.in @@ -126,6 +126,7 @@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ +ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ diff --git a/qse/cmd/Makefile.in b/qse/cmd/Makefile.in index 2b9334d9..3e680825 100644 --- a/qse/cmd/Makefile.in +++ b/qse/cmd/Makefile.in @@ -111,6 +111,7 @@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ +ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ diff --git a/qse/cmd/awk/Makefile.in b/qse/cmd/awk/Makefile.in index 9eb971c3..9a30c4cc 100644 --- a/qse/cmd/awk/Makefile.in +++ b/qse/cmd/awk/Makefile.in @@ -98,6 +98,7 @@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ +ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ diff --git a/qse/cmd/cut/Makefile.in b/qse/cmd/cut/Makefile.in index 50957925..93bc1b1e 100644 --- a/qse/cmd/cut/Makefile.in +++ b/qse/cmd/cut/Makefile.in @@ -97,6 +97,7 @@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ +ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ diff --git a/qse/cmd/scm/Makefile.in b/qse/cmd/scm/Makefile.in index 99e40e64..1b2dfcae 100644 --- a/qse/cmd/scm/Makefile.in +++ b/qse/cmd/scm/Makefile.in @@ -98,6 +98,7 @@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ +ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ diff --git a/qse/cmd/scm/scm.c b/qse/cmd/scm/scm.c index 7fec90fc..bed4d18a 100644 --- a/qse/cmd/scm/scm.c +++ b/qse/cmd/scm/scm.c @@ -148,6 +148,7 @@ int scm_main (int argc, qse_char_t* argv[]) qse_scm_t* scm; qse_scm_obj_t* obj; + QSE_ASSERT (0 == 1); if (handle_args (argc, argv) == -1) return -1; scm = qse_scm_open (QSE_NULL, 0, opt_memsize, opt_meminc); diff --git a/qse/cmd/sed/Makefile.in b/qse/cmd/sed/Makefile.in index eacec081..288f90f2 100644 --- a/qse/cmd/sed/Makefile.in +++ b/qse/cmd/sed/Makefile.in @@ -97,6 +97,7 @@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ +ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ diff --git a/qse/configure b/qse/configure index a0af810f..5466ec75 100755 --- a/qse/configure +++ b/qse/configure @@ -792,6 +792,7 @@ build_vendor build_cpu build LIBTOOL +ECHO TRUE RMDIR RM @@ -5046,6 +5047,98 @@ else TRUE="$ac_cv_prog_TRUE" fi +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}echo", so it can be a program name with args. +set dummy ${ac_tool_prefix}echo; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ECHO+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ECHO"; then + ac_cv_prog_ECHO="$ECHO" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ECHO="${ac_tool_prefix}echo" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ECHO=$ac_cv_prog_ECHO +if test -n "$ECHO"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ECHO" >&5 +$as_echo "$ECHO" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_ECHO"; then + ac_ct_ECHO=$ECHO + # Extract the first word of "echo", so it can be a program name with args. +set dummy echo; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_ECHO+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_ECHO"; then + ac_cv_prog_ac_ct_ECHO="$ac_ct_ECHO" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_ECHO="echo" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_ECHO=$ac_cv_prog_ac_ct_ECHO +if test -n "$ac_ct_ECHO"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_ECHO" >&5 +$as_echo "$ac_ct_ECHO" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_ECHO" = x; then + ECHO="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + ECHO=$ac_ct_ECHO + fi +else + ECHO="$ac_cv_prog_ECHO" +fi + RM="$RM -f" @@ -5599,13 +5692,13 @@ if test "${lt_cv_nm_interface+set}" = set; then : else lt_cv_nm_interface="BSD nm" echo "int some_variable = 0;" > conftest.$ac_ext - (eval echo "\"\$as_me:5602: $ac_compile\"" >&5) + (eval echo "\"\$as_me:5695: $ac_compile\"" >&5) (eval "$ac_compile" 2>conftest.err) cat conftest.err >&5 - (eval echo "\"\$as_me:5605: $NM \\\"conftest.$ac_objext\\\"\"" >&5) + (eval echo "\"\$as_me:5698: $NM \\\"conftest.$ac_objext\\\"\"" >&5) (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) cat conftest.err >&5 - (eval echo "\"\$as_me:5608: output\"" >&5) + (eval echo "\"\$as_me:5701: output\"" >&5) cat conftest.out >&5 if $GREP 'External.*some_variable' conftest.out > /dev/null; then lt_cv_nm_interface="MS dumpbin" @@ -6800,7 +6893,7 @@ ia64-*-hpux*) ;; *-*-irix6*) # Find out which ABI we are using. - echo '#line 6803 "configure"' > conftest.$ac_ext + echo '#line 6896 "configure"' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? @@ -8856,11 +8949,11 @@ else -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:8859: $lt_compile\"" >&5) + (eval echo "\"\$as_me:8952: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:8863: \$? = $ac_status" >&5 + echo "$as_me:8956: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. @@ -9195,11 +9288,11 @@ else -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:9198: $lt_compile\"" >&5) + (eval echo "\"\$as_me:9291: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:9202: \$? = $ac_status" >&5 + echo "$as_me:9295: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. @@ -9300,11 +9393,11 @@ else -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:9303: $lt_compile\"" >&5) + (eval echo "\"\$as_me:9396: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 - echo "$as_me:9307: \$? = $ac_status" >&5 + echo "$as_me:9400: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized @@ -9355,11 +9448,11 @@ else -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:9358: $lt_compile\"" >&5) + (eval echo "\"\$as_me:9451: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 - echo "$as_me:9362: \$? = $ac_status" >&5 + echo "$as_me:9455: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized @@ -11739,7 +11832,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF -#line 11742 "configure" +#line 11835 "configure" #include "confdefs.h" #if HAVE_DLFCN_H @@ -11835,7 +11928,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF -#line 11838 "configure" +#line 11931 "configure" #include "confdefs.h" #if HAVE_DLFCN_H @@ -13791,11 +13884,11 @@ else -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:13794: $lt_compile\"" >&5) + (eval echo "\"\$as_me:13887: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:13798: \$? = $ac_status" >&5 + echo "$as_me:13891: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. @@ -13890,11 +13983,11 @@ else -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:13893: $lt_compile\"" >&5) + (eval echo "\"\$as_me:13986: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 - echo "$as_me:13897: \$? = $ac_status" >&5 + echo "$as_me:13990: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized @@ -13942,11 +14035,11 @@ else -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:13945: $lt_compile\"" >&5) + (eval echo "\"\$as_me:14038: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 - echo "$as_me:13949: \$? = $ac_status" >&5 + echo "$as_me:14042: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized diff --git a/qse/configure.ac b/qse/configure.ac index 83b3f9af..7283553e 100644 --- a/qse/configure.ac +++ b/qse/configure.ac @@ -30,6 +30,7 @@ dnl check other tools AC_CHECK_TOOL(RM, rm) AC_CHECK_TOOL(RMDIR, rmdir) AC_CHECK_TOOL(TRUE, true) +AC_CHECK_TOOL(ECHO, echo) dnl avoid "'/bin/rm: cannot remove `libtoolT': No such file or directory" RM="$RM -f" diff --git a/qse/doc/Makefile.in b/qse/doc/Makefile.in index 83f860b5..dfa5754d 100644 --- a/qse/doc/Makefile.in +++ b/qse/doc/Makefile.in @@ -115,6 +115,7 @@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ +ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ diff --git a/qse/doc/page/Makefile.in b/qse/doc/page/Makefile.in index fb8ef9df..a73d6f44 100644 --- a/qse/doc/page/Makefile.in +++ b/qse/doc/page/Makefile.in @@ -74,6 +74,7 @@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ +ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ diff --git a/qse/include/Makefile.in b/qse/include/Makefile.in index 2703eabf..57efce2a 100644 --- a/qse/include/Makefile.in +++ b/qse/include/Makefile.in @@ -112,6 +112,7 @@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ +ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ diff --git a/qse/include/qse/Makefile.in b/qse/include/qse/Makefile.in index 6e21e968..65fa35d5 100644 --- a/qse/include/qse/Makefile.in +++ b/qse/include/qse/Makefile.in @@ -140,6 +140,7 @@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ +ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ diff --git a/qse/include/qse/awk/Makefile.in b/qse/include/qse/awk/Makefile.in index caa63fde..94cd2739 100644 --- a/qse/include/qse/awk/Makefile.in +++ b/qse/include/qse/awk/Makefile.in @@ -101,6 +101,7 @@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ +ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ diff --git a/qse/include/qse/cmn/Makefile.in b/qse/include/qse/cmn/Makefile.in index c3003822..c898bb62 100644 --- a/qse/include/qse/cmn/Makefile.in +++ b/qse/include/qse/cmn/Makefile.in @@ -104,6 +104,7 @@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ +ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ diff --git a/qse/include/qse/cut/Makefile.in b/qse/include/qse/cut/Makefile.in index e1092e6a..2780b0ea 100644 --- a/qse/include/qse/cut/Makefile.in +++ b/qse/include/qse/cut/Makefile.in @@ -101,6 +101,7 @@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ +ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ diff --git a/qse/include/qse/http/Makefile.in b/qse/include/qse/http/Makefile.in index ef4cb4eb..d583894a 100644 --- a/qse/include/qse/http/Makefile.in +++ b/qse/include/qse/http/Makefile.in @@ -99,6 +99,7 @@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ +ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ diff --git a/qse/include/qse/http/http.h b/qse/include/qse/http/http.h index b9582aaf..e5c59365 100644 --- a/qse/include/qse/http/http.h +++ b/qse/include/qse/http/http.h @@ -87,8 +87,23 @@ struct qse_http_req_t qse_http_octb_t con; }; +#if 0 +struct qse_http_rep_node_t +{ + int type; /* TEXT, RESOURCE */ + qse_http_req_node_t* next; +}; + +typedef struct qse_http_rep_t qse_http_rep_t; + +struct qse_http_rep_t +{ +}; +#endif + typedef struct qse_http_reqcbs_t qse_http_reqcbs_t; + struct qse_http_reqcbs_t { int (*request) (qse_http_t* http, qse_http_req_t* req); @@ -122,8 +137,9 @@ struct qse_http_t /* buffers needed to for processing a request */ struct { - qse_http_octb_t raw; - qse_http_octb_t tra; + qse_http_octb_t raw; /* buffer to hold raw octets */ + qse_http_octb_t tra; /* buffer for handling trailers */ + qse_http_octb_t pen; /* buffer for raw octets during pending period */ } b; /* points to the head of the combined header list */ diff --git a/qse/include/qse/scm/Makefile.in b/qse/include/qse/scm/Makefile.in index 8cd30938..8ef8c136 100644 --- a/qse/include/qse/scm/Makefile.in +++ b/qse/include/qse/scm/Makefile.in @@ -99,6 +99,7 @@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ +ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ diff --git a/qse/include/qse/sed/Makefile.in b/qse/include/qse/sed/Makefile.in index a81f4fa8..bda0ff88 100644 --- a/qse/include/qse/sed/Makefile.in +++ b/qse/include/qse/sed/Makefile.in @@ -101,6 +101,7 @@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ +ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ diff --git a/qse/lib/Makefile.in b/qse/lib/Makefile.in index 46ddb490..9486cc04 100644 --- a/qse/lib/Makefile.in +++ b/qse/lib/Makefile.in @@ -111,6 +111,7 @@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ +ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ diff --git a/qse/lib/awk/Makefile.in b/qse/lib/awk/Makefile.in index 4ee32c97..fa5312fb 100644 --- a/qse/lib/awk/Makefile.in +++ b/qse/lib/awk/Makefile.in @@ -138,6 +138,7 @@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ +ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ diff --git a/qse/lib/cmn/Makefile.in b/qse/lib/cmn/Makefile.in index c5e7adea..1f822a4e 100644 --- a/qse/lib/cmn/Makefile.in +++ b/qse/lib/cmn/Makefile.in @@ -140,6 +140,7 @@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ +ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ diff --git a/qse/lib/cmn/assert.c b/qse/lib/cmn/assert.c index ffd9ef42..84e5d6c2 100644 --- a/qse/lib/cmn/assert.c +++ b/qse/lib/cmn/assert.c @@ -90,6 +90,20 @@ void qse_assert_failed ( qse_sio_puts (QSE_SIO_ERR, QSE_T("=[ASSERTION FAILURE]============================================================\n")); +#if 1 + qse_sio_puts (QSE_SIO_ERR, QSE_T(" __ \n")); + qse_sio_puts (QSE_SIO_ERR, QSE_T(" _____ _____ _____ _____| |\n")); + qse_sio_puts (QSE_SIO_ERR, QSE_T("| | | _ | __| |\n")); + qse_sio_puts (QSE_SIO_ERR, QSE_T("| | | | | __|__ |__|\n")); + qse_sio_puts (QSE_SIO_ERR, QSE_T("|_____|_____|__| |_____|__|\n")); +#else + qse_sio_puts (QSE_SIO_ERR, QSE_T(" __ \n")); + qse_sio_puts (QSE_SIO_ERR, QSE_T(" _____ _____ _____ _____ | |\n")); + qse_sio_puts (QSE_SIO_ERR, QSE_T("| | | _ | __| | |\n")); + qse_sio_puts (QSE_SIO_ERR, QSE_T("| | | | | __|__ | |__|\n")); + qse_sio_puts (QSE_SIO_ERR, QSE_T("|_____|_____|__| |_____| |__|\n")); +#endif + qse_sio_puts (QSE_SIO_ERR, QSE_T("FILE ")); qse_sio_puts (QSE_SIO_ERR, file); qse_sio_puts (QSE_SIO_ERR, QSE_T(" LINE ")); diff --git a/qse/lib/cut/Makefile.in b/qse/lib/cut/Makefile.in index 5f1f7821..d1189585 100644 --- a/qse/lib/cut/Makefile.in +++ b/qse/lib/cut/Makefile.in @@ -136,6 +136,7 @@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ +ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ diff --git a/qse/lib/http/Makefile.in b/qse/lib/http/Makefile.in index d08a4952..3adaefb1 100644 --- a/qse/lib/http/Makefile.in +++ b/qse/lib/http/Makefile.in @@ -117,6 +117,7 @@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ +ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ diff --git a/qse/lib/http/http.c b/qse/lib/http/http.c index 7a254794..72e7abb4 100644 --- a/qse/lib/http/http.c +++ b/qse/lib/http/http.c @@ -18,7 +18,7 @@ License along with QSE. If not, see . */ -#include +#include #include #include "../cmn/mem.h" @@ -229,11 +229,13 @@ qse_http_t* qse_http_init (qse_http_t* http, qse_mmgr_t* mmgr) init_buffer (http, &http->reqx.b.raw); init_buffer (http, &http->reqx.b.tra); + init_buffer (http, &http->reqx.b.pen); init_buffer (http, &http->req.con); if (qse_htb_init (&http->req.hdrtab, mmgr, 60, 70, 1, 1) == QSE_NULL) { fini_buffer (http, &http->req.con); + fini_buffer (http, &http->reqx.b.pen); fini_buffer (http, &http->reqx.b.tra); fini_buffer (http, &http->reqx.b.raw); return QSE_NULL; @@ -247,6 +249,7 @@ void qse_http_fini (qse_http_t* http) qse_htb_fini (&http->req.hdrtab); clear_combined_headers (http); fini_buffer (http, &http->req.con); + fini_buffer (http, &http->reqx.b.pen); fini_buffer (http, &http->reqx.b.tra); fini_buffer (http, &http->reqx.b.raw); } @@ -993,8 +996,21 @@ int qse_http_feed (qse_http_t* http, const qse_byte_t* req, qse_size_t len) const qse_byte_t* end = req + len; const qse_byte_t* ptr = req; +#if 0 + if (http->reqx.pending) + { + } +#endif + /* does this goto drop code maintainability? */ - if (http->reqx.s.need > 0) goto content_resume; + if (http->reqx.s.need > 0) + { + /* we're in need of as many octets as http->reqx.s.need + * for contents body. make a proper jump to resume + * content handling */ + goto content_resume; + } + switch (http->reqx.s.chunk.phase) { case GET_CHUNK_LEN: @@ -1099,14 +1115,16 @@ int qse_http_feed (qse_http_t* http, const qse_byte_t* req, qse_size_t len) } else { - /* we need to read as many octets as Content-Length */ + /* we need to read as many octets as + * Content-Length */ http->reqx.s.need = http->req.attr.content_length; } if (http->reqx.s.need > 0) { - /* content-length or chunked data length specified */ - + /* content-length or chunked data length + * specified */ + qse_size_t avail; content_resume: @@ -1230,3 +1248,19 @@ feedme_more: return 0; } +int qse_http_addtext (qse_http_t* http, const qse_byte_t* ptr, qse_size_t len) +{ +} + +int qse_http_addresource (qse_http_t* http, const void* ptr, qse_size_t len) +{ +} + +int qse_http_addheader ( + qse_http_t* http, const qse_byte_t* key, const qse_byte_t* val) +{ +} + +int qse_http_emit (qse_http_t* http) +{ +} diff --git a/qse/lib/scm/Makefile.in b/qse/lib/scm/Makefile.in index 61088db9..f2be2aad 100644 --- a/qse/lib/scm/Makefile.in +++ b/qse/lib/scm/Makefile.in @@ -117,6 +117,7 @@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ +ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ diff --git a/qse/lib/scm/scm.c b/qse/lib/scm/scm.c index 71ceb517..7478f447 100644 --- a/qse/lib/scm/scm.c +++ b/qse/lib/scm/scm.c @@ -22,6 +22,8 @@ QSE_IMPLEMENT_COMMON_FUNCTIONS (scm) +#define IS_NIL(x) ((x) != scm->nil) + static qse_scm_t* qse_scm_init ( qse_scm_t* scm, qse_mmgr_t* mmgr, @@ -29,9 +31,15 @@ static qse_scm_t* qse_scm_init ( qse_size_t mem_ubound_inc ); -static void qse_scm_fini (qse_scm_t* scm); -static qse_scm_val_t* mkcons ( - qse_scm_t* scm, qse_scm_val_t* car, qse_scm_val_t* cdr); +static void qse_scm_fini ( + qse_scm_t* scm +); + +static qse_scm_ent_t* make_pair_entity ( + qse_scm_t* scm, + qse_scm_ent_t* car, + qse_scm_ent_t* cdr +); qse_scm_t* qse_scm_open ( qse_mmgr_t* mmgr, qse_size_t xtnsize, @@ -71,11 +79,11 @@ void qse_scm_close (qse_scm_t* scm) static QSE_INLINE void delete_all_value_blocks (qse_scm_t* scm) { - while (scm->mem.vbl) + while (scm->mem.ebl) { - qse_scm_vbl_t* vbl = scm->mem.vbl; - scm->mem.vbl = scm->mem.vbl->next; - QSE_MMGR_FREE (scm->mmgr, vbl); + qse_scm_enb_t* enb = scm->mem.ebl; + scm->mem.ebl = scm->mem.ebl->next; + QSE_MMGR_FREE (scm->mmgr, enb); } } @@ -83,17 +91,17 @@ static qse_scm_t* qse_scm_init ( qse_scm_t* scm, qse_mmgr_t* mmgr, qse_size_t mem_ubound, qse_size_t mem_ubound_inc) { -#if 0 - static qse_scm_val_t static_values[3] = + static qse_scm_ent_t static_values[3] = { + /* dswcount, mark, atom, type */ + /* nil */ - { (QSE_SCM_VAL_ATOM | QSE_SCM_VAL_MARK) }, + { 0, 1, 1, QSE_SCM_ENT_NIL }, /* f */ - { (QSE_SCM_VAL_ATOM | QSE_SCM_VAL_MARK) }, + { 0, 1, 1, QSE_SCM_ENT_T }, /* t */ - { (QSE_SCM_VAL_ATOM | QSE_SCM_VAL_MARK) } + { 0, 1, 1, QSE_SCM_ENT_F } }; -#endif if (mmgr == QSE_NULL) mmgr = QSE_MMGR_GETDFL(); @@ -119,17 +127,15 @@ static qse_scm_t* qse_scm_init ( return QSE_NULL; } -#if 0 /* initialize common values */ scm->nil = &static_values[0]; - scm->f = &static_values[1]; - scm->t = &static_values[2]; -#endif + scm->f = &static_values[1]; + scm->t = &static_values[2]; - scm->mem.vbl = QSE_NULL; + scm->mem.ebl = QSE_NULL; scm->mem.free = scm->nil; - scm->genv = mkcons (scm, scm->nil, scm->nil); + scm->genv = make_pair_entity (scm, scm->nil, scm->nil); if (scm->genv == QSE_NULL) { delete_all_value_blocks (scm); @@ -138,6 +144,8 @@ static qse_scm_t* qse_scm_init ( return QSE_NULL; } + scm->symtab = scm->nil; + scm->reg.dmp = scm->nil; scm->reg.env = scm->genv; @@ -186,7 +194,7 @@ int qse_scm_attachio (qse_scm_t* scm, qse_scm_io_t* io) if (io->out (scm, QSE_SCM_IO_OPEN, &scm->io.arg.out, QSE_NULL, 0) <= -1) { if (scm->err.num == QSE_SCM_ENOERR) - qse_scm_seterror (scm,QSE_SCM_EIO, QSE_NULL, QSE_NULL); + qse_scm_seterror (scm, QSE_SCM_EIO, QSE_NULL, QSE_NULL); io->in (scm, QSE_SCM_IO_CLOSE, &scm->io.arg.in, QSE_NULL, 0); return -1; } @@ -199,60 +207,50 @@ int qse_scm_attachio (qse_scm_t* scm, qse_scm_io_t* io) return 0; } -static qse_scm_vbl_t* newvbl (qse_scm_t* scm, qse_size_t len) +static qse_scm_enb_t* new_entity_block (qse_scm_t* scm, qse_size_t len) { /* * create a new value block containing as many slots as len */ - qse_scm_vbl_t* blk; - qse_scm_val_t* v; + qse_scm_enb_t* blk; + qse_scm_ent_t* v; qse_size_t i; - blk = (qse_scm_vbl_t*) QSE_MMGR_ALLOC ( + blk = (qse_scm_enb_t*) QSE_MMGR_ALLOC ( scm->mmgr, - QSE_SIZEOF(qse_scm_vbl_t) + - QSE_SIZEOF(qse_scm_val_t) * len + QSE_SIZEOF(qse_scm_enb_t) + + QSE_SIZEOF(qse_scm_ent_t) * len ); if (blk == QSE_NULL) { - scm->err.num = QSE_SCM_ENOMEM; + qse_scm_seterror (scm, QSE_SCM_ENOMEM, QSE_NULL, QSE_NULL); return QSE_NULL; } /* initialize the block fields */ - blk->ptr = (qse_scm_val_t*)(blk + 1); + blk->ptr = (qse_scm_ent_t*)(blk + 1); blk->len = len; /* chain the value block to the block list */ - blk->next = scm->mem.vbl; - scm->mem.vbl = blk; + blk->next = scm->mem.ebl; + scm->mem.ebl = blk; - /* chain each slot to the free slot list */ + /* chain each slot to the free slot list using + * the CDR field of an entity */ v = &blk->ptr[0]; for (i = 0; i < len -1; i++) { - qse_scm_val_t* tmp = v++; - tmp->u.cons.cdr = v; + qse_scm_ent_t* tmp = v++; + PAIR_CDR(tmp) = v; } - v->u.cons.cdr = scm->mem.free; + PAIR_CDR(v) = scm->mem.free; scm->mem.free = &blk->ptr[0]; return blk; }; -/* TODO: redefine this ... */ -#define IS_ATOM(v) ((v)->flags & (QSE_SCM_VAL_STRING | QSE_SCM_VAL_NUMBER | QSE_SCM_VAL_PROC) - -#define IS_MARKED(v) ((v)->mark) -#define SET_MARK(v) ((v)->mark = 1) -#define CLEAR_MARK(v) ((v)->mark = 0) - -#define ZERO_DSW_COUNT(v) ((v)->dsw_count = 0) -#define GET_DSW_COUNT(v) ((v)->dsw_count) -#define INC_DSW_COUNT(v) ((v)->dsw_count++) - -static void mark (qse_scm_t* scm, qse_scm_val_t* v) +static void mark (qse_scm_t* scm, qse_scm_ent_t* v) { /* * mark values non-recursively with Deutsch-Schorr-Waite(DSW) algorithm @@ -260,24 +258,23 @@ static void mark (qse_scm_t* scm, qse_scm_val_t* v) * with the help of additional variables. */ - qse_scm_val_t* parent, * me; + qse_scm_ent_t* parent, * me; -#if 0 /* initialization */ parent = QSE_NULL; me = v; - SET_MARK (me); - /*if (!IS_ATOM(me))*/ ZERO_DSW_COUNT (me); + MARK(me) = 1; + /*if (!ATOM(me))*/ DSWCOUNT(me) = 0; while (1) { - if (IS_ATOM(me) || GET_DSW_COUNT(me) >= 2) + if (ATOM(me) || DSWCOUNT(me) >= QSE_COUNTOF(me->u.ref.ent)) { /* * backtrack to the parent node */ - qse_scm_val_t* child; + qse_scm_ent_t* child; /* nothing more to backtrack? end of marking */ if (parent == QSE_NULL) return; @@ -289,30 +286,30 @@ static void mark (qse_scm_t* scm, qse_scm_val_t* v) me = parent; /* change the parent to the parent of parent */ - parent = me->u.cona.val[GET_DSW_COUNT(me)]; + parent = me->u.ref.ent[DSWCOUNT(me)]; /* restore the cell contents */ - me->u.cona.val[GET_DSW_COUNT(me)] = child; + me->u.ref.ent[DSWCOUNT(me)] = child; /* increment the counter to indicate that the - * 'count'th field has been processed. - INC_DSW_COUNT (me); + * 'count'th field has been processed. */ + DSWCOUNT(me)++; } else { /* * move on to an unprocessed child */ - qse_scm_val_t* child; + qse_scm_ent_t* child; - child = me->u.cona.val[GET_DSW_COUNT(me)]; + child = me->u.ref.ent[DSWCOUNT(me)]; /* process the field */ - if (child && !ismark(child)) + if (child && !MARK(child)) { /* change the contents of the child chonse * to point to the current parent */ - me->u.cona.val[GET_DSW_COUNT(me)] = parent; + me->u.ref.ent[DSWCOUNT(me)] = parent; /* link me to the head of parent list */ parent = me; @@ -320,23 +317,23 @@ static void mark (qse_scm_t* scm, qse_scm_val_t* v) /* let me point to the child chosen */ me = child; - SET_MARK (me); - /*if (!IS_ATOM(me))*/ ZERO_DSW_COUNT (me); + MARK(me) = 1; + /*if (!ATOM(me))*/ DSWCOUNT(me) = 0; } else { - INC_DSW_COUNT (me) + /* increment the count */ + DSWCOUNT(me)++; } } } -#endif } #if 0 -static void mark (qse_scm_t* scm, qse_scm_val_t* v) +static void mark (qse_scm_t* scm, qse_scm_ent_t* v) { - qse_scm_val_t* t, * p, * q; + qse_scm_ent_t* t, * p, * q; t = QSE_NULL; p = v; @@ -389,9 +386,9 @@ E6: } #endif -static void gc (qse_scm_t* scm, qse_scm_val_t* x, qse_scm_val_t* y) +static void gc (qse_scm_t* scm, qse_scm_ent_t* x, qse_scm_ent_t* y) { - //mark (scm, scm->oblist); + //mark (scm, scm->symtab); mark (scm, scm->genv); mark (scm, scm->reg.arg); @@ -399,45 +396,276 @@ static void gc (qse_scm_t* scm, qse_scm_val_t* x, qse_scm_val_t* y) mark (scm, scm->reg.cod); mark (scm, scm->reg.dmp); + /* mark the temporaries */ mark (scm, x); mark (scm, y); + + + /* scan the allocated values */ } -static qse_scm_val_t* mkval (qse_scm_t* scm, qse_scm_val_t* x, qse_scm_val_t* y) +/* + +rsr4 + +the following identifiers are syntatic keywors and should not be +used as variables. + + => do or + and else quasiquote + begin if quote + case lambda set! + cond let unquote + define let* unquote-splicing + delay letrec + +however, you can allow for these keywords to be used as variables... + +biniding, unbound... +environment.. a set of visible bindings at some point in a program. + + + + type atom cons + number NUMBER Y + string STRING Y + symbol SYMBOL name,NIL + syntax SYNTAX|SYMBOL name,NIL + proc PROC Y + pair PAIR Y + closure + continuation + + an atom does not reference any other values. + a symbol can be assoicated with property list + (put 'a 'name "brian") + (put 'a 'city "daegu") + ------------------------- + (define a1 'a) + (put a1 'name "brian") + (put a1 'city "daegu") + ------------------------- + (get a1 'name) + (get a1 'city) + + a procedure is a privimitive routine built-in to scheme. + a closure is an anonymous routine defined with lambda. + both can be bound to a variable in the environment. + + a syntax is more primitive than a procedure. + a syntax is created as if it is a symbol but not registerd + into an environment + + car cdr +| STR | PTR CHR ARR | -1 | +| PROC | PROCNUM | | +| SYM | REF STR | REF PROP LIST | +| SYN | REF STR | REF PROP LIST | + +*/ + +static qse_scm_ent_t* alloc_entity ( + qse_scm_t* scm, qse_scm_ent_t* x, qse_scm_ent_t* y) { - qse_scm_val_t* v; + /* find a free value slot and return it. + * two parameters x and y are saved from garbage collection */ + + qse_scm_ent_t* v; if (scm->mem.free == scm->nil) { - gc (scm, x, y); + /* if no free slot is available */ + gc (scm, x, y); /* perform garbage collection */ if (scm->mem.free == scm->nil) { - if (newvbl (scm, 1000) == QSE_NULL) return QSE_NULL; + /* if no free slot is available after garbage collection, + * make new value blocks containing more free slots */ + +/* TODO: make the value block size configurable */ + if (new_entity_block (scm, 1000) == QSE_NULL) return QSE_NULL; QSE_ASSERT (scm->mem.free != scm->nil); } } v = scm->mem.free; - scm->mem.free = v->u.cons.cdr; + scm->mem.free = PAIR_CDR(v); return v; } - -static qse_scm_val_t* mkcons ( - qse_scm_t* scm, qse_scm_val_t* car, qse_scm_val_t* cdr) +static qse_scm_ent_t* make_pair_entity ( + qse_scm_t* scm, qse_scm_ent_t* car, qse_scm_ent_t* cdr) { - qse_scm_val_t* v; + qse_scm_ent_t* v; - v = mkval (scm, car, cdr); + v = alloc_entity (scm, car, cdr); if (v == QSE_NULL) return QSE_NULL; -#if 0 - v->flag = QSE_SCM_VAL_PAIR; - v->u.cons.car = car; - v->u.cons.cdr = car; -#endif + TYPE(v) = QSE_SCM_ENT_PAIR; + ATOM(v) = 0; /* a pair is not an atom as it references other entities */ + PAIR_CAR(v) = car; + PAIR_CDR(v) = cdr; return v; } + +static qse_scm_ent_t* make_string_entity ( + qse_scm_t* scm, const qse_char_t* str, qse_size_t len) +{ + qse_scm_ent_t* v; + + v = alloc_entity (scm, scm->nil, scm->nil); + if (v == QSE_NULL) return QSE_NULL; + + TYPE(v) = QSE_SCM_ENT_STR; + ATOM(v) = 1; +/* TODO: allocate a string from internal managed region . +Calling strdup is not an option as it is not managed... +*/ + STR_PTR(v) = qse_strxdup (str, len, QSE_MMGR(scm)); + if (STR_PTR(v) == QSE_NULL) + { + qse_scm_seterror (scm, QSE_SCM_ENOMEM, QSE_NULL, QSE_NULL); + return QSE_NULL; + } + STR_LEN(v) = len; + + return v; +} + +static qse_scm_ent_t* make_name_entity (qse_scm_t* scm, const qse_char_t* str) +{ + qse_scm_ent_t* v; + + v = alloc_entity (scm, scm->nil, scm->nil); + if (v == QSE_NULL) return QSE_NULL; + + TYPE(v) = QSE_SCM_ENT_NAM; + ATOM(v) = 1; +/* TODO: allocate a string from internal managed region . +Calling strdup is not an option as it is not managed... +*/ + LAB_PTR(v) = qse_strdup (str, QSE_MMGR(scm)); + if (LAB_PTR(v) == QSE_NULL) + { + qse_scm_seterror (scm, QSE_SCM_ENOMEM, QSE_NULL, QSE_NULL); + return QSE_NULL; + } + LAB_CODE(v) = 0; + + return v; +} + +static qse_scm_ent_t* make_symbol_entity (qse_scm_t* scm, const qse_char_t* name) +{ + qse_scm_ent_t* pair, * sym, * nam; + +/* TODO: use a hash table, red-black tree to maintain symbol table + * The current linear search algo is not performance friendly... + */ + + /* find if the symbol already exists by traversing the pair list + * and inspecting the symbol name pointed to by CAR of each pair. + * + * the symbol table is a list of pairs whose CAR points to a symbol + * and CDR is used for chaining. + * + * +-----+-----+ + * | | | + * +-----+-----+ + * car | | cdr +-----+-----+ + * | +----------> | | | + * V +-----+-----+ + * +--------+ car | + * | symbol | V + * +--------+ +--------+ + * | symbol | + * +--------+ + */ + for (pair = scm->symtab; !IS_NIL(pair); pair = PAIR_CDR(pair)) + { + sym = PAIR_CAR(pair); + if (qse_strcmp(name, LAB_PTR(SYM_NAME(sym))) == 0) return sym; + } + + /* no existing symbol with such a name is found. + * let's create a new symbol. the first step is to create a + * string entity to contain the symbol name */ + nam = make_name_entity (scm, name); + if (nam == QSE_NULL) return QSE_NULL; + + /* let's allocate the actual symbol entity that references the + * the symbol name entity created above */ + sym = alloc_entity (scm, nam, scm->nil); + if (sym == QSE_NULL) return QSE_NULL; + TYPE(sym) = QSE_SCM_ENT_SYM; + ATOM(sym) = 0; + SYM_NAME(sym) = nam; + SYM_PROP(sym) = scm->nil; /* no properties yet */ + + /* chain the symbol entity to the symbol table for lookups later */ + pair = make_pair_entity (scm, sym, scm->symtab); + if (pair == QSE_NULL) return QSE_NULL; + scm->symtab = pair; + + return sym; +} + +static qse_scm_ent_t* make_syntax_entity ( + qse_scm_t* scm, const qse_char_t* name, int code) +{ + qse_scm_ent_t* v; + + QSE_ASSERTX (code > 0, "Syntax code must be greater than 0"); + + v = make_symbol_entity (scm, name); + if (v == QSE_NULL) return QSE_NULL; + + /* we piggy-back the syntax code to a symbol name. + * the syntax entity is basically a symbol except that the + * code field of its label entity is set to non-zero. + */ + TYPE(v) |= QSE_SCM_ENT_SYNT; + SYNT_CODE(v) = code; + + return v; +} + +static qse_scm_ent_t* make_proc_entity ( + qse_scm_t* scm, const qse_char_t* name, int code) +{ + qse_scm_ent_t* sym, * proc, * pair; + + /* a procedure entity is a built-in function that + * that can be overridden by a user while a syntax entity + * represents a lower-level syntatic function that can't + * be overriden. + * (define lambda 10) is legal but does not change the + * meaning of lambda when used as a function name. + * (define eval 10) changes the meaning of eval totally. + */ + + /* create a symbol containing the name */ + sym = make_symbol_entity (scm, name); + if (sym == QSE_NULL) return QSE_NULL; + + /* create an actual procecure value which is a number containing + * the opcode for the procedure */ + proc = alloc_entity (scm, scm->nil, scm->nil); + if (proc == QSE_NULL) return QSE_NULL; + TYPE(proc) = QSE_SCM_ENT_PROC; + ATOM(proc) = 1; + PROC_CODE(proc) = code; + + /* create a pair containing the name symbol and the procedure value */ + pair = make_pair_entity (scm, sym, proc); + if (pair == QSE_NULL) return QSE_NULL; + + /* link it to the global environment */ + pair = make_pair_entity (scm, pair, PAIR_CAR(scm->genv)); + if (pair == QSE_NULL) return QSE_NULL; + PAIR_CAR(scm->genv) = pair; + + return proc; +} diff --git a/qse/lib/scm/scm.h b/qse/lib/scm/scm.h index 9f6d5846..54e11ee7 100644 --- a/qse/lib/scm/scm.h +++ b/qse/lib/scm/scm.h @@ -40,65 +40,100 @@ #define QSE_SCM_TOUPPER(scm,c) QSE_TOUPPER(c) #define QSE_SCM_TOLOWER(scm,c) QSE_TOLOWER(c) -#define QSE_SCM_VAL_STRING 1 /* 0000000000000001 */ -#define QSE_SCM_VAL_NUMBER 2 /* 0000000000000010 */ -#define QSE_SCM_VAL_SYMBOL 4 /* 0000000000000100 */ -#define QSE_SCM_VAL_SYNTAX 8 /* 0000000000001000 */ -#define QSE_SCM_VAL_PROC 16 /* 0000000000010000 */ - -#define QSE_SCM_VAL_PAIR 32 /* 0000000000100000 */ -#define QSE_SCM_VAL_CLOSURE 64 /* 0000000001000000 */ -#define QSE_SCM_VAL_CONTINUATION 128 /* 0000000010000000 */ -#define QSE_SCM_VAL_MACRO 256 /* 0000000100000000 */ -#define QSE_SCM_VAL_PROMISE 512 /* 0000001000000000 */ -#define QSE_SCM_VAL_ATOM 4096 /* 0001000000000000 */ /* only for gc */ - -typedef struct qse_scm_val_t qse_scm_val_t; -struct qse_scm_val_t +enum qse_scm_ent_type_t { - qse_uint16_t dsw_count: 2; - qse_uint16_t mark: 1; - qse_uint16_t types: 13; + QSE_SCM_ENT_NIL = (1 << 0), + QSE_SCM_ENT_T = (1 << 1), + QSE_SCM_ENT_F = (1 << 2), + QSE_SCM_ENT_NUM = (1 << 3), + QSE_SCM_ENT_STR = (1 << 4), + QSE_SCM_ENT_NAM = (1 << 5), + QSE_SCM_ENT_SYM = (1 << 6), + QSE_SCM_ENT_PAIR = (1 << 7), + QSE_SCM_ENT_PROC = (1 << 8), + QSE_SCM_ENT_SYNT = (1 << 9) + +}; + +#if 0 +#define QSE_SCM_ENT_CLOSURE 64 /* 0000000001000000 */ +#define QSE_SCM_ENT_CONTINUATION 128 /* 0000000010000000 */ +#define QSE_SCM_ENT_MACRO 256 /* 0000000100000000 */ +#define QSE_SCM_ENT_PROMISE 512 /* 0000001000000000 */ +#endif + +typedef struct qse_scm_ent_t qse_scm_ent_t; + +/** + * The qse_scm_ent_t type defines an entity that represents an individual + * value in scheme. + */ +struct qse_scm_ent_t +{ + qse_uint16_t dswcount: 2; + qse_uint16_t mark: 1; + qse_uint16_t atom: 1; + qse_uint16_t type: 12; union { struct { - qse_char_t* ptr; - qse_size_t len; - } str; + qse_long_t val; + } num; /* number */ struct { - qse_long_t val; - } num; + /* a string doesn't need to be null-terminated + * as the length is remembered */ + qse_char_t* ptr; + qse_size_t len; + } str; /* string */ + + struct + { + qse_char_t* ptr; /* null-terminated string */ + int code; /* used for syntax entities only */ + } lab; /* label */ + + struct + { + int code; + } proc; struct { - qse_scm_val_t* car; - qse_scm_val_t* cdr; - } cons; - - /* arrayed cons. cona must maintain the - * same size as cons */ - struct - { - qse_scm_val_t* val[2]; - } cona; + qse_scm_ent_t* ent[2]; + } ref; } u; }; +#define DSWCOUNT(v) ((v)->dswcount) +#define MARK(v) ((v)->mark) +#define TYPE(v) ((v)->type) +#define ATOM(v) ((v)->atom) +#define NUM_VALUE(v) ((v)->u.num.val) +#define STR_PTR(v) ((v)->u.str.ptr) +#define STR_LEN(v) ((v)->u.str.len) +#define LAB_PTR(v) ((v)->u.lab.ptr) +#define LAB_CODE(v) ((v)->u.lab.code) +#define SYM_NAME(v) ((v)->u.ref.ent[0]) +#define SYM_PROP(v) ((v)->u.ref.ent[1]) +#define PAIR_CAR(v) ((v)->u.ref.ent[0]) +#define PAIR_CDR(v) ((v)->u.ref.ent[1]) +#define PROC_CODE(v) ((v)->u.proc.code) +#define SYNT_CODE(v) LAB_CODE(SYM_NAME(v)) /** - * The qse_scm_vbl_t type defines a value block. A value block is allocated + * The qse_scm_enb_t type defines a value block. A value block is allocated * when more memory is requested and is chained to existing value blocks. */ -typedef struct qse_scm_vbl_t qse_scm_vbl_t; -struct qse_scm_vbl_t +typedef struct qse_scm_enb_t qse_scm_enb_t; +struct qse_scm_enb_t { - qse_scm_val_t* ptr; + qse_scm_ent_t* ptr; qse_size_t len; - qse_scm_vbl_t* next; + qse_scm_enb_t* next; }; struct qse_scm_t @@ -144,26 +179,29 @@ struct qse_scm_t } r; /* common values */ - qse_scm_val_t* nil; - qse_scm_val_t* t; - qse_scm_val_t* f; + qse_scm_ent_t* nil; + qse_scm_ent_t* t; + qse_scm_ent_t* f; /* global environment */ - qse_scm_val_t* genv; + qse_scm_ent_t* genv; + + /* symbol table */ + qse_scm_ent_t* symtab; /* registers */ struct { - qse_scm_val_t* arg; /* function arguments */ - qse_scm_val_t* env; /* current environment */ - qse_scm_val_t* cod; /* current code */ - qse_scm_val_t* dmp; /* stack register for next evaluation */ + qse_scm_ent_t* arg; /* function arguments */ + qse_scm_ent_t* env; /* current environment */ + qse_scm_ent_t* cod; /* current code */ + qse_scm_ent_t* dmp; /* stack register for next evaluation */ } reg; struct { - qse_scm_vbl_t* vbl; /* value block list */ - qse_scm_val_t* free; + qse_scm_enb_t* ebl; /* entity block list */ + qse_scm_ent_t* free; } mem; }; diff --git a/qse/lib/sed/Makefile.in b/qse/lib/sed/Makefile.in index a992b932..3d7b873f 100644 --- a/qse/lib/sed/Makefile.in +++ b/qse/lib/sed/Makefile.in @@ -136,6 +136,7 @@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ +ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ diff --git a/qse/regress/Makefile.in b/qse/regress/Makefile.in index 2a0b23f6..79f67ff3 100644 --- a/qse/regress/Makefile.in +++ b/qse/regress/Makefile.in @@ -112,6 +112,7 @@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ +ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ diff --git a/qse/regress/awk/Makefile.in b/qse/regress/awk/Makefile.in index fcea42a9..83e84b61 100644 --- a/qse/regress/awk/Makefile.in +++ b/qse/regress/awk/Makefile.in @@ -74,6 +74,7 @@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ +ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ diff --git a/qse/regress/sed/Makefile.in b/qse/regress/sed/Makefile.in index 7cc26b71..31eb670f 100644 --- a/qse/regress/sed/Makefile.in +++ b/qse/regress/sed/Makefile.in @@ -74,6 +74,7 @@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ +ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ diff --git a/qse/samples/Makefile.in b/qse/samples/Makefile.in index 30bb4216..3a6467c1 100644 --- a/qse/samples/Makefile.in +++ b/qse/samples/Makefile.in @@ -112,6 +112,7 @@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ +ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ diff --git a/qse/samples/awk/Makefile.in b/qse/samples/awk/Makefile.in index ba4e253a..9b78545c 100644 --- a/qse/samples/awk/Makefile.in +++ b/qse/samples/awk/Makefile.in @@ -147,6 +147,7 @@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ +ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ diff --git a/qse/samples/cmn/Makefile.in b/qse/samples/cmn/Makefile.in index cf8dd77d..b479ad87 100644 --- a/qse/samples/cmn/Makefile.in +++ b/qse/samples/cmn/Makefile.in @@ -165,6 +165,7 @@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ +ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ diff --git a/qse/samples/cut/Makefile.in b/qse/samples/cut/Makefile.in index 8bd03a9e..2e61d620 100644 --- a/qse/samples/cut/Makefile.in +++ b/qse/samples/cut/Makefile.in @@ -96,6 +96,7 @@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ +ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ diff --git a/qse/samples/http/Makefile.in b/qse/samples/http/Makefile.in index e479e217..d68d7f23 100644 --- a/qse/samples/http/Makefile.in +++ b/qse/samples/http/Makefile.in @@ -96,6 +96,7 @@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ +ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ diff --git a/qse/samples/http/http01.c b/qse/samples/http/http01.c index e8997269..3457363e 100644 --- a/qse/samples/http/http01.c +++ b/qse/samples/http/http01.c @@ -1,4 +1,4 @@ -#include +#include #include #include #include @@ -7,6 +7,7 @@ #include #include #include +#include #include #include #include @@ -20,12 +21,9 @@ typedef struct client_array_t client_array_t; struct client_t { - int fd; - struct sockaddr_in addr; - qse_http_t* http; - - pending_requests??? - action_t actions[10]; + int fd; + struct sockaddr_storage addr; + qse_http_t* http; }; struct client_array_t @@ -50,28 +48,43 @@ int handle_request (qse_http_t* http, qse_http_req_t* req) if (req->method == QSE_HTTP_REQ_GET) { - #if 0 - /* determine what to do with the request - * and set the right action for it */ - xtn->action.type = SENDFILE; - xtn->action.data.sendfile.path = filename; - xtn->action.data.sendfile.ifnewer = xxxx; - #endif +#if 0 + qse_http_rep_t* rep; - #if 0 int fd = open (req->path.ptr, O_RDONLY); if (fd <= -1) { + qse_http_addtext (http, + "FILE NOT FOUND"); } else { + #if 0 + qse_http_addheader ( + http, "Content-Type", detect_file_type(req->path.ptr) + ); + + qse_http_addtext (http, .....); + qse_http_adddata (http, + + qse_http_addoutputdata (http, fd); + #endif + + /* struct stat st; fstat (fd, &st); sendfile (xtn->array->data[xtn->index].fd, fd, NULL, st.st_size); close (fd); + */ } - #endif + + rep = qse_http_emit (http); + if (rep == NULL) + { + /* ERROR */ + } +#endif } return 0; @@ -116,18 +129,18 @@ qse_http_reqcbs_t http_reqcbs = int mkserver (const char* portstr) { int s, flag, port = atoi(portstr); - struct sockaddr_in addr; + struct sockaddr_in6 addr; - s = socket (PF_INET, SOCK_STREAM, IPPROTO_TCP); + s = socket (PF_INET6, SOCK_STREAM, IPPROTO_TCP); if (s <= -1) return -1; flag = 1; setsockopt (s, SOL_SOCKET, SO_REUSEADDR, &flag, sizeof(flag)); memset (&addr, 0, sizeof(addr)); - addr.sin_family = AF_INET; - addr.sin_addr.s_addr = htonl (INADDR_ANY); - addr.sin_port = htons (port); + addr.sin6_family = AF_INET6; + addr.sin6_port = htons(port); + inet_pton (AF_INET6, "::1", &addr.sin6_addr); if (bind (s, (struct sockaddr*)&addr, sizeof(addr)) <= -1) { @@ -183,7 +196,7 @@ static void fini_client_array (client_array_t* array) } static client_t* insert_into_client_array ( - client_array_t* array, int fd, struct sockaddr_in* addr) + client_array_t* array, int fd, struct sockaddr_storage* addr) { http_xtn_t* xtn; @@ -219,7 +232,8 @@ static client_t* insert_into_client_array ( return &array->data[fd]; } -static int make_fd_set_from_client_array (client_array_t* ca, int s, fd_set* r, fd_set* w) +static int make_fd_set_from_client_array ( + client_array_t* ca, int s, fd_set* r, fd_set* w) { int fd, max = s; @@ -285,48 +299,23 @@ int main (int argc, char* argv[]) fd_set r, w; struct timeval tv; - #if 0 - if (ca->need_cpu) - { - tv.tv_sec = 0; - tv.tv_usec = 0; - } - else - { - #endif - tv.tv_sec = 1; - tv.tv_usec = 0; - #if 0 - } - #endif + tv.tv_sec = 1; + tv.tv_usec = 0; max = make_fd_set_from_client_array (&ca, s, &r, &w); n = select (max + 1, &r, &w, NULL, &tv); if (n <= -1) { if (errno == EINTR) continue; - qse_fprintf (QSE_STDERR, QSE_T("Error: select returned failure\n")); break; } - if (n == 0) - { - #if 0 - /* no input and no writable sockets. - */ - for (fd = 0; fd < ca.capa; fd++) - { - /* process internal things */ - qse_http_pump (ca.data[fd].http); - } - #endif - continue; - } + if (n == 0) continue; if (FD_ISSET(s, &r)) { int flag; - struct sockaddr_in addr; + struct sockaddr_storage addr; socklen_t addrlen = sizeof(addr); int c = accept (s, (struct sockaddr*)&addr, &addrlen); if (c <= -1) @@ -408,7 +397,7 @@ int main (int argc, char* argv[]) } #if 0 - if (FD_ISSET(client->fd, &w) && client->has_data_to_send) + if (FD_ISSET(client->fd, &w) && client->rep) { /* ready to send output */ if (handle_output (xxxxx) <= -1) diff --git a/qse/samples/sed/Makefile.in b/qse/samples/sed/Makefile.in index 77f1d045..16d8e589 100644 --- a/qse/samples/sed/Makefile.in +++ b/qse/samples/sed/Makefile.in @@ -118,6 +118,7 @@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ +ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@