reorganized strjoin and related functions

added qse_thr_t
This commit is contained in:
2015-09-23 13:34:04 +00:00
parent e11704ce16
commit e4a3026dc1
21 changed files with 1094 additions and 230 deletions

View File

@ -15,6 +15,7 @@ noinst_HEADERS = \
fs.h \
glob.h \
mem.h \
str-cat.h \
str-dyn.h \
str-fcpy.h \
str-fmt.h \

View File

@ -458,6 +458,7 @@ noinst_HEADERS = \
fs.h \
glob.h \
mem.h \
str-cat.h \
str-dyn.h \
str-fcpy.h \
str-fmt.h \

View File

@ -26,162 +26,42 @@
#include <qse/cmn/str.h>
qse_size_t qse_mbscat (qse_mchar_t* buf, const qse_mchar_t* str)
{
qse_mchar_t* org = buf;
buf += qse_mbslen(buf);
while ((*buf++ = *str++) != QSE_MT('\0'));
return buf - org - 1;
}
#undef T
#undef char_t
#undef strcat
#undef strncat
#undef strcatn
#undef strxcat
#undef strxncat
#undef strlen
qse_size_t qse_mbsncat (qse_mchar_t* buf, const qse_mchar_t* str, qse_size_t len)
{
qse_size_t x;
const qse_mchar_t* end = str + len;
#define T(x) QSE_MT(x)
#define char_t qse_mchar_t
#define strcat qse_mbscat
#define strncat qse_mbsncat
#define strcatn qse_mbscatn
#define strxcat qse_mbsxcat
#define strxncat qse_mbsxncat
#define strlen qse_mbslen
#include "str-cat.h"
x = qse_mbslen(buf); buf += x;
while (str < end) *buf++ = *str++;
*buf = QSE_MT('\0');
return len + x;
}
/* ----------------------------------- */
qse_size_t qse_mbscatn (qse_mchar_t* buf, const qse_mchar_t* str, qse_size_t n)
{
qse_size_t x;
qse_mchar_t* org = buf;
const qse_mchar_t* end = str + n;
x = qse_mbslen(buf); buf += x;
while (str < end)
{
if ((*buf++ = *str++) == QSE_MT('\0')) return buf - org - 1;
}
return n + x;
}
qse_size_t qse_mbsxcat (qse_mchar_t* buf, qse_size_t bsz, const qse_mchar_t* str)
{
qse_mchar_t* p, * p2;
qse_size_t blen;
blen = qse_mbslen(buf);
if (blen >= bsz) return blen; /* something wrong */
p = buf + blen;
p2 = buf + bsz - 1;
while (p < p2)
{
if (*str == QSE_MT('\0')) break;
*p++ = *str++;
}
if (bsz > 0) *p = QSE_MT('\0');
return p - buf;
}
qse_size_t qse_mbsxncat (
qse_mchar_t* buf, qse_size_t bsz, const qse_mchar_t* str, qse_size_t len)
{
qse_mchar_t* p, * p2;
const qse_mchar_t* end;
qse_size_t blen;
blen = qse_mbslen(buf);
if (blen >= bsz) return blen; /* something wrong */
p = buf + blen;
p2 = buf + bsz - 1;
end = str + len;
while (p < p2)
{
if (str >= end) break;
*p++ = *str++;
}
if (bsz > 0) *p = QSE_MT('\0');
return p - buf;
}
qse_size_t qse_wcscat (qse_wchar_t* buf, const qse_wchar_t* str)
{
qse_wchar_t* org = buf;
buf += qse_wcslen(buf);
while ((*buf++ = *str++) != QSE_WT('\0'));
return buf - org - 1;
}
qse_size_t qse_wcsncat (qse_wchar_t* buf, const qse_wchar_t* str, qse_size_t len)
{
qse_size_t x;
const qse_wchar_t* end = str + len;
x = qse_wcslen(buf); buf += x;
while (str < end) *buf++ = *str++;
*buf = QSE_WT('\0');
return len + x;
}
qse_size_t qse_wcscatn (qse_wchar_t* buf, const qse_wchar_t* str, qse_size_t n)
{
qse_size_t x;
qse_wchar_t* org = buf;
const qse_wchar_t* end = str + n;
x = qse_wcslen(buf); buf += x;
while (str < end)
{
if ((*buf++ = *str++) == QSE_WT('\0')) return buf - org - 1;
}
return n + x;
}
qse_size_t qse_wcsxcat (qse_wchar_t* buf, qse_size_t bsz, const qse_wchar_t* str)
{
qse_wchar_t* p, * p2;
qse_size_t blen;
blen = qse_wcslen(buf);
if (blen >= bsz) return blen; /* something wrong */
p = buf + blen;
p2 = buf + bsz - 1;
while (p < p2)
{
if (*str == QSE_WT('\0')) break;
*p++ = *str++;
}
if (bsz > 0) *p = QSE_WT('\0');
return p - buf;
}
qse_size_t qse_wcsxncat (
qse_wchar_t* buf, qse_size_t bsz, const qse_wchar_t* str, qse_size_t len)
{
qse_wchar_t* p, * p2;
const qse_wchar_t* end;
qse_size_t blen;
blen = qse_wcslen(buf);
if (blen >= bsz) return blen; /* something wrong */
p = buf + blen;
p2 = buf + bsz - 1;
end = str + len;
while (p < p2)
{
if (str >= end) break;
*p++ = *str++;
}
if (bsz > 0) *p = QSE_WT('\0');
return p - buf;
}
#undef T
#undef char_t
#undef strcat
#undef strncat
#undef strcatn
#undef strxcat
#undef strxncat
#undef strlen
#define T(x) QSE_WT(x)
#define char_t qse_wchar_t
#define strcat qse_wcscat
#define strncat qse_wcsncat
#define strcatn qse_wcscatn
#define strxcat qse_wcsxcat
#define strxncat qse_wcsxncat
#define strlen qse_wcslen
#include "str-cat.h"

109
qse/lib/cmn/str-cat.h Normal file
View File

@ -0,0 +1,109 @@
/*
* $Id$
*
Copyright (c) 2006-2014 Chung, Hyung-Hwan. 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.
THIS SOFTWARE IS PROVIDED BY THE AUTHOR "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 AUTHOR 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.
*/
#if !defined(char_t) && !defined(strcat) && !defined(strxcat)
# error Never include this file
#endif
qse_size_t strcat (char_t* buf, const char_t* str)
{
char_t* org = buf;
buf += strlen(buf);
while ((*buf++ = *str++) != T('\0'));
return buf - org - 1;
}
qse_size_t strncat (char_t* buf, const char_t* str, qse_size_t len)
{
qse_size_t x;
const char_t* end = str + len;
x = strlen(buf); buf += x;
while (str < end) *buf++ = *str++;
*buf = T('\0');
return len + x;
}
qse_size_t strcatn (char_t* buf, const char_t* str, qse_size_t n)
{
qse_size_t x;
char_t* org = buf;
const char_t* end = str + n;
x = strlen(buf); buf += x;
while (str < end)
{
/* copies not more than n characters and stop if '\0' is met */
if ((*buf++ = *str++) == T('\0')) return buf - org - 1;
}
return n + x;
}
qse_size_t strxcat (char_t* buf, qse_size_t bsz, const char_t* str)
{
char_t* p, * p2;
qse_size_t blen;
blen = strlen(buf);
if (blen >= bsz) return blen; /* something wrong */
p = buf + blen;
p2 = buf + bsz - 1;
while (p < p2)
{
if (*str == T('\0')) break;
*p++ = *str++;
}
if (bsz > 0) *p = T('\0');
return p - buf;
}
qse_size_t strxncat (char_t* buf, qse_size_t bsz, const char_t* str, qse_size_t len)
{
char_t* p, * p2;
const char_t* end;
qse_size_t blen;
blen = strlen(buf);
if (blen >= bsz) return blen; /* something wrong */
p = buf + blen;
p2 = buf + bsz - 1;
end = str + len;
while (p < p2)
{
if (str >= end) break;
*p++ = *str++;
}
if (bsz > 0) *p = T('\0');
return p - buf;
}

View File

@ -24,8 +24,7 @@
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
qse_size_t strfcpy (
char_t* buf, const char_t* fmt, const char_t* str[])
qse_size_t strfcpy (char_t* buf, const char_t* fmt, const char_t* str[])
{
char_t* b = buf;
const char_t* f = fmt;
@ -69,8 +68,7 @@ qse_size_t strfcpy (
return b - buf;
}
qse_size_t strfncpy (
char_t* buf, const char_t* fmt, const cstr_t str[])
qse_size_t strfncpy (char_t* buf, const char_t* fmt, const cstr_t str[])
{
char_t* b = buf;
const char_t* f = fmt;
@ -123,9 +121,7 @@ qse_size_t strfncpy (
return b - buf;
}
qse_size_t strxfcpy (
char_t* buf, qse_size_t bsz,
const char_t* fmt, const char_t* str[])
qse_size_t strxfcpy (char_t* buf, qse_size_t bsz, const char_t* fmt, const char_t* str[])
{
char_t* b = buf;
char_t* end = buf + bsz - 1;
@ -185,9 +181,7 @@ fini:
return b - buf;
}
qse_size_t strxfncpy (
char_t* buf, qse_size_t bsz,
const char_t* fmt, const cstr_t str[])
qse_size_t strxfncpy (char_t* buf, qse_size_t bsz, const char_t* fmt, const cstr_t str[])
{
char_t* b = buf;
char_t* end = buf + bsz - 1;

View File

@ -25,7 +25,6 @@
*/
#include <qse/cmn/str.h>
#include <stdarg.h>
/* ----------------------------------- */
@ -64,20 +63,3 @@
#define strcpy qse_wcscpy
#define strxcpy qse_wcsxcpy
#include "str-join.h"
#undef char_t
#undef strjoin
#undef strjoinv
#undef strxjoin
#undef strxjoinv
#undef strcpy
#undef strxcpy
#define char_t qse_char_t
#define strjoin qse_strjoin
#define strjoinv qse_strjoinv
#define strxjoin qse_strxjoin
#define strxjoinv qse_strxjoinv
#define strcpy qse_strcpy
#define strxcpy qse_strxcpy
#include "str-join.h"

View File

@ -47,7 +47,6 @@ qse_size_t strxjoinv (char_t* buf, qse_size_t size, va_list ap)
return size - left;
}
qse_size_t strxjoin (char_t* buf, qse_size_t size, ...)
{
va_list ap;

View File

@ -4,11 +4,12 @@ AM_CPPFLAGS = \
-I$(top_builddir)/include \
-I$(top_srcdir)/include
lib_LTLIBRARIES =
#lib_LTLIBRARIES = libqsesys.la
#libqsesys_la_SOURCES =
#libqsesys_la_LDFLAGS = -L../cmn -version-info 1:0:0 -no-undefined
#libqsesys_la_LIBADD = -lqsecmn
lib_LTLIBRARIES = libqsesys.la
libqsesys_la_SOURCES = \
thr.c \
thr.h
libqsesys_la_LDFLAGS = -L../cmn -version-info 1:0:0 -no-undefined
libqsesys_la_LIBADD = -lqsecmn
if ENABLE_CXX
lib_LTLIBRARIES += libqsesysxx.la

View File

@ -78,10 +78,6 @@ PRE_UNINSTALL = :
POST_UNINSTALL = :
build_triplet = @build@
host_triplet = @host@
#lib_LTLIBRARIES = libqsesys.la
#libqsesys_la_SOURCES =
#libqsesys_la_LDFLAGS = -L../cmn -version-info 1:0:0 -no-undefined
#libqsesys_la_LIBADD = -lqsecmn
@ENABLE_CXX_TRUE@am__append_1 = libqsesysxx.la
subdir = lib/sys
DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
@ -130,14 +126,20 @@ am__uninstall_files_from_dir = { \
}
am__installdirs = "$(DESTDIR)$(libdir)"
LTLIBRARIES = $(lib_LTLIBRARIES)
libqsesysxx_la_DEPENDENCIES =
am__libqsesysxx_la_SOURCES_DIST = SocketAddress.cpp
@ENABLE_CXX_TRUE@am_libqsesysxx_la_OBJECTS = SocketAddress.lo
libqsesysxx_la_OBJECTS = $(am_libqsesysxx_la_OBJECTS)
libqsesys_la_DEPENDENCIES =
am_libqsesys_la_OBJECTS = thr.lo
libqsesys_la_OBJECTS = $(am_libqsesys_la_OBJECTS)
AM_V_lt = $(am__v_lt_@AM_V@)
am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
am__v_lt_0 = --silent
am__v_lt_1 =
libqsesys_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
$(libqsesys_la_LDFLAGS) $(LDFLAGS) -o $@
libqsesysxx_la_DEPENDENCIES =
am__libqsesysxx_la_SOURCES_DIST = SocketAddress.cpp
@ENABLE_CXX_TRUE@am_libqsesysxx_la_OBJECTS = SocketAddress.lo
libqsesysxx_la_OBJECTS = $(am_libqsesysxx_la_OBJECTS)
libqsesysxx_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
$(AM_CXXFLAGS) $(CXXFLAGS) $(libqsesysxx_la_LDFLAGS) \
@ -159,6 +161,24 @@ DEFAULT_INCLUDES =
depcomp = $(SHELL) $(top_srcdir)/ac/depcomp
am__depfiles_maybe = depfiles
am__mv = mv -f
COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
$(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
$(AM_CFLAGS) $(CFLAGS)
AM_V_CC = $(am__v_CC_@AM_V@)
am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
am__v_CC_0 = @echo " CC " $@;
am__v_CC_1 =
CCLD = $(CC)
LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
$(AM_LDFLAGS) $(LDFLAGS) -o $@
AM_V_CCLD = $(am__v_CCLD_@AM_V@)
am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
am__v_CCLD_0 = @echo " CCLD " $@;
am__v_CCLD_1 =
CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
@ -177,8 +197,9 @@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@)
am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@)
am__v_CXXLD_0 = @echo " CXXLD " $@;
am__v_CXXLD_1 =
SOURCES = $(libqsesysxx_la_SOURCES)
DIST_SOURCES = $(am__libqsesysxx_la_SOURCES_DIST)
SOURCES = $(libqsesys_la_SOURCES) $(libqsesysxx_la_SOURCES)
DIST_SOURCES = $(libqsesys_la_SOURCES) \
$(am__libqsesysxx_la_SOURCES_DIST)
am__can_run_installinfo = \
case $$AM_UPDATE_INFO_DIR in \
n|no|NO) false;; \
@ -384,7 +405,13 @@ AM_CPPFLAGS = \
-I$(top_builddir)/include \
-I$(top_srcdir)/include
lib_LTLIBRARIES = $(am__append_1)
lib_LTLIBRARIES = libqsesys.la $(am__append_1)
libqsesys_la_SOURCES = \
thr.c \
thr.h
libqsesys_la_LDFLAGS = -L../cmn -version-info 1:0:0 -no-undefined
libqsesys_la_LIBADD = -lqsecmn
@ENABLE_CXX_TRUE@libqsesysxx_la_SOURCES = \
@ENABLE_CXX_TRUE@ SocketAddress.cpp
@ -393,7 +420,7 @@ lib_LTLIBRARIES = $(am__append_1)
all: all-am
.SUFFIXES:
.SUFFIXES: .cpp .lo .o .obj
.SUFFIXES: .c .cpp .lo .o .obj
$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
@for dep in $?; do \
case '$(am__configure_deps)' in \
@ -460,6 +487,9 @@ clean-libLTLIBRARIES:
rm -f $${locs}; \
}
libqsesys.la: $(libqsesys_la_OBJECTS) $(libqsesys_la_DEPENDENCIES) $(EXTRA_libqsesys_la_DEPENDENCIES)
$(AM_V_CCLD)$(libqsesys_la_LINK) -rpath $(libdir) $(libqsesys_la_OBJECTS) $(libqsesys_la_LIBADD) $(LIBS)
libqsesysxx.la: $(libqsesysxx_la_OBJECTS) $(libqsesysxx_la_DEPENDENCIES) $(EXTRA_libqsesysxx_la_DEPENDENCIES)
$(AM_V_CXXLD)$(libqsesysxx_la_LINK) $(am_libqsesysxx_la_rpath) $(libqsesysxx_la_OBJECTS) $(libqsesysxx_la_LIBADD) $(LIBS)
@ -470,6 +500,28 @@ distclean-compile:
-rm -f *.tab.c
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SocketAddress.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/thr.Plo@am__quote@
.c.o:
@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $<
.c.obj:
@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
.c.lo:
@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $<
.cpp.o:
@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<

View File

@ -89,19 +89,42 @@
QSE_BEGIN_NAMESPACE(QSE)
/////////////////////////////////
SocketAddress::SocketAddress ()
{
QSE_MEMSET (&this->skad, 0, QSE_SIZEOF(this->skad));
}
SocketAddress::SocketAddress (int family)
{
QSE_MEMSET (&this->skad, 0, QSE_SIZEOF(this->skad));
FAMILY(&this->skad) = family;
}
SocketAddress::SocketAddress (const qse_skad_t* skad)
{
this->set (skad);
}
SocketAddress::SocketAddress (const qse_nwad_t* nwad)
{
this->set (nwad);
}
SocketAddress::SocketAddress (const struct sockaddr* ptr, int len)
{
if (this->set (ptr, len) <= -1)
{
QSE_MEMSET (&this->skad, 0, QSE_SIZEOF(this->skad));
}
}
int SocketAddress::getFamily () const
{
return FAMILY(&this->skad);
//return qse_skadfamily (&this->skad);
}
void* SocketAddress::getStorage (int* len)
{
if (len) *len = qse_skadsize(&this->skad);
return (void*)&this->skad;
}
void SocketAddress::setIpaddr (const qse_ip4ad_t* ipaddr)
{
#if defined(AF_INET)
@ -179,19 +202,19 @@ int SocketAddress::set (const qse_skad_t* skad)
return 0;
}
int SocketAddress::set (const void* ptr, int len)
int SocketAddress::set (const qse_nwad_t* nwad)
{
return qse_nwadtoskad (nwad, &this->skad);
}
int SocketAddress::set (const struct sockaddr* ptr, int len)
{
if (len < QSE_SIZEOF(struct sockaddr)) return -1;
int exp_size = qse_skadsize((const qse_skad_t*)ptr);
if (len < exp_size) return -1;
QSE_MEMCPY (&this->skad, ptr, exp_size);
return 0;
}
int SocketAddress::set (const qse_nwad_t* nwad)
{
return qse_nwadtoskad (nwad, &this->skad);
}
/////////////////////////////////
QSE_END_NAMESPACE(QSE)

373
qse/lib/sys/thr.c Normal file
View File

@ -0,0 +1,373 @@
/*
* $Id$
*
Copyright (c) 2006-2014 Chung, Hyung-Hwan. 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.
THIS SOFTWARE IS PROVIDED BY THE AUTHOR "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 AUTHOR 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.
*/
#include "thr.h"
#include "../cmn/mem.h"
#include <stdarg.h>
#if (!defined(__unix__) && !defined(__unix)) || defined(HAVE_PTHREAD)
qse_thr_t* qse_thr_open (qse_mmgr_t* mmgr, qse_size_t xtnsize, qse_thr_routine_t routine)
{
qse_thr_t* thr;
thr = (qse_thr_t*) QSE_MMGR_ALLOC (mmgr, QSE_SIZEOF(qse_thr_t) + xtnsize);
if (thr)
{
if (qse_thr_init (thr, mmgr, routine) <= -1)
{
QSE_MMGR_FREE (mmgr, thr);
return QSE_NULL;
}
else QSE_MEMSET (QSE_XTN(thr), 0, xtnsize);
}
return thr;
}
void qse_thr_close (qse_thr_t* thr)
{
qse_thr_fini (thr);
QSE_MMGR_FREE (thr->mmgr, thr);
}
int qse_thr_init (qse_thr_t* thr, qse_mmgr_t* mmgr, qse_thr_routine_t routine)
{
QSE_MEMSET (thr, 0, QSE_SIZEOF(*thr));
thr->mmgr = mmgr;
thr->__handle = QSE_THR_HND_INVALID;
thr->__state = QSE_THR_INCUBATING;
thr->__return_code = 0;
thr->__main_routine = routine;
thr->__joinable = 1;
thr->__stacksize = 0;
return 0;
}
void qse_thr_fini (qse_thr_t* thr)
{
#if defined(_WIN32)
if (thr->__handle != QSE_THR_HND_INVALID) CloseHandle (thr->__handle);
#endif
thr->__handle = QSE_THR_HND_INVALID;
}
qse_size_t qse_thr_getstacksize (qse_thr_t* thr)
{
return thr->__stacksize;
}
void qse_thr_setstacksize (qse_thr_t* thr, qse_size_t num)
{
thr->__stacksize = num;
}
#if defined(__BEOS__)
static int32 __thread_main (void* arg)
#else
static void* __thread_main (void* arg)
#endif
{
qse_thr_t* thr = (qse_thr_t*)arg;
while (thr->__state != QSE_THR_RUNNING)
{
#if defined(_WIN32)
Sleep (0);
#elif defined(HAVE_NANOSLEEP)
struct timespec ts;
ts.tv_sec =0;
ts.tv_nsec = 0;
nanosleep (&ts, &ts);
#else
sleep (0);
#endif
}
#if !defined(_WIN32) && !defined(__BEOS__)
/*
* the asynchronous cancel-type is used to better emulate
* the bad effect of WIN32's TerminateThread using pthread_cancel
*/
pthread_setcancelstate (PTHREAD_CANCEL_ENABLE, QSE_NULL);
pthread_setcanceltype (PTHREAD_CANCEL_ASYNCHRONOUS, QSE_NULL);
#endif
thr->__return_code = thr->__temp_routine? thr->__temp_routine(thr): thr->__main_routine(thr);
thr->__state = QSE_THR_TERMINATED;
#if defined(_WIN32)
_endthreadex (thr->__return_code);
return QSE_NULL;
#elif defined(__BEOS__)
exit_thread (thr->__return_code);
return 0;
#else
pthread_exit (&thr->__return_code);
return QSE_NULL;
#endif
}
static int __create_thread (qse_thr_t* thr)
{
#if defined(_WIN32)
unsigned int tid;
if (thr->__handle != QSE_THR_HND_INVALID) CloseHandle (thr->__handle);
thr->__handle = (HANDLE)_beginthreadex (QSE_NULL, 0, (unsigned int (__stdcall*)(void*))__thread_main, thr, 0, &tid);
if (thr->__handle == 0) return -1;
#elif defined(__BEOS__)
thread_id tid;
tid = spawn_thread ((thread_func)__thread_main, QSE_NULL, 120, thr);
if (tid < B_OK) return -1;
thr->__handle = tid;
resume_thread(thr->__handle);
#elif defined(HAVE_PTHREAD)
pthread_attr_t attr;
pthread_attr_init (&attr);
if (pthread_attr_setdetachstate (&attr, (thr->__joinable?
PTHREAD_CREATE_JOINABLE: PTHREAD_CREATE_DETACHED)) != 0)
{
pthread_attr_destroy (&attr);
return -1;
}
if (thr->__stacksize > 0)
{
if (pthread_attr_setstacksize (&attr, thr->__stacksize) != 0)
{
pthread_attr_destroy (&attr);
return -1;
}
}
if (pthread_create (&thr->__handle, &attr, __thread_main, thr) != 0)
{
pthread_attr_destroy (&attr);
return -1;
}
pthread_attr_destroy (&attr);
#endif
return 0;
}
static int __cancel_thread (qse_thr_t* thr)
{
if (thr->__state != QSE_THR_RUNNING) return -1;
#if defined(_WIN32)
if (TerminateThread (thr->__handle, 0) == 0) return -1;
#elif defined(__BEOS__)
if (kill_thread (thr->__handle) < B_OK) return -1;
#elif defined(HAVE_PTHREAD)
if (pthread_cancel (thr->__handle) != 0) return -1;
#endif
return 0;
}
int qse_thr_start (qse_thr_t* thr, int flags, ...)
{
if (thr->__state == QSE_THR_RUNNING) return -1;
thr->__joinable = ((flags & QSE_THR_DETACHED) == 0);
if (flags & QSE_THR_NEW_ROUTINE)
{
va_list va;
va_start (va, flags);
thr->__temp_routine = va_arg (va, qse_thr_routine_t);
va_end (va);
}
else thr->__temp_routine = QSE_NULL;
if (__create_thread(thr) == -1)
{
thr->__state = QSE_THR_INCUBATING;
thr->__handle = QSE_THR_HND_INVALID;
return -1;
}
thr->__state = QSE_THR_RUNNING;
return 0;
}
int qse_thr_stop (qse_thr_t* thr)
{
if (thr->__state == QSE_THR_RUNNING)
{
if (__cancel_thread(thr) == -1) return -1;
/* can't be sure of whether or not the thread is really terminated. */
thr->__state = QSE_THR_ABORTED;
return 0;
}
return -1;
}
int qse_thr_join (qse_thr_t* thr)
{
if (thr->__state == QSE_THR_INCUBATING) return -1;
if (!thr->__joinable) return -1;
#if defined(_WIN32)
if (thr->__state == QSE_THR_RUNNING)
{
if (WaitForSingleObject (
thr->__handle, INFINITE) == WAIT_FAILED) return -1;
}
#elif defined(__BEOS__)
if (wait_for_thread(thr->__handle, QSE_NULL) < B_OK) return -1;
#elif defined(HAVE_PTHREAD)
if (pthread_join(thr->__handle, QSE_NULL) != 0) return -1;
#endif
thr->__joinable = 0;
return 0;
}
int qse_thr_detach (qse_thr_t* thr)
{
if (thr->__state == QSE_THR_INCUBATING) return -1;
if (!thr->__joinable) return -1;
#if defined(HAVE_PTHREAD)
if (pthread_detach(thr->__handle) != 0) return -1;
#endif
thr->__joinable = 0;
return 0;
}
int qse_thr_kill (qse_thr_t* thr, int sig)
{
if (thr->__state != QSE_THR_RUNNING) return -1;
#if defined(HAVE_PTHREAD)
if (pthread_kill (thr->__handle, sig) != 0) return -1;
#endif
return 0;
}
int qse_thr_blocksig (qse_thr_t* thr, int sig)
{
#if defined(HAVE_PTHREAD)
sigset_t mask;
#endif
if (thr->__state != QSE_THR_RUNNING) return -1;
#if defined(HAVE_PTHREAD)
sigemptyset (&mask);
sigaddset (&mask, sig);
if (pthread_sigmask (SIG_BLOCK, &mask, QSE_NULL) != 0) return -1;
#endif
return 0;
}
int qse_thr_unblocksig (qse_thr_t* thr, int sig)
{
#if defined(HAVE_PTHREAD)
sigset_t mask;
#endif
if (thr->__state != QSE_THR_RUNNING) return -1;
#if defined(HAVE_PTHREAD)
sigemptyset (&mask);
sigaddset (&mask, sig);
if (pthread_sigmask (SIG_UNBLOCK, &mask, QSE_NULL) != 0) return -1;
#endif
return 0;
}
int qse_thr_blockallsigs (qse_thr_t* thr)
{
#if defined(HAVE_PTHREAD)
sigset_t mask;
#endif
if (thr->__state != QSE_THR_RUNNING) return -1;
#if defined(HAVE_PTHREAD)
sigfillset (&mask);
if (pthread_sigmask (SIG_BLOCK, &mask, QSE_NULL) != 0) return -1;
#endif
return 0;
}
int qse_thr_unblockallsigs (qse_thr_t* thr)
{
#if defined(HAVE_PTHREAD)
sigset_t mask;
#endif
if (thr->__state != QSE_THR_RUNNING) return -1;
#if defined(HAVE_PTHREAD)
sigfillset (&mask);
if (pthread_sigmask (SIG_UNBLOCK, &mask, QSE_NULL) != 0) return -1;
#endif
return 0;
}
qse_thr_hnd_t qse_thr_gethnd (qse_thr_t* thr)
{
return thr->__handle;
}
int qse_thr_getretcode (qse_thr_t* thr)
{
return thr->__return_code;
}
qse_thr_state_t qse_thr_getstate (qse_thr_t* thr)
{
return thr->__state;
}
qse_thr_hnd_t qse_getcurthrhnd (void)
{
#if defined(_WIN32)
return GetCurrentThread ();
#elif defined(__OS2__)
return QSE_THR_HND_INVALID; /* TODO: implement this */
#elif defined(__DOS__)
return QSE_THR_HND_INVALID; /* TODO: implement this */
#elif defined(__BEOS__)
return QSE_THR_HND_INVALID; /* TODO: implement this */
#else
return pthread_self ();
#endif
}
#endif

77
qse/lib/sys/thr.h Normal file
View File

@ -0,0 +1,77 @@
/*
* $Id$
*
Copyright (c) 2006-2014 Chung, Hyung-Hwan. 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.
THIS SOFTWARE IS PROVIDED BY THE AUTHOR "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 AUTHOR 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.
*/
#ifndef _QSE_LIB_CMN_THR_H_
#define _QSE_LIB_CMN_THR_H_
#include <qse/sys/thr.h>
#if (!defined(__unix__) && !defined(__unix)) || defined(HAVE_PTHREAD)
#if defined(_WIN32)
# include <process.h>
# define QSE_THR_HND_INVALID INVALID_HANDLE_VALUE
#elif defined(__OS2__)
/* not implemented */
#elif defined(__DOS__)
/* not implemented */
#elif defined(__BEOS__)
# include <be/kernel/OS.h>
# define QSE_THR_HND_INVALID (-1)
#else
# if defined(AIX) && defined(__GNUC__)
typedef int crid_t;
typedef unsigned int class_id_t;
# endif
# include <pthread.h>
# include <signal.h>
# define QSE_THR_HND_INVALID 0
#endif
struct qse_thr_t
{
qse_mmgr_t* mmgr;
qse_thr_routine_t __main_routine;
qse_thr_routine_t __temp_routine;
qse_bool_t __joinable;
qse_size_t __stacksize;
qse_thr_hnd_t __handle;
qse_thr_state_t __state;
int __return_code;
};
#endif
#endif