diff --git a/qse/lib/awk/StdAwk.cpp b/qse/lib/awk/StdAwk.cpp index caf7b25d..656b2470 100644 --- a/qse/lib/awk/StdAwk.cpp +++ b/qse/lib/awk/StdAwk.cpp @@ -29,30 +29,10 @@ #include "awk.h" #include "std.h" -#if defined(_WIN32) -# include -# include -# if defined(QSE_HAVE_CONFIG_H) -# include -# define USE_LTDL -# endif -#elif defined(__OS2__) -# define INCL_DOSMODULEMGR -# define INCL_DOSPROCESS -# define INCL_DOSERRORS -# include -#elif defined(__DOS__) -# if !defined(QSE_ENABLE_STATIC_MODULE) -# include -# endif -#else -# include -# include -# define USE_LTDL -#endif +#include -#ifndef QSE_HAVE_CONFIG_H -# if defined(_WIN32) || defined(__OS2__) || defined(__DOS__) +#if !defined(QSE_HAVE_CONFIG_H) +# if defined(_WIN32) || defined(__OS2__) || defined(__DOS__) # define HAVE_POW # define HAVE_FMOD # endif @@ -128,13 +108,7 @@ int StdAwk::open () goto oops; } -#if defined(USE_LTDL) - /* lt_dlinit() can be called more than once and - * lt_dlexit() shuts down libltdl if it's called as many times as - * corresponding lt_dlinit(). so it's safe to call lt_dlinit() - * and lt_dlexit() at the library level. */ - if (lt_dlinit() != 0) goto oops; -#endif + if (qse_awk_stdmodstartup (this->awk) <= -1) goto oops; this->cmgrtab_inited = false; return 0; @@ -153,11 +127,8 @@ void StdAwk::close () } clearConsoleOutputs (); + qse_awk_stdmodshutdown (this->awk); Awk::close (); - -#if defined(USE_LTDL) - lt_dlexit (); -#endif } StdAwk::Run* StdAwk::parse (Source& in, Source& out) diff --git a/qse/lib/awk/std.c b/qse/lib/awk/std.c index 064724fa..4da2d20a 100644 --- a/qse/lib/awk/std.c +++ b/qse/lib/awk/std.c @@ -175,6 +175,38 @@ qse_awk_flt_t qse_awk_stdmathmod (qse_awk_t* awk, qse_awk_flt_t x, qse_awk_flt_t #endif } +int qse_awk_stdmodstartup (qse_awk_t* awk) +{ +#if defined(QSE_ENABLE_STATIC_MODULE) + return 0; + +#elif defined(USE_LTDL) + /* lt_dlinit() can be called more than once and + * lt_dlexit() shuts down libltdl if it's called as many times as + * corresponding lt_dlinit(). so it's safe to call lt_dlinit() + * and lt_dlexit() at the library level. */ + return (lt_dlinit () != 0)? -1: 0; + +#else + return 0; +#endif + +} + +void qse_awk_stdmodshutdown (qse_awk_t* awk) +{ +#if defined(QSE_ENABLE_STATIC_MODULE) + /* do nothign */ + +#elif defined(USE_LTDL) + + lt_dlexit (); + +#else + /* do nothing */ +#endif +} + void* qse_awk_stdmodopen (qse_awk_t* awk, const qse_awk_mod_spec_t* spec) { #if defined(QSE_ENABLE_STATIC_MODULE) @@ -389,10 +421,7 @@ qse_awk_t* qse_awk_openstd (qse_size_t xtnsize, qse_awk_errnum_t* errnum) static void fini_xtn (qse_awk_t* awk) { - /* nothing to do */ -#if defined(USE_LTDL) - lt_dlexit (); -#endif + qse_awk_stdmodshutdown (awk); } static void clear_xtn (qse_awk_t* awk) @@ -424,13 +453,7 @@ qse_awk_t* qse_awk_openstdwithmmgr (qse_mmgr_t* mmgr, qse_size_t xtnsize, qse_aw if (add_globals(awk) <= -1 || add_functions (awk) <= -1) goto oops; -#if defined(USE_LTDL) - /* lt_dlinit() can be called more than once and - * lt_dlexit() shuts down libltdl if it's called as many times as - * corresponding lt_dlinit(). so it's safe to call lt_dlinit() - * and lt_dlexit() at the library level. */ - if (lt_dlinit () != 0) goto oops; -#endif + if (qse_awk_stdmodstartup (awk) <= -1) goto oops; xtn->ecb.close = fini_xtn; xtn->ecb.clear = clear_xtn; diff --git a/qse/lib/awk/std.h b/qse/lib/awk/std.h index f20a82d9..ad07f3c5 100644 --- a/qse/lib/awk/std.h +++ b/qse/lib/awk/std.h @@ -27,12 +27,15 @@ extern "C" { #endif -qse_awk_flt_t qse_awk_stdmathpow (qse_awk_t* awk, qse_awk_flt_t x, qse_awk_flt_t y); -qse_awk_flt_t qse_awk_stdmathmod (qse_awk_t* awk, qse_awk_flt_t x, qse_awk_flt_t y); +QSE_EXPORT qse_awk_flt_t qse_awk_stdmathpow (qse_awk_t* awk, qse_awk_flt_t x, qse_awk_flt_t y); +QSE_EXPORT qse_awk_flt_t qse_awk_stdmathmod (qse_awk_t* awk, qse_awk_flt_t x, qse_awk_flt_t y); -void* qse_awk_stdmodopen (qse_awk_t* awk, const qse_awk_mod_spec_t* spec); -void qse_awk_stdmodclose (qse_awk_t* awk, void* handle); -void* qse_awk_stdmodsym (qse_awk_t* awk, void* handle, const qse_char_t* name); +QSE_EXPORT int qse_awk_stdmodstartup (qse_awk_t* awk); +QSE_EXPORT void qse_awk_stdmodshutdown (qse_awk_t* awk); + +QSE_EXPORT void* qse_awk_stdmodopen (qse_awk_t* awk, const qse_awk_mod_spec_t* spec); +QSE_EXPORT void qse_awk_stdmodclose (qse_awk_t* awk, void* handle); +QSE_EXPORT void* qse_awk_stdmodsym (qse_awk_t* awk, void* handle, const qse_char_t* name); #ifdef __cplusplus diff --git a/qse/lib/http/httpd-std.c b/qse/lib/http/httpd-std.c index 9d836762..e4ece165 100644 --- a/qse/lib/http/httpd-std.c +++ b/qse/lib/http/httpd-std.c @@ -441,8 +441,21 @@ static QSE_INLINE qse_ssize_t __send_file ( qse_fio_hnd_t fh; fh = qse_fio_gethandle (HANDLE_TO_FIO(in_fd)); + #if defined(__FreeBSD__) + { + off_t nsent; + ret = sendfile (fh, out_fd, *offset, count, QSE_NULL, &nsent, 0); + if (ret == 0) + { + *offset += nsent; + ret = nsent; + } + else qse_httpd_seterrnum (httpd, SKERR_TO_ERRNUM()); + } + #else ret = sendfile (out_fd, fh, offset, count); if (ret <= -1) qse_httpd_seterrnum (httpd, SKERR_TO_ERRNUM()); + #endif return ret; #elif defined(HAVE_SENDFILE64)