diff --git a/qse/include/qse/cmn/str.h b/qse/include/qse/cmn/str.h
index c1a61341..96f56361 100644
--- a/qse/include/qse/cmn/str.h
+++ b/qse/include/qse/cmn/str.h
@@ -78,7 +78,7 @@ typedef qse_size_t (*qse_wcs_sizer_t) (
qse_size_t hint
);
-#ifdef QSE_CHAR_IS_MCHAR
+#if defined(QSE_CHAR_IS_MCHAR)
# define QSE_STR_XSTR(s) ((qse_xstr_t*)QSE_MBS_XSTR(s))
# define QSE_STR_CSTR(s) ((qse_cstr_t*)QSE_MBS_XSTR(s))
# define QSE_STR_LEN(s) QSE_MBS_LEN(s)
@@ -147,7 +147,7 @@ typedef qse_wchar_t* (*qse_wcsxsubst_subst_t) (
void* ctx
);
-#ifdef QSE_CHAR_IS_MCHAR
+#if defined(QSE_CHAR_IS_MCHAR)
# define qse_strxsubst_subst_t qse_mbsxsubst_subst_t
#else
# define qse_strxsubst_subst_t qse_wcsxsubst_subst_t
@@ -298,9 +298,9 @@ typedef qse_wchar_t* (*qse_wcsxsubst_subst_t) (
} while(0)
/**
- * The qse_mbstrmx_op_t defines a string trimming operation.
+ * The qse_mbstrmx_flag_t defines a string trimming operation.
*/
-enum qse_mbstrmx_op_t
+enum qse_mbstrmx_flag_t
{
QSE_MBSTRMX_LEFT = (1 << 0), /**< trim leading spaces */
#define QSE_MBSTRMX_LEFT QSE_MBSTRMX_LEFT
@@ -309,9 +309,9 @@ enum qse_mbstrmx_op_t
};
/**
- * The qse_wcstrmx_op_t defines a string trimming operation.
+ * The qse_wcstrmx_flag_t defines a string trimming operation.
*/
-enum qse_wcstrmx_op_t
+enum qse_wcstrmx_flag_t
{
QSE_WCSTRMX_LEFT = (1 << 0), /**< trim leading spaces */
#define QSE_WCSTRMX_LEFT QSE_WCSTRMX_LEFT
@@ -319,7 +319,7 @@ enum qse_wcstrmx_op_t
#define QSE_WCSTRMX_RIGHT QSE_WCSTRMX_RIGHT
};
-#ifdef QSE_CHAR_IS_MCHAR
+#if defined(QSE_CHAR_IS_MCHAR)
# define QSE_STRTRMX_LEFT QSE_MBSTRMX_LEFT
# define QSE_STRTRMX_RIGHT QSE_MBSTRMX_RIGHT
#else
@@ -351,7 +351,7 @@ enum qse_wcsfnmat_flag_t
#define QSE_WCSFNMAT_IGNORECASE QSE_WCSFNMAT_IGNORECASE
};
-#ifdef QSE_CHAR_IS_MCHAR
+#if defined(QSE_CHAR_IS_MCHAR)
# define QSE_STRFNMAT_PATHNAME QSE_MBSFNMAT_PATHNAME
# define QSE_STRFNMAT_NOESCAPE QSE_MBSFNMAT_NOESCAPE
# define QSE_STRFNMAT_PERIOD QSE_MBSFNMAT_PERIOD
@@ -405,7 +405,7 @@ qse_size_t qse_wcsbytes (
const qse_wchar_t* str
);
-#ifdef QSE_CHAR_IS_MCHAR
+#if defined(QSE_CHAR_IS_MCHAR)
# define qse_strlen(str) qse_mbslen(str)
# define qse_strbytes(str) qse_mbsbytes(str)
#else
@@ -477,7 +477,7 @@ qse_size_t qse_wcsxncpy (
qse_size_t len /**< string length */
);
-#ifdef QSE_CHAR_IS_MCHAR
+#if defined(QSE_CHAR_IS_MCHAR)
# define qse_strcpy(buf,str) qse_mbscpy(buf,str)
# define qse_strxcpy(buf,bsz,str) qse_mbsxcpy(buf,bsz,str)
# define qse_strncpy(buf,str,len) qse_mbsncpy(buf,str,len)
@@ -535,7 +535,7 @@ qse_size_t qse_wcsxnput (
qse_size_t len
);
-#ifdef QSE_CHAR_IS_MCHAR
+#if defined(QSE_CHAR_IS_MCHAR)
# define qse_strput(buf,str) qse_mbsput(buf,str)
# define qse_strxput(buf,bsz,str) qse_mbsxput(buf,bsz,str)
# define qse_strxnput(buf,bsz,str,len) qse_mbsxnput(buf,bsz,str,len)
@@ -667,7 +667,7 @@ qse_size_t qse_wcsxfncpy (
const qse_wcstr_t str[]
);
-#ifdef QSE_CHAR_IS_MCHAR
+#if defined(QSE_CHAR_IS_MCHAR)
# define qse_strfcpy(buf,fmt,str) qse_mbsfcpy(buf,fmt,str)
# define qse_strfncpy(buf,fmt,str) qse_mbsfncpy(buf,fmt,str)
# define qse_strxfcpy(buf,bsz,fmt,str) qse_mbsxfcpy(buf,bsz,fmt,str)
@@ -731,7 +731,7 @@ qse_size_t qse_wcsxsubst (
void* ctx
);
-#ifdef QSE_CHAR_IS_MCHAR
+#if defined(QSE_CHAR_IS_MCHAR)
# define qse_strxsubst(buf,bsz,fmt,subst,ctx) qse_mbsxsubst(buf,bsz,fmt,subst,ctx)
#else
# define qse_strxsubst(buf,bsz,fmt,subst,ctx) qse_wcsxsubst(buf,bsz,fmt,subst,ctx)
@@ -797,7 +797,7 @@ qse_size_t qse_wcsxncat (
qse_size_t len
);
-#ifdef QSE_CHAR_IS_MCHAR
+#if defined(QSE_CHAR_IS_MCHAR)
# define qse_strcat(buf,str) qse_mbscat(buf,str)
# define qse_strncat(buf,str,len) qse_mbsncat(buf,str,len)
# define qse_strcatn(buf,str,n) qse_mbscatn(buf,str,n)
@@ -947,7 +947,7 @@ int qse_wcszcasecmp (
qse_size_t n
);
-#ifdef QSE_CHAR_IS_MCHAR
+#if defined(QSE_CHAR_IS_MCHAR)
# define qse_strcmp(s1,s2) qse_mbscmp(s1,s2)
# define qse_strxcmp(s1,ln1,s2) qse_mbsxcmp(s1,ln1,s2)
# define qse_strxncmp(s1,ln1,s2,ln2) qse_mbsxncmp(s1,ln1,s2,ln2)
@@ -1029,7 +1029,7 @@ qse_wchar_t* qse_wcsadup (
qse_mmgr_t* mmgr
);
-#ifdef QSE_CHAR_IS_MCHAR
+#if defined(QSE_CHAR_IS_MCHAR)
# define qse_strdup(s,mmgr) qse_mbsdup(s,mmgr)
# define qse_strdup2(s1,s2,mmgr) qse_mbsdup2(s1,s2,mmgr)
# define qse_strxdup(s,l,mmgr) qse_mbsxdup(s,l,mmgr)
@@ -1065,7 +1065,7 @@ qse_wchar_t* qse_wcstradup (
qse_mmgr_t* mmgr
);
-#ifdef QSE_CHAR_IS_MCHAR
+#if defined(QSE_CHAR_IS_MCHAR)
# define qse_cstrdup(sa,mmgr) qse_mcstrdup(sa,mmgr)
# define qse_cstradup(sa,len,mmgr) qse_mcstradup(sa,len,mmgr)
#else
@@ -1241,7 +1241,7 @@ qse_wchar_t* qse_wcsxnrcasestr (
qse_size_t subsz
);
-#ifdef QSE_CHAR_IS_MCHAR
+#if defined(QSE_CHAR_IS_MCHAR)
# define qse_strstr(str,sub) qse_mbsstr(str,sub)
# define qse_strxstr(str,size,sub) qse_mbsxstr(str,size,sub)
# define qse_strxnstr(str,strsz,sub,subsz) qse_mbsxnstr(str,strsz,sub,subsz)
@@ -1327,7 +1327,7 @@ const qse_wchar_t* qse_wcsxcaseword (
const qse_wchar_t* word
);
-#ifdef QSE_CHAR_IS_MCHAR
+#if defined(QSE_CHAR_IS_MCHAR)
# define qse_strword(str,word) qse_mbsword(str,word)
# define qse_strxword(str,len,word) qse_mbsxword(str,len,word)
# define qse_strcaseword(str,word) qse_mbscaseword(str,word)
@@ -1389,7 +1389,7 @@ qse_wchar_t* qse_wcsxrchr (
qse_wcint_t c
);
-#ifdef QSE_CHAR_IS_MCHAR
+#if defined(QSE_CHAR_IS_MCHAR)
# define qse_strchr(str,c) qse_mbschr(str,c)
# define qse_strxchr(str,len,c) qse_mbsxchr(str,len,c)
# define qse_strrchr(str,c) qse_mbsrchr(str,c)
@@ -1469,7 +1469,7 @@ qse_wchar_t* qse_wcscasebeg (
const qse_wchar_t* sub
);
-#ifdef QSE_CHAR_IS_MCHAR
+#if defined(QSE_CHAR_IS_MCHAR)
# define qse_strbeg(str,sub) qse_mbsbeg(str,sub)
# define qse_strxbeg(str,len,sub) qse_mbsxbeg(str,len,sub)
# define qse_strnbeg(str,sub,len) qse_mbsnbeg(str,sub,len)
@@ -1541,7 +1541,7 @@ qse_wchar_t* qse_wcsxnend (
qse_size_t len2
);
-#ifdef QSE_CHAR_IS_MCHAR
+#if defined(QSE_CHAR_IS_MCHAR)
# define qse_strend(str,sub) qse_mbsxend(str,sub)
# define qse_strxend(str,len,sub) qse_mbsxend(str,len,sub)
# define qse_strnend(str,sub,len) qse_mbsnend(str,sub,len)
@@ -1573,7 +1573,7 @@ qse_size_t qse_wcscspn (
const qse_wchar_t* str2
);
-#ifdef QSE_CHAR_IS_MCHAR
+#if defined(QSE_CHAR_IS_MCHAR)
# define qse_strspn(str1,str2) qse_mbsspn(str1,str2)
# define qse_strcspn(str1,str2) qse_mbscspn(str1,str2)
#else
@@ -1637,7 +1637,7 @@ qse_wchar_t* qse_wcsxrpbrk (
const qse_wchar_t* str2
);
-#ifdef QSE_CHAR_IS_MCHAR
+#if defined(QSE_CHAR_IS_MCHAR)
# define qse_strpbrk(str1,str2) qse_mbspbrk(str1,str2)
# define qse_strxpbrk(str1,len,str2) qse_mbsxpbrk(str1,len,str2)
# define qse_strrpbrk(str1,str2) qse_mbsrpbrk(str1,str2)
@@ -1751,7 +1751,7 @@ qse_size_t qse_wcsxdel (
qse_size_t n
);
-#ifdef QSE_CHAR_IS_MCHAR
+#if defined(QSE_CHAR_IS_MCHAR)
# define qse_strdel(str,pos,n) qse_mbsdel(str,pos,n)
# define qse_strxdel(str,len,pos,n) qse_mbsxdel(str,len,pos,n)
#else
@@ -1782,7 +1782,7 @@ qse_size_t qse_wcsxexcl (
const qse_wchar_t* cs
);
-#ifdef QSE_CHAR_IS_MCHAR
+#if defined(QSE_CHAR_IS_MCHAR)
# define qse_strexcl(str,cs) qse_mbsexcl(str,cs)
# define qse_strxexcl(str,len,cs) qse_mbsxexcl(str,len,cs)
#else
@@ -1812,7 +1812,7 @@ qse_size_t qse_wcsxincl (
const qse_wchar_t* cs
);
-#ifdef QSE_CHAR_IS_MCHAR
+#if defined(QSE_CHAR_IS_MCHAR)
# define qse_strincl(str,cs) qse_mbsincl(str,cs)
# define qse_strxincl(str,len,cs) qse_mbsxincl(str,len,cs)
#else
@@ -1847,7 +1847,7 @@ qse_size_t qse_wcsxset (
qse_size_t n
);
-#ifdef QSE_CHAR_IS_MCHAR
+#if defined(QSE_CHAR_IS_MCHAR)
# define qse_strset(buf,c,n) qse_mbsset(buf,c,n)
# define qse_strxset(buf,bsz,c,n) qse_mbsxset(buf,bsz,c,n)
#else
@@ -1873,7 +1873,7 @@ qse_size_t qse_wcsupr (
qse_wchar_t* str
);
-#ifdef QSE_CHAR_IS_MCHAR
+#if defined(QSE_CHAR_IS_MCHAR)
# define qse_strlwr(str) qse_mbslwr(str);
# define qse_strupr(str) qse_mbsupr(str);
#else
@@ -1900,7 +1900,7 @@ qse_size_t qse_wcsxrev (
qse_size_t len
);
-#ifdef QSE_CHAR_IS_MCHAR
+#if defined(QSE_CHAR_IS_MCHAR)
# define qse_strrev(str) qse_mbsrev(str)
# define qse_strxrev(str,len) qse_mbsxrev(str,len)
#else
@@ -1934,7 +1934,7 @@ qse_size_t qse_wcsxrot (
qse_size_t n
);
-#ifdef QSE_CHAR_IS_MCHAR
+#if defined(QSE_CHAR_IS_MCHAR)
# define qse_strrot(str,dir,n) qse_mbsrot(str,dir,n)
# define qse_strxrot(str,len,dir,n) qse_mbsrot(str,len,dir,n)
#else
@@ -2028,7 +2028,7 @@ int qse_wcsspltrn (
const qse_wchar_t* trset
);
-#ifdef QSE_CHAR_IS_MCHAR
+#if defined(QSE_CHAR_IS_MCHAR)
# define qse_strspl(str,delim,lquote,rquote,escape) qse_mbsspl(str,delim,lquote,rquote,escape)
# define qse_strspltrn(str,delim,lquote,rquote,escape,trset) qse_mbsspltrn(str,delim,lquote,rquote,escape,trset)
#else
@@ -2079,7 +2079,7 @@ qse_wchar_t* qse_wcsxntok (
qse_wcstr_t* tok
);
-#ifdef QSE_CHAR_IS_MCHAR
+#if defined(QSE_CHAR_IS_MCHAR)
# define qse_strtok(s,d,t) qse_mbstok(s,d,t)
# define qse_strxtok(s,len,d,t) qse_mbsxtok(s,len,d,t)
# define qse_strxntok(s,len,d,dl,t) qse_mbsxntok(s,len,d,dl,t)
@@ -2111,8 +2111,14 @@ qse_wchar_t* qse_wcsxntok (
* @return pointer to a trimmed string.
*/
qse_mchar_t* qse_mbstrmx (
- qse_mchar_t* str, /**< string */
- int opt /**< option OR'ed of #qse_mbstrmx_op_t values */
+ qse_mchar_t* str, /**< string */
+ int flags /**< option OR'ed of #qse_mbstrmx_flag_t values */
+);
+
+qse_mchar_t* qse_mbsxtrmx (
+ qse_mchar_t* str, /**< string */
+ qse_size_t* len, /**< [IN/OUT] length */
+ int flags /**< option OR'ed of #qse_mbstrmx_flag_t values */
);
/**
@@ -2137,8 +2143,14 @@ qse_mchar_t* qse_mbstrmx (
* @return pointer to a trimmed string.
*/
qse_wchar_t* qse_wcstrmx (
- qse_wchar_t* str, /**< a string */
- int opt /**< option OR'ed of #qse_wcstrmx_op_t values */
+ qse_wchar_t* str, /**< string */
+ int flags /**< option OR'ed of #qse_wcstrmx_flag_t values */
+);
+
+qse_wchar_t* qse_wcsxtrmx (
+ qse_wchar_t* str, /**< string */
+ qse_size_t* len, /**< [IN/OUT] length */
+ int flags /**< option OR'ed of #qse_wcstrmx_flag_t values */
);
/**
@@ -2187,14 +2199,16 @@ qse_size_t qse_wcsxtrm (
qse_size_t len /**< length */
);
-#ifdef QSE_CHAR_IS_MCHAR
-# define qse_strtrmx(str,opt) qse_mbstrmx(str,opt)
-# define qse_strtrm(str) qse_mbstrm(str)
-# define qse_strxtrm(str,len) qse_mbsxtrm(str,len)
+#if defined(QSE_CHAR_IS_MCHAR)
+# define qse_strtrmx(str,opt) qse_mbstrmx(str,opt)
+# define qse_strxtrmx(str,len,opt) qse_mbsxtrmx(str,len,opt)
+# define qse_strtrm(str) qse_mbstrm(str)
+# define qse_strxtrm(str,len) qse_mbsxtrm(str,len)
#else
-# define qse_strtrmx(str,opt) qse_wcstrmx(str,opt)
-# define qse_strtrm(str) qse_wcstrm(str)
-# define qse_strxtrm(str,len) qse_wcsxtrm(str,len)
+# define qse_strtrmx(str,opt) qse_wcstrmx(str,opt)
+# define qse_strxtrmx(str,len,opt) qse_wcsxtrmx(str,len,opt)
+# define qse_strtrm(str) qse_wcstrm(str)
+# define qse_strxtrm(str,len) qse_wcsxtrm(str,len)
#endif
/**
@@ -2236,7 +2250,7 @@ qse_size_t qse_wcsxpac (
qse_size_t len /**< length */
);
-#ifdef QSE_CHAR_IS_MCHAR
+#if defined(QSE_CHAR_IS_MCHAR)
# define qse_strpac(str) qse_mbspac(str)
# define qse_strxpac(str,len) qse_mbsxpac(str,len)
#else
@@ -2300,7 +2314,7 @@ int qse_wcsxnfnmat (
int flags
);
-#ifdef QSE_CHAR_IS_MCHAR
+#if defined(QSE_CHAR_IS_MCHAR)
# define qse_strfnmat(str,ptn,flags) qse_mbsfnmat(str,ptn,flags)
# define qse_strxfnmat(str,slen,ptn,flags) qse_mbsxfnmat(str,slen,ptn,flags)
# define qse_strnfnmat(str,ptn,plen,flags) qse_mbsnfnmat(str,ptn,plen,flags)
@@ -2671,7 +2685,7 @@ qse_size_t qse_wcs_pac (
qse_wcs_t* str
);
-#ifdef QSE_CHAR_IS_MCHAR
+#if defined(QSE_CHAR_IS_MCHAR)
# define qse_str_setmmgr(str,mmgr) qse_mbs_wetmmgr(str,mmgr)
# define qse_str_getmmgr(str) qse_mbs_getmmgr(str)
# define qse_str_open(mmgr,ext,capa) qse_mbs_open(mmgr,ext,capa)
diff --git a/qse/lib/awk/parse.c b/qse/lib/awk/parse.c
index ba12f452..19eb37c3 100644
--- a/qse/lib/awk/parse.c
+++ b/qse/lib/awk/parse.c
@@ -5566,7 +5566,7 @@ static int get_string (
return 0;
}
-static int get_charstr (qse_awk_t* awk, qse_awk_tok_t* tok)
+static int get_charstr (qse_awk_t* awk, qse_awk_tok_t* tok, qse_char_t c)
{
if (awk->sio.last.c != QSE_T('\"'))
{
@@ -5961,10 +5961,11 @@ retry:
type = classify_ident (awk, QSE_STR_CSTR(tok->name));
SET_TOKEN_TYPE (awk, tok, type);
}
- else if (c == QSE_T('\"'))
+ else if (c == QSE_T('\"') || c == QSE_T('\''))
{
SET_TOKEN_TYPE (awk, tok, TOK_STR);
- if (get_charstr(awk, tok) <= -1) return -1;
+ /*if (get_charstr(awk, tok, c) <= -1) return -1;*/
+ if (get_string (awk, c, QSE_T('\\'), 0, 0, tok) <= -1) return -1;
}
else
{
diff --git a/qse/lib/cmn/nwif-cfg.c b/qse/lib/cmn/nwif-cfg.c
index b38b801d..75cf0561 100644
--- a/qse/lib/cmn/nwif-cfg.c
+++ b/qse/lib/cmn/nwif-cfg.c
@@ -274,6 +274,29 @@ void qse_freenwifcfg (qse_nwifcfg_t* cfg)
#endif
+#if defined(__linux)
+static void read_proc_net_if_inet6 (qse_nwifcfg_t* cfg, struct ifreq* ifr)
+{
+#if 0
+ qse_sio_t* sio;
+ qse_mchar_t line[128];
+
+ /* TODO */
+ sio = qse_sio_open (QSE_MMGR_GETDFL(), 0,
+ QSE_T("proc/net/if_inet6"), QSE_SIO_IGNOREMBWCERR | QSE_SIO_READ);
+ if (sio)
+ {
+ qse_ssize_t x;
+ while (1)
+ {
+ x = qse_sio_getmbs (sio, line, QSE_COUNTOF(line));
+ if (x == -1) break;
+ }
+ qse_sio_close (sio);
+ }
+#endif
+}
+#endif
static int get_nwifcfg (int s, qse_nwifcfg_t* cfg, struct ifreq* ifr)
{
@@ -488,10 +511,19 @@ static int get_nwifcfg (int s, qse_nwifcfg_t* cfg, struct ifreq* ifr)
if (ioctl (s, SIOCGIFADDR, ifr) >= 0)
qse_skadtonwad (&ifr->ifr_addr, &cfg->addr);
-
+
if (ioctl (s, SIOCGIFNETMASK, ifr) >= 0)
qse_skadtonwad (&ifr->ifr_addr, &cfg->mask);
+ #if defined(__linux)
+ if (cfg->addr.type == QSE_NWAD_NX && cfg->mask.type == QSE_NWAD_NX)
+ {
+ /* access /proc/net/if_inet6 */
+ read_proc_net_if_inet6 (cfg, ifr);
+ }
+ #endif
+
+
if ((cfg->flags & QSE_NWIFCFG_BCAST) &&
ioctl (s, SIOCGIFBRDADDR, ifr) >= 0)
{
@@ -589,6 +621,9 @@ for (i = 0; i < drvinfo.n_stats; i++)
#endif
}
+/* TOOD: consider how to handle multiple IPv6 addresses on a single interfce.
+ * consider how to get IPv4 addresses on an aliased interface? so mutliple ipv4 addresses */
+
int qse_getnwifcfg (qse_nwifcfg_t* cfg)
{
#if defined(_WIN32)
diff --git a/qse/lib/cmn/str-trm.c b/qse/lib/cmn/str-trm.c
index 6be6764d..e3e73ac8 100644
--- a/qse/lib/cmn/str-trm.c
+++ b/qse/lib/cmn/str-trm.c
@@ -25,24 +25,162 @@
qse_mchar_t* qse_mbstrmx (qse_mchar_t* str, int opt)
{
qse_mchar_t* p = str;
- qse_mchar_t* s = QSE_NULL, * e = QSE_NULL;
- while (*p != QSE_MT('\0'))
+ if (*p != QSE_MT('\0'))
{
- if (!QSE_ISMSPACE(*p))
- {
- if (s == QSE_NULL) s = p;
- e = p;
- }
- p++;
- }
+ qse_mchar_t* s = QSE_NULL, * e = QSE_NULL;
- if (opt & QSE_MBSTRMX_RIGHT) e[1] = QSE_MT('\0');
- if (opt & QSE_MBSTRMX_LEFT) str = s;
+ do
+ {
+ if (!QSE_ISMSPACE(*p))
+ {
+ if (s == QSE_NULL) s = p;
+ e = p;
+ }
+ p++;
+ }
+ while (*p != QSE_MT('\0'));
+
+
+ if (e)
+ {
+ if (opt & QSE_MBSTRMX_RIGHT) e[1] = QSE_MT('\0');
+ if (opt & QSE_MBSTRMX_LEFT) str = s;
+ }
+ else
+ {
+ /* the entire string need to ne deleted */
+ if ((opt & QSE_MBSTRMX_RIGHT) ||
+ (opt && QSE_MBSTRMX_LEFT)) str[0] = QSE_MT('\0');
+ }
+ }
return str;
}
+qse_mchar_t* qse_mbsxtrmx (qse_mchar_t* str, qse_size_t* len, int opt)
+{
+ qse_mchar_t* p = str, * end = str + *len;
+
+ if (p < end)
+ {
+ qse_mchar_t* s = QSE_NULL, * e = QSE_NULL;
+
+ do
+ {
+ if (!QSE_ISMSPACE(*p))
+ {
+ if (s == QSE_NULL) s = p;
+ e = p;
+ }
+ p++;
+ }
+ while (p < end);
+
+ if (e)
+ {
+ if (opt & QSE_MBSTRMX_RIGHT)
+ {
+ *len -= end - e - 1;
+ }
+ if (opt & QSE_MBSTRMX_LEFT)
+ {
+ *len -= s - str;
+ str = s;
+ }
+ }
+ else
+ {
+ /* the entire string need to ne deleted */
+ if ((opt & QSE_MBSTRMX_RIGHT) ||
+ (opt && QSE_MBSTRMX_LEFT)) *len = 0;
+ }
+ }
+
+ return str;
+}
+
+
+qse_wchar_t* qse_wcstrmx (qse_wchar_t* str, int opt)
+{
+ qse_wchar_t* p = str;
+
+ if (*p != QSE_MT('\0'))
+ {
+ qse_wchar_t* s = QSE_NULL, * e = QSE_NULL;
+
+ do
+ {
+ if (!QSE_ISWSPACE(*p))
+ {
+ if (s == QSE_NULL) s = p;
+ e = p;
+ }
+ p++;
+ }
+ while (*p != QSE_MT('\0'));
+
+
+ if (e)
+ {
+ if (opt & QSE_WCSTRMX_RIGHT) e[1] = QSE_MT('\0');
+ if (opt & QSE_WCSTRMX_LEFT) str = s;
+ }
+ else
+ {
+ /* the entire string need to ne deleted */
+ if ((opt & QSE_WCSTRMX_RIGHT) ||
+ (opt && QSE_WCSTRMX_LEFT)) str[0] = QSE_MT('\0');
+ }
+ }
+
+ return str;
+}
+
+qse_wchar_t* qse_wcsxtrmx (qse_wchar_t* str, qse_size_t* len, int opt)
+{
+ qse_wchar_t* p = str, * end = str + *len;
+
+ if (p < end)
+ {
+ qse_wchar_t* s = QSE_NULL, * e = QSE_NULL;
+
+ do
+ {
+ if (!QSE_ISWSPACE(*p))
+ {
+ if (s == QSE_NULL) s = p;
+ e = p;
+ }
+ p++;
+ }
+ while (p < end);
+
+ if (e)
+ {
+ if (opt & QSE_WCSTRMX_RIGHT)
+ {
+ *len -= end - e - 1;
+ }
+ if (opt & QSE_WCSTRMX_LEFT)
+ {
+ *len -= s - str;
+ str = s;
+ }
+ }
+ else
+ {
+ /* the entire string need to ne deleted */
+ if ((opt & QSE_WCSTRMX_RIGHT) ||
+ (opt && QSE_WCSTRMX_LEFT)) *len = 0;
+ }
+ }
+
+ return str;
+}
+
+/* -------------------------------------------------------------- */
+
qse_size_t qse_mbstrm (qse_mchar_t* str)
{
qse_mchar_t* p = str;
@@ -58,7 +196,7 @@ qse_size_t qse_mbstrm (qse_mchar_t* str)
p++;
}
- if (e != QSE_NULL)
+ if (e)
{
e[1] = QSE_MT('\0');
if (str != s)
@@ -99,27 +237,6 @@ qse_size_t qse_mbsxtrm (qse_mchar_t* str, qse_size_t len)
return 0;
}
-qse_wchar_t* qse_wcstrmx (qse_wchar_t* str, int opt)
-{
- qse_wchar_t* p = str;
- qse_wchar_t* s = QSE_NULL, * e = QSE_NULL;
-
- while (*p != QSE_MT('\0'))
- {
- if (!QSE_ISWSPACE(*p))
- {
- if (s == QSE_NULL) s = p;
- e = p;
- }
- p++;
- }
-
- if (opt & QSE_WCSTRMX_RIGHT) e[1] = QSE_MT('\0');
- if (opt & QSE_WCSTRMX_LEFT) str = s;
-
- return str;
-}
-
qse_size_t qse_wcstrm (qse_wchar_t* str)
{
qse_wchar_t* p = str;
@@ -135,7 +252,7 @@ qse_size_t qse_wcstrm (qse_wchar_t* str)
p++;
}
- if (e != QSE_NULL)
+ if (e)
{
e[1] = QSE_MT('\0');
if (str != s)
diff --git a/qse/mod/awk/Makefile.am b/qse/mod/awk/Makefile.am
index ea4048f1..0791bf30 100644
--- a/qse/mod/awk/Makefile.am
+++ b/qse/mod/awk/Makefile.am
@@ -15,6 +15,11 @@ libqseawk_sys_la_SOURCES = sys.c
libqseawk_sys_la_LDFLAGS = $(LDFLAGS_COMMON)
libqseawk_sys_la_LIBADD = $(LIBADD_COMMON)
+mod_LTLIBRARIES += libqseawk-str.la
+libqseawk_str_la_SOURCES = str.c
+libqseawk_str_la_LDFLAGS = $(LDFLAGS_COMMON)
+libqseawk_str_la_LIBADD = $(LIBADD_COMMON)
+
mod_LTLIBRARIES += libqseawk-dir.la
libqseawk_dir_la_SOURCES = dir.c
libqseawk_dir_la_LDFLAGS = $(LDFLAGS_COMMON)
diff --git a/qse/mod/awk/Makefile.in b/qse/mod/awk/Makefile.in
index eb6bb63f..d7ca43b3 100644
--- a/qse/mod/awk/Makefile.in
+++ b/qse/mod/awk/Makefile.in
@@ -97,6 +97,12 @@ libqseawk_mpi_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \
$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
$(libqseawk_mpi_la_LDFLAGS) $(LDFLAGS) -o $@
@HAVE_C_MPI_TRUE@am_libqseawk_mpi_la_rpath = -rpath $(moddir)
+libqseawk_str_la_DEPENDENCIES = $(am__DEPENDENCIES_1)
+am_libqseawk_str_la_OBJECTS = str.lo
+libqseawk_str_la_OBJECTS = $(am_libqseawk_str_la_OBJECTS)
+libqseawk_str_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+ $(libqseawk_str_la_LDFLAGS) $(LDFLAGS) -o $@
libqseawk_sys_la_DEPENDENCIES = $(am__DEPENDENCIES_1)
am_libqseawk_sys_la_OBJECTS = sys.lo
libqseawk_sys_la_OBJECTS = $(am_libqseawk_sys_la_OBJECTS)
@@ -126,10 +132,11 @@ LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
--mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
$(LDFLAGS) -o $@
SOURCES = $(libqseawk_dir_la_SOURCES) $(libqseawk_mpi_la_SOURCES) \
- $(libqseawk_sys_la_SOURCES) $(libqseawk_uci_la_SOURCES)
+ $(libqseawk_str_la_SOURCES) $(libqseawk_sys_la_SOURCES) \
+ $(libqseawk_uci_la_SOURCES)
DIST_SOURCES = $(libqseawk_dir_la_SOURCES) \
$(am__libqseawk_mpi_la_SOURCES_DIST) \
- $(libqseawk_sys_la_SOURCES) \
+ $(libqseawk_str_la_SOURCES) $(libqseawk_sys_la_SOURCES) \
$(am__libqseawk_uci_la_SOURCES_DIST)
ETAGS = etags
CTAGS = ctags
@@ -314,11 +321,14 @@ AM_CPPFLAGS = \
LDFLAGS_COMMON = -L$(abs_builddir)/../../lib/cmn -L$(abs_builddir)/../../lib/awk -L$(libdir) -no-undefined -version-info 1:0:0
LIBADD_COMMON = -lqseawk -lqsecmn
moddir = $(libdir)
-mod_LTLIBRARIES = libqseawk-sys.la libqseawk-dir.la $(am__append_1) \
- $(am__append_2)
+mod_LTLIBRARIES = libqseawk-sys.la libqseawk-str.la libqseawk-dir.la \
+ $(am__append_1) $(am__append_2)
libqseawk_sys_la_SOURCES = sys.c
libqseawk_sys_la_LDFLAGS = $(LDFLAGS_COMMON)
libqseawk_sys_la_LIBADD = $(LIBADD_COMMON)
+libqseawk_str_la_SOURCES = str.c
+libqseawk_str_la_LDFLAGS = $(LDFLAGS_COMMON)
+libqseawk_str_la_LIBADD = $(LIBADD_COMMON)
libqseawk_dir_la_SOURCES = dir.c
libqseawk_dir_la_LDFLAGS = $(LDFLAGS_COMMON)
libqseawk_dir_la_LIBADD = $(LIBADD_COMMON)
@@ -398,6 +408,8 @@ libqseawk-dir.la: $(libqseawk_dir_la_OBJECTS) $(libqseawk_dir_la_DEPENDENCIES) $
$(libqseawk_dir_la_LINK) -rpath $(moddir) $(libqseawk_dir_la_OBJECTS) $(libqseawk_dir_la_LIBADD) $(LIBS)
libqseawk-mpi.la: $(libqseawk_mpi_la_OBJECTS) $(libqseawk_mpi_la_DEPENDENCIES) $(EXTRA_libqseawk_mpi_la_DEPENDENCIES)
$(libqseawk_mpi_la_LINK) $(am_libqseawk_mpi_la_rpath) $(libqseawk_mpi_la_OBJECTS) $(libqseawk_mpi_la_LIBADD) $(LIBS)
+libqseawk-str.la: $(libqseawk_str_la_OBJECTS) $(libqseawk_str_la_DEPENDENCIES) $(EXTRA_libqseawk_str_la_DEPENDENCIES)
+ $(libqseawk_str_la_LINK) -rpath $(moddir) $(libqseawk_str_la_OBJECTS) $(libqseawk_str_la_LIBADD) $(LIBS)
libqseawk-sys.la: $(libqseawk_sys_la_OBJECTS) $(libqseawk_sys_la_DEPENDENCIES) $(EXTRA_libqseawk_sys_la_DEPENDENCIES)
$(libqseawk_sys_la_LINK) -rpath $(moddir) $(libqseawk_sys_la_OBJECTS) $(libqseawk_sys_la_LIBADD) $(LIBS)
libqseawk-uci.la: $(libqseawk_uci_la_OBJECTS) $(libqseawk_uci_la_DEPENDENCIES) $(EXTRA_libqseawk_uci_la_DEPENDENCIES)
@@ -411,6 +423,7 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dir.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libqseawk_mpi_la-mpi.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/str.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sys.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/uci.Plo@am__quote@
diff --git a/qse/mod/awk/dir.c b/qse/mod/awk/dir.c
index 8fc18b0f..79e20470 100644
--- a/qse/mod/awk/dir.c
+++ b/qse/mod/awk/dir.c
@@ -344,7 +344,7 @@ static int fnc_dir_close (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi)
return 0;
}
-static int fnc_dir_reset (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi)
+static int fnc_dir_reset (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi)
{
dir_list_t* list;
qse_awk_val_t* retv;
diff --git a/qse/mod/awk/str.c b/qse/mod/awk/str.c
new file mode 100644
index 00000000..3682fefb
--- /dev/null
+++ b/qse/mod/awk/str.c
@@ -0,0 +1,158 @@
+/*
+ * $Id$
+ *
+ Copyright 2006-2012 Chung, Hyung-Hwan.
+ This file is part of QSE.
+
+ QSE is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as
+ published by the Free Software Foundation, either version 3 of
+ the License, or (at your option) any later version.
+
+ QSE is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with QSE. If not, see .
+ */
+
+#include
+#include
+#include "../../lib/cmn/mem.h"
+
+static int trim (qse_awk_rtx_t* rtx, int flags)
+{
+ qse_xstr_t path;
+ qse_char_t* npath;
+ qse_awk_val_t* retv;
+
+ path.ptr = qse_awk_rtx_valtostrdup (
+ rtx, qse_awk_rtx_getarg(rtx, 0), &path.len);
+ if (path.ptr)
+ {
+ npath = qse_strxtrmx (path.ptr, &path.len, flags);
+
+ retv = qse_awk_rtx_makestrval (rtx, npath, path.len);
+ qse_awk_rtx_freemem (rtx, path.ptr);
+ if (retv == QSE_NULL) return -1;
+
+ qse_awk_rtx_setretval (rtx, retv);
+ }
+
+ return 0;
+}
+
+static int fnc_trim (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi)
+{
+ return trim (rtx, QSE_STRTRMX_LEFT | QSE_STRTRMX_RIGHT);
+}
+static int fnc_ltrim (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi)
+{
+ return trim (rtx, QSE_STRTRMX_LEFT);
+}
+static int fnc_rtrim (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi)
+{
+ return trim (rtx, QSE_STRTRMX_RIGHT);
+}
+
+typedef struct fnctab_t fnctab_t;
+struct fnctab_t
+{
+ const qse_char_t* name;
+ qse_awk_mod_sym_fnc_t info;
+};
+
+static fnctab_t fnctab[] =
+{
+ /* keep this table sorted for binary search in query(). */
+ { QSE_T("ltrim"), { { 1, 1, QSE_NULL }, fnc_ltrim, 0 } },
+ { QSE_T("rtrim"), { { 1, 1, QSE_NULL }, fnc_rtrim, 0 } },
+ { QSE_T("trim"), { { 1, 1, QSE_NULL }, fnc_trim, 0 } }
+};
+
+static int query (qse_awk_mod_t* mod, qse_awk_t* awk, const qse_char_t* name, qse_awk_mod_sym_t* sym)
+{
+ qse_cstr_t ea;
+ int left, right, mid, n;
+
+ left = 0; right = QSE_COUNTOF(fnctab) - 1;
+
+ while (left <= right)
+ {
+ mid = (left + right) / 2;
+
+ n = qse_strcmp (fnctab[mid].name, name);
+ if (n > 0) right = mid - 1;
+ else if (n < 0) left = mid + 1;
+ else
+ {
+ sym->type = QSE_AWK_MOD_FNC;
+ sym->u.fnc = fnctab[mid].info;
+ return 0;
+ }
+ }
+
+#if 0
+ left = 0; right = QSE_COUNTOF(inttab) - 1;
+ while (left <= right)
+ {
+ mid = (left + right) / 2;
+
+ n = qse_strcmp (inttab[mid].name, name);
+ if (n > 0) right = mid - 1;
+ else if (n < 0) left = mid + 1;
+ else
+ {
+ sym->type = QSE_AWK_MOD_INT;
+ sym->u.in = inttab[mid].info;
+ return 0;
+ }
+ }
+#endif
+
+ ea.ptr = name;
+ ea.len = qse_strlen(name);
+ qse_awk_seterror (awk, QSE_AWK_ENOENT, &ea, QSE_NULL);
+ return -1;
+}
+
+/* TODO: proper resource management */
+
+static int init (qse_awk_mod_t* mod, qse_awk_rtx_t* rtx)
+{
+ return 0;
+}
+
+static void fini (qse_awk_mod_t* mod, qse_awk_rtx_t* rtx)
+{
+ /* TODO:
+ for (each pid for rtx) kill (pid, SIGKILL);
+ for (each pid for rtx) waitpid (pid, QSE_NULL, 0);
+ */
+}
+
+static void unload (qse_awk_mod_t* mod, qse_awk_t* awk)
+{
+ /* TODO: anything */
+}
+
+QSE_EXPORT int load (qse_awk_mod_t* mod, qse_awk_t* awk)
+{
+ mod->query = query;
+ mod->unload = unload;
+
+ mod->init = init;
+ mod->fini = fini;
+ /*
+ mod->ctx...
+ */
+
+ return 0;
+}
+
+#if defined(__DOS__)
+/* kind of DllMain() for Causeway DLL */
+int main (int eax) { return 0; }
+#endif