added hton,ntoh
renamed qse_getcmgrbyname() to qse_findcmgr() added qse_setcmgrfinder()/qse_getcmgrfinder() started adding ipad,nwad
This commit is contained in:
@ -36,10 +36,13 @@ libqsecmn_la_SOURCES = \
|
||||
fs.c \
|
||||
fs-err.c \
|
||||
fs-move.c \
|
||||
hton.c \
|
||||
ipad.c \
|
||||
main.c \
|
||||
mbwc.c \
|
||||
mbwc-str.c \
|
||||
mem.c \
|
||||
nwad.c \
|
||||
oht.c \
|
||||
opt.c \
|
||||
path-basename.c \
|
||||
|
@ -77,18 +77,18 @@ LTLIBRARIES = $(lib_LTLIBRARIES)
|
||||
libqsecmn_la_DEPENDENCIES =
|
||||
am_libqsecmn_la_OBJECTS = alg-rand.lo alg-search.lo alg-sort.lo \
|
||||
assert.lo chr.lo dll.lo env.lo gdl.lo htb.lo lda.lo fio.lo \
|
||||
fma.lo fmt.lo fs.lo fs-err.lo fs-move.lo main.lo mbwc.lo \
|
||||
mbwc-str.lo mem.lo oht.lo opt.lo path-basename.lo \
|
||||
path-canon.lo pio.lo pma.lo rbt.lo rex.lo sio.lo sll.lo \
|
||||
slmb.lo stdio.lo str-beg.lo str-cat.lo str-chr.lo str-cnv.lo \
|
||||
str-cmp.lo str-cpy.lo str-del.lo str-dup.lo str-dynm.lo \
|
||||
str-dynw.lo str-end.lo str-excl.lo str-fcpy.lo str-fnmat.lo \
|
||||
str-incl.lo str-len.lo str-pac.lo str-pbrk.lo str-put.lo \
|
||||
str-rev.lo str-rot.lo str-set.lo str-spl.lo str-spn.lo \
|
||||
str-str.lo str-subst.lo str-tok.lo str-trm.lo str-word.lo \
|
||||
time.lo tio.lo tio-get.lo tio-put.lo tre.lo tre-ast.lo \
|
||||
tre-compile.lo tre-match-backtrack.lo tre-match-parallel.lo \
|
||||
tre-parse.lo tre-stack.lo utf8.lo xma.lo
|
||||
fma.lo fmt.lo fs.lo fs-err.lo fs-move.lo hton.lo ipad.lo \
|
||||
main.lo mbwc.lo mbwc-str.lo mem.lo nwad.lo oht.lo opt.lo \
|
||||
path-basename.lo path-canon.lo pio.lo pma.lo rbt.lo rex.lo \
|
||||
sio.lo sll.lo slmb.lo stdio.lo str-beg.lo str-cat.lo \
|
||||
str-chr.lo str-cnv.lo str-cmp.lo str-cpy.lo str-del.lo \
|
||||
str-dup.lo str-dynm.lo str-dynw.lo str-end.lo str-excl.lo \
|
||||
str-fcpy.lo str-fnmat.lo str-incl.lo str-len.lo str-pac.lo \
|
||||
str-pbrk.lo str-put.lo str-rev.lo str-rot.lo str-set.lo \
|
||||
str-spl.lo str-spn.lo str-str.lo str-subst.lo str-tok.lo \
|
||||
str-trm.lo str-word.lo time.lo tio.lo tio-get.lo tio-put.lo \
|
||||
tre.lo tre-ast.lo tre-compile.lo tre-match-backtrack.lo \
|
||||
tre-match-parallel.lo tre-parse.lo tre-stack.lo utf8.lo xma.lo
|
||||
libqsecmn_la_OBJECTS = $(am_libqsecmn_la_OBJECTS)
|
||||
libqsecmn_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \
|
||||
$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
|
||||
@ -310,10 +310,13 @@ libqsecmn_la_SOURCES = \
|
||||
fs.c \
|
||||
fs-err.c \
|
||||
fs-move.c \
|
||||
hton.c \
|
||||
ipad.c \
|
||||
main.c \
|
||||
mbwc.c \
|
||||
mbwc-str.c \
|
||||
mem.c \
|
||||
nwad.c \
|
||||
oht.c \
|
||||
opt.c \
|
||||
path-basename.c \
|
||||
@ -468,11 +471,14 @@ distclean-compile:
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fs.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gdl.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/htb.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hton.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ipad.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lda.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/main.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mbwc-str.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mbwc.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mem.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nwad.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/oht.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/opt.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/path-basename.Plo@am__quote@
|
||||
|
203
qse/lib/cmn/hton.c
Normal file
203
qse/lib/cmn/hton.c
Normal file
@ -0,0 +1,203 @@
|
||||
/*
|
||||
* $Id$
|
||||
*
|
||||
Copyright 2006-2011 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 <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <qse/cmn/hton.h>
|
||||
|
||||
|
||||
/* --------------------------------------------------------------- */
|
||||
|
||||
#if defined(QSE_HAVE_UINT16_T)
|
||||
|
||||
qse_uint16_t qse_ntoh16 (qse_uint16_t x)
|
||||
{
|
||||
#if defined(QSE_ENDIAN_BIG)
|
||||
return x;
|
||||
#elif defined(QSE_ENDIAN_LITTLE)
|
||||
qse_uint8_t* c = (qse_uint8_t*)&x;
|
||||
return (qse_uint16_t)(
|
||||
((qse_uint16_t)c[0] << 8) |
|
||||
((qse_uint16_t)c[1] << 0));
|
||||
#else
|
||||
# error Unknown endian
|
||||
#endif
|
||||
}
|
||||
|
||||
qse_uint16_t qse_hton16 (qse_uint16_t x)
|
||||
{
|
||||
#if defined(QSE_ENDIAN_BIG)
|
||||
return x;
|
||||
#elif defined(QSE_ENDIAN_LITTLE)
|
||||
qse_uint8_t* c = (qse_uint8_t*)&x;
|
||||
return (qse_uint16_t)(
|
||||
((qse_uint16_t)c[0] << 8) |
|
||||
((qse_uint16_t)c[1] << 0));
|
||||
#else
|
||||
# error Unknown endian
|
||||
#endif
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
/* --------------------------------------------------------------- */
|
||||
|
||||
#if defined(QSE_HAVE_UINT32_T)
|
||||
|
||||
qse_uint32_t qse_ntoh32 (qse_uint32_t x)
|
||||
{
|
||||
#if defined(QSE_ENDIAN_BIG)
|
||||
return x;
|
||||
#elif defined(QSE_ENDIAN_LITTLE)
|
||||
qse_uint8_t* c = (qse_uint8_t*)&x;
|
||||
return (qse_uint32_t)(
|
||||
((qse_uint32_t)c[0] << 24) |
|
||||
((qse_uint32_t)c[1] << 16) |
|
||||
((qse_uint32_t)c[2] << 8) |
|
||||
((qse_uint32_t)c[3] << 0));
|
||||
#else
|
||||
# error Unknown endian
|
||||
#endif
|
||||
}
|
||||
|
||||
qse_uint32_t qse_hton32 (qse_uint32_t x)
|
||||
{
|
||||
#if defined(QSE_ENDIAN_BIG)
|
||||
return x;
|
||||
#elif defined(QSE_ENDIAN_LITTLE)
|
||||
qse_uint8_t* c = (qse_uint8_t*)&x;
|
||||
return (qse_uint32_t)(
|
||||
((qse_uint32_t)c[0] << 24) |
|
||||
((qse_uint32_t)c[1] << 16) |
|
||||
((qse_uint32_t)c[2] << 8) |
|
||||
((qse_uint32_t)c[3] << 0));
|
||||
#else
|
||||
# error Unknown endian
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
||||
/* --------------------------------------------------------------- */
|
||||
|
||||
#if defined(QSE_HAVE_UINT64_T)
|
||||
|
||||
qse_uint64_t qse_ntoh64 (qse_uint64_t x)
|
||||
{
|
||||
#if defined(QSE_ENDIAN_BIG)
|
||||
return x;
|
||||
#elif defined(QSE_ENDIAN_LITTLE)
|
||||
qse_uint8_t* c = (qse_uint8_t*)&x;
|
||||
return (qse_uint64_t)(
|
||||
((qse_uint64_t)c[0] << 56) |
|
||||
((qse_uint64_t)c[1] << 48) |
|
||||
((qse_uint64_t)c[2] << 40) |
|
||||
((qse_uint64_t)c[3] << 32) |
|
||||
((qse_uint64_t)c[4] << 24) |
|
||||
((qse_uint64_t)c[5] << 16) |
|
||||
((qse_uint64_t)c[6] << 8) |
|
||||
((qse_uint64_t)c[7] << 0));
|
||||
#else
|
||||
# error Unknown endian
|
||||
#endif
|
||||
}
|
||||
|
||||
qse_uint64_t qse_hton64 (qse_uint64_t x)
|
||||
{
|
||||
#if defined(QSE_ENDIAN_BIG)
|
||||
return x;
|
||||
#elif defined(QSE_ENDIAN_LITTLE)
|
||||
qse_uint8_t* c = (qse_uint8_t*)&x;
|
||||
return (qse_uint64_t)(
|
||||
((qse_uint64_t)c[0] << 56) |
|
||||
((qse_uint64_t)c[1] << 48) |
|
||||
((qse_uint64_t)c[2] << 40) |
|
||||
((qse_uint64_t)c[3] << 32) |
|
||||
((qse_uint64_t)c[4] << 24) |
|
||||
((qse_uint64_t)c[5] << 16) |
|
||||
((qse_uint64_t)c[6] << 8) |
|
||||
((qse_uint64_t)c[7] << 0));
|
||||
#else
|
||||
# error Unknown endian
|
||||
#endif
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
/* --------------------------------------------------------------- */
|
||||
|
||||
#if defined(QSE_HAVE_UINT128_T)
|
||||
|
||||
qse_uint128_t qse_ntoh128 (qse_uint128_t x)
|
||||
{
|
||||
#if defined(QSE_ENDIAN_BIG)
|
||||
return x;
|
||||
#elif defined(QSE_ENDIAN_LITTLE)
|
||||
qse_uint8_t* c = (qse_uint8_t*)&x;
|
||||
return (qse_uint128_t)(
|
||||
((qse_uint128_t)c[0] << 120) |
|
||||
((qse_uint128_t)c[1] << 112) |
|
||||
((qse_uint128_t)c[2] << 104) |
|
||||
((qse_uint128_t)c[3] << 96) |
|
||||
((qse_uint128_t)c[4] << 88) |
|
||||
((qse_uint128_t)c[5] << 80) |
|
||||
((qse_uint128_t)c[6] << 72) |
|
||||
((qse_uint128_t)c[7] << 64) |
|
||||
((qse_uint128_t)c[8] << 56) |
|
||||
((qse_uint128_t)c[9] << 48) |
|
||||
((qse_uint128_t)c[10] << 40) |
|
||||
((qse_uint128_t)c[11] << 32) |
|
||||
((qse_uint128_t)c[12] << 24) |
|
||||
((qse_uint128_t)c[13] << 16) |
|
||||
((qse_uint128_t)c[14] << 8) |
|
||||
((qse_uint128_t)c[15] << 0));
|
||||
#else
|
||||
# error Unknown endian
|
||||
#endif
|
||||
}
|
||||
|
||||
qse_uint128_t qse_hton128 (qse_uint128_t x)
|
||||
{
|
||||
#if defined(QSE_ENDIAN_BIG)
|
||||
return x;
|
||||
#elif defined(QSE_ENDIAN_LITTLE)
|
||||
qse_uint8_t* c = (qse_uint8_t*)&x;
|
||||
return (qse_uint128_t)(
|
||||
((qse_uint128_t)c[0] << 120) |
|
||||
((qse_uint128_t)c[1] << 112) |
|
||||
((qse_uint128_t)c[2] << 104) |
|
||||
((qse_uint128_t)c[3] << 96) |
|
||||
((qse_uint128_t)c[4] << 88) |
|
||||
((qse_uint128_t)c[5] << 80) |
|
||||
((qse_uint128_t)c[6] << 72) |
|
||||
((qse_uint128_t)c[7] << 64) |
|
||||
((qse_uint128_t)c[8] << 56) |
|
||||
((qse_uint128_t)c[9] << 48) |
|
||||
((qse_uint128_t)c[10] << 40) |
|
||||
((qse_uint128_t)c[11] << 32) |
|
||||
((qse_uint128_t)c[12] << 24) |
|
||||
((qse_uint128_t)c[13] << 16) |
|
||||
((qse_uint128_t)c[14] << 8) |
|
||||
((qse_uint128_t)c[15] << 0));
|
||||
#else
|
||||
# error Unknown endian
|
||||
#endif
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
/* --------------------------------------------------------------- */
|
573
qse/lib/cmn/ipad.c
Normal file
573
qse/lib/cmn/ipad.c
Normal file
@ -0,0 +1,573 @@
|
||||
/*
|
||||
* $Id$
|
||||
*
|
||||
Copyright 2006-2011 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 <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/* Copyright (c) 1996-1999 by Internet Software Consortium
|
||||
*
|
||||
* Permission to use, copy, modify, and distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS
|
||||
* ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
|
||||
* OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE
|
||||
* CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
|
||||
* DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
|
||||
* PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
|
||||
* ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
#include <qse/cmn/ipad.h>
|
||||
|
||||
#if 0
|
||||
const qse_ipad4_t qse_ipad4_any =
|
||||
{
|
||||
0 /* 0.0.0.0 */
|
||||
};
|
||||
|
||||
const qse_ipad4_t qse_ipad4_loopback =
|
||||
{
|
||||
#if defined(QSE_ENDIAN_BIG)
|
||||
0x7F000001u /* 127.0.0.1 */
|
||||
#elif defined(QSE_ENDIAN_LITTLE)
|
||||
0x0100007Fu
|
||||
#else
|
||||
# error Unknown endian
|
||||
#endif
|
||||
};
|
||||
|
||||
const qse_ipad6_t qse_ipad6_any =
|
||||
{
|
||||
{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } /* :: */
|
||||
};
|
||||
|
||||
const qse_ipad6_t qse_ipad6_loopback =
|
||||
{
|
||||
{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 } /* ::1 */
|
||||
};
|
||||
#endif
|
||||
|
||||
#if 0
|
||||
int qse_strtoipad4 (const qse_char_t* str, qse_ipad4_t* ipad)
|
||||
{
|
||||
qse_char_t c;
|
||||
int dots = 0, digits = 0;
|
||||
qse_uint32_t acc = 0, addr = 0;
|
||||
|
||||
do
|
||||
{
|
||||
c = *str;
|
||||
|
||||
if (c == QSE_T('\0'))
|
||||
{
|
||||
if (dots < 3 || digits == 0) return -1;
|
||||
addr = (addr << 8) | acc;
|
||||
break;
|
||||
}
|
||||
else if (c >= QSE_T('0') && c <= QSE_T('9'))
|
||||
{
|
||||
if (digits > 0 && acc == 0) return -1;
|
||||
acc = acc * 10 + (c - QSE_T('0'));
|
||||
if (acc > 255) return -1;
|
||||
digits++;
|
||||
}
|
||||
else if (c == QSE_T('.'))
|
||||
{
|
||||
if (dots >= 3 || digits == 0) return -1;
|
||||
addr = (addr << 8) | acc;
|
||||
dots++; acc = 0; digits = 0;
|
||||
}
|
||||
else return -1;
|
||||
|
||||
str++;
|
||||
}
|
||||
while (1);
|
||||
|
||||
if (ipad != QSE_NULL) ipad->value = qse_hton32(addr);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int qse_strxtoipad4 (
|
||||
const qse_char_t* str, qse_size_t len, qse_ipad4_t* ipad)
|
||||
{
|
||||
qse_char_t c;
|
||||
int dots = 0, digits = 0;
|
||||
qse_uint32_t acc = 0, addr = 0;
|
||||
const qse_char_t* end = str + len;
|
||||
|
||||
do
|
||||
{
|
||||
if (str >= end)
|
||||
{
|
||||
if (dots < 3 || digits == 0) return -1;
|
||||
addr = (addr << 8) | acc;
|
||||
break;
|
||||
}
|
||||
|
||||
c = *str;
|
||||
|
||||
if (c >= QSE_T('0') && c <= QSE_T('9'))
|
||||
{
|
||||
if (digits > 0 && acc == 0) return -1;
|
||||
acc = acc * 10 + (c - QSE_T('0'));
|
||||
if (acc > 255) return -1;
|
||||
digits++;
|
||||
}
|
||||
else if (c == QSE_T('.'))
|
||||
{
|
||||
if (dots >= 3 || digits == 0) return -1;
|
||||
addr = (addr << 8) | acc;
|
||||
dots++; acc = 0; digits = 0;
|
||||
}
|
||||
else return -1;
|
||||
|
||||
str++;
|
||||
}
|
||||
while (1);
|
||||
|
||||
if (ipad != QSE_NULL) ipad->value = qse_hton32(addr);
|
||||
return 0;
|
||||
}
|
||||
|
||||
#define __BTOA(b,p,end) \
|
||||
do { \
|
||||
qse_char_t* sp = p; \
|
||||
do { \
|
||||
if (p >= end) { \
|
||||
if (p == sp) break; \
|
||||
if (p - sp > 1) p[-2] = p[-1]; \
|
||||
p[-1] = (b % 10) + QSE_T('0'); \
|
||||
} \
|
||||
else *p++ = (b % 10) + QSE_T('0'); \
|
||||
b /= 10; \
|
||||
} while (b > 0); \
|
||||
if (p - sp > 1) { \
|
||||
qse_char_t t = sp[0]; \
|
||||
sp[0] = p[-1]; \
|
||||
p[-1] = t; \
|
||||
} \
|
||||
} while (0);
|
||||
|
||||
#define __ADDDOT(p, end) \
|
||||
do { \
|
||||
if (p >= end) break; \
|
||||
*p++ = QSE_T('.'); \
|
||||
} while (0)
|
||||
|
||||
qse_size_t qse_ipad4tostrx (
|
||||
const qse_ipad4_t* ipad, qse_char_t* buf, qse_size_t size)
|
||||
{
|
||||
qse_byte_t b;
|
||||
qse_char_t* p, * end;
|
||||
qse_uint32_t ip;
|
||||
|
||||
if (size <= 0) return 0;
|
||||
|
||||
ip = ipad->value;
|
||||
|
||||
p = buf;
|
||||
end = buf + size - 1;
|
||||
|
||||
#if defined(QSE_ENDIAN_BIG)
|
||||
b = (ip >> 24) & 0xFF; __BTOA (b, p, end); __ADDDOT (p, end);
|
||||
b = (ip >> 16) & 0xFF; __BTOA (b, p, end); __ADDDOT (p, end);
|
||||
b = (ip >> 8) & 0xFF; __BTOA (b, p, end); __ADDDOT (p, end);
|
||||
b = (ip >> 0) & 0xFF; __BTOA (b, p, end);
|
||||
#elif defined(QSE_ENDIAN_LITTLE)
|
||||
b = (ip >> 0) & 0xFF; __BTOA (b, p, end); __ADDDOT (p, end);
|
||||
b = (ip >> 8) & 0xFF; __BTOA (b, p, end); __ADDDOT (p, end);
|
||||
b = (ip >> 16) & 0xFF; __BTOA (b, p, end); __ADDDOT (p, end);
|
||||
b = (ip >> 24) & 0xFF; __BTOA (b, p, end);
|
||||
#else
|
||||
# error Unknown Endian
|
||||
#endif
|
||||
|
||||
*p = QSE_T('\0');
|
||||
return p - buf;
|
||||
}
|
||||
|
||||
int qse_strtoipad6 (const qse_char_t* src, qse_ipad6_t* ipad)
|
||||
{
|
||||
#if 0
|
||||
static const qse_char_t xdigits_l[] = QSE_T("0123456789abcdef"),
|
||||
xdigits_u[] = QSE_T("0123456789ABCDEF");
|
||||
const qse_char_t* xdigits;
|
||||
#endif
|
||||
|
||||
qse_ipad6_t tmp;
|
||||
qse_byte_t* tp, * endp, * colonp;
|
||||
const qse_char_t* curtok;
|
||||
qse_char_t ch;
|
||||
int saw_xdigit;
|
||||
unsigned int val;
|
||||
|
||||
qse_memset (&tmp, 0, QSE_SIZEOF(tmp));
|
||||
tp = &tmp.value[0];
|
||||
endp = &tmp.value[QSE_COUNTOF(tmp.value)];
|
||||
colonp = QSE_NULL;
|
||||
|
||||
/* Leading :: requires some special handling. */
|
||||
if (*src == QSE_T(':'))
|
||||
{
|
||||
if (*++src != QSE_T(':')) return -1;
|
||||
}
|
||||
|
||||
curtok = src;
|
||||
saw_xdigit = 0;
|
||||
val = 0;
|
||||
while ((ch = *src++) != QSE_T('\0'))
|
||||
{
|
||||
#if 0
|
||||
const char *pch;
|
||||
if ((pch = qse_strchr((xdigits = xdigits_l), ch)) == QSE_NULL)
|
||||
pch = qse_strchr((xdigits = xdigits_u), ch);
|
||||
if (pch != QSE_NULL)
|
||||
{
|
||||
val <<= 4;
|
||||
val |= (pch - xdigits);
|
||||
if (val > 0xffff) return -1;
|
||||
saw_xdigit = 1;
|
||||
continue;
|
||||
}
|
||||
#endif
|
||||
int v1;
|
||||
if (ch >= QSE_T('0') && ch <= QSE_T('9'))
|
||||
v1 = ch - QSE_T('0');
|
||||
else if (ch >= QSE_T('A') && ch <= QSE_T('F'))
|
||||
v1 = ch - QSE_T('A') + 10;
|
||||
else if (ch >= QSE_T('a') && ch <= QSE_T('f'))
|
||||
v1 = ch - QSE_T('a') + 10;
|
||||
else v1 = -1;
|
||||
if (v1 >= 0)
|
||||
{
|
||||
val <<= 4;
|
||||
val |= v1;
|
||||
if (val > 0xffff) return -1;
|
||||
saw_xdigit = 1;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (ch == QSE_T(':'))
|
||||
{
|
||||
curtok = src;
|
||||
if (!saw_xdigit)
|
||||
{
|
||||
if (colonp) return -1;
|
||||
colonp = tp;
|
||||
continue;
|
||||
}
|
||||
else if (*src == QSE_T('\0'))
|
||||
{
|
||||
/* a colon can't be the last character */
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (tp + QSE_SIZEOF(qse_uint16_t) > endp) return -1;
|
||||
*tp++ = (qse_byte_t) (val >> 8) & 0xff;
|
||||
*tp++ = (qse_byte_t) val & 0xff;
|
||||
saw_xdigit = 0;
|
||||
val = 0;
|
||||
continue;
|
||||
}
|
||||
#if 0
|
||||
if (ch == QSE_T('.') && ((tp + NS_INADDRSZ) <= endp) &&
|
||||
inet_pton4(curtok, tp) > 0)
|
||||
{
|
||||
tp += NS_INADDRSZ;
|
||||
saw_xdigit = 0;
|
||||
break; /* '\0' was seen by inet_pton4(). */
|
||||
}
|
||||
#endif
|
||||
if (ch == QSE_T('.') && ((tp + QSE_SIZEOF(qse_ipad4_t)) <= endp) &&
|
||||
qse_strtoipad4(curtok, (qse_ipad4_t*)tp) == 0)
|
||||
{
|
||||
tp += QSE_SIZEOF(qse_ipad4_t);
|
||||
saw_xdigit = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (saw_xdigit)
|
||||
{
|
||||
if (tp + QSE_SIZEOF(qse_uint16_t) > endp) return -1;
|
||||
*tp++ = (qse_byte_t) (val >> 8) & 0xff;
|
||||
*tp++ = (qse_byte_t) val & 0xff;
|
||||
}
|
||||
if (colonp != QSE_NULL)
|
||||
{
|
||||
/*
|
||||
* Since some memmove()'s erroneously fail to handle
|
||||
* overlapping regions, we'll do the shift by hand.
|
||||
*/
|
||||
qse_size_t n = tp - colonp;
|
||||
qse_size_t i;
|
||||
|
||||
for (i = 1; i <= n; i++)
|
||||
{
|
||||
endp[-i] = colonp[n - i];
|
||||
colonp[n - i] = 0;
|
||||
}
|
||||
tp = endp;
|
||||
}
|
||||
|
||||
if (tp != endp) return -1;
|
||||
|
||||
*ipad = tmp;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int qse_strxtoipad6 (const qse_char_t* src, qse_size_t len, qse_ipad6_t* ipad)
|
||||
{
|
||||
qse_ipad6_t tmp;
|
||||
qse_byte_t* tp, * endp, * colonp;
|
||||
const qse_char_t* curtok;
|
||||
qse_char_t ch;
|
||||
int saw_xdigit;
|
||||
unsigned int val;
|
||||
const qse_char_t* src_end;
|
||||
|
||||
src_end = src + len;
|
||||
|
||||
qse_memset (&tmp, 0, QSE_SIZEOF(tmp));
|
||||
tp = &tmp.value[0];
|
||||
endp = &tmp.value[QSE_COUNTOF(tmp.value)];
|
||||
colonp = QSE_NULL;
|
||||
|
||||
/* Leading :: requires some special handling. */
|
||||
if (src < src_end && *src == QSE_T(':'))
|
||||
{
|
||||
src++;
|
||||
if (src >= src_end || *src != QSE_T(':')) return -1;
|
||||
}
|
||||
|
||||
curtok = src;
|
||||
saw_xdigit = 0;
|
||||
val = 0;
|
||||
|
||||
while (src < src_end)
|
||||
{
|
||||
int v1;
|
||||
|
||||
ch = *src++;
|
||||
|
||||
if (ch >= QSE_T('0') && ch <= QSE_T('9'))
|
||||
v1 = ch - QSE_T('0');
|
||||
else if (ch >= QSE_T('A') && ch <= QSE_T('F'))
|
||||
v1 = ch - QSE_T('A') + 10;
|
||||
else if (ch >= QSE_T('a') && ch <= QSE_T('f'))
|
||||
v1 = ch - QSE_T('a') + 10;
|
||||
else v1 = -1;
|
||||
if (v1 >= 0)
|
||||
{
|
||||
val <<= 4;
|
||||
val |= v1;
|
||||
if (val > 0xffff) return -1;
|
||||
saw_xdigit = 1;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (ch == QSE_T(':'))
|
||||
{
|
||||
curtok = src;
|
||||
if (!saw_xdigit)
|
||||
{
|
||||
if (colonp) return -1;
|
||||
colonp = tp;
|
||||
continue;
|
||||
}
|
||||
else if (src >= src_end)
|
||||
{
|
||||
/* a colon can't be the last character */
|
||||
return -1;
|
||||
}
|
||||
|
||||
*tp++ = (qse_byte_t) (val >> 8) & 0xff;
|
||||
*tp++ = (qse_byte_t) val & 0xff;
|
||||
saw_xdigit = 0;
|
||||
val = 0;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (ch == QSE_T('.') && ((tp + QSE_SIZEOF(qse_ipad4_t)) <= endp) &&
|
||||
qse_strxtoipad4(curtok, src_end - curtok, (qse_ipad4_t*)tp) == 0)
|
||||
{
|
||||
tp += QSE_SIZEOF(qse_ipad4_t);
|
||||
saw_xdigit = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (saw_xdigit)
|
||||
{
|
||||
if (tp + QSE_SIZEOF(qse_uint16_t) > endp) return -1;
|
||||
*tp++ = (qse_byte_t) (val >> 8) & 0xff;
|
||||
*tp++ = (qse_byte_t) val & 0xff;
|
||||
}
|
||||
if (colonp != QSE_NULL)
|
||||
{
|
||||
/*
|
||||
* Since some memmove()'s erroneously fail to handle
|
||||
* overlapping regions, we'll do the shift by hand.
|
||||
*/
|
||||
qse_size_t n = tp - colonp;
|
||||
qse_size_t i;
|
||||
|
||||
for (i = 1; i <= n; i++)
|
||||
{
|
||||
endp[-i] = colonp[n - i];
|
||||
colonp[n - i] = 0;
|
||||
}
|
||||
tp = endp;
|
||||
}
|
||||
|
||||
if (tp != endp) return -1;
|
||||
|
||||
*ipad = tmp;
|
||||
return 0;
|
||||
}
|
||||
|
||||
qse_size_t qse_ipad6tostrx (
|
||||
const qse_ipad6_t* ipad, qse_char_t* buf, qse_size_t size)
|
||||
{
|
||||
/*
|
||||
* Note that int32_t and int16_t need only be "at least" large enough
|
||||
* to contain a value of the specified size. On some systems, like
|
||||
* Crays, there is no such thing as an integer variable with 16 bits.
|
||||
* Keep this in mind if you think this function should have been coded
|
||||
* to use pointer overlays. All the world's not a VAX.
|
||||
*/
|
||||
|
||||
#define IP6ADDR_NWORDS (QSE_SIZEOF(ipad->value) / QSE_SIZEOF(qse_uint16_t))
|
||||
|
||||
qse_char_t tmp[QSE_COUNTOF(QSE_T("ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255"))], *tp;
|
||||
struct { int base, len; } best, cur;
|
||||
qse_uint16_t words[IP6ADDR_NWORDS];
|
||||
int i;
|
||||
|
||||
if (size <= 0) return 0;
|
||||
|
||||
/*
|
||||
* Preprocess:
|
||||
* Copy the input (bytewise) array into a wordwise array.
|
||||
* Find the longest run of 0x00's in src[] for :: shorthanding.
|
||||
*/
|
||||
qse_memset (words, 0, QSE_SIZEOF(words));
|
||||
for (i = 0; i < QSE_SIZEOF(ipad->value); i++)
|
||||
words[i / 2] |= (ipad->value[i] << ((1 - (i % 2)) << 3));
|
||||
best.base = -1;
|
||||
cur.base = -1;
|
||||
|
||||
for (i = 0; i < IP6ADDR_NWORDS; i++)
|
||||
{
|
||||
if (words[i] == 0)
|
||||
{
|
||||
if (cur.base == -1)
|
||||
{
|
||||
cur.base = i;
|
||||
cur.len = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
cur.len++;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (cur.base != -1)
|
||||
{
|
||||
if (best.base == -1 || cur.len > best.len) best = cur;
|
||||
cur.base = -1;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (cur.base != -1)
|
||||
{
|
||||
if (best.base == -1 || cur.len > best.len) best = cur;
|
||||
}
|
||||
if (best.base != -1 && best.len < 2) best.base = -1;
|
||||
|
||||
/*
|
||||
* Format the result.
|
||||
*/
|
||||
tp = tmp;
|
||||
for (i = 0; i < IP6ADDR_NWORDS; i++)
|
||||
{
|
||||
/* Are we inside the best run of 0x00's? */
|
||||
if (best.base != -1 && i >= best.base &&
|
||||
i < (best.base + best.len))
|
||||
{
|
||||
if (i == best.base) *tp++ = QSE_T(':');
|
||||
continue;
|
||||
}
|
||||
|
||||
/* Are we following an initial run of 0x00s or any real hex? */
|
||||
if (i != 0) *tp++ = QSE_T(':');
|
||||
|
||||
/* Is this address an encapsulated IPv4? ipv4-compatible or ipv4-mapped */
|
||||
if (i == 6 && best.base == 0 &&
|
||||
(best.len == 6 || (best.len == 5 && words[5] == 0xffff)))
|
||||
{
|
||||
qse_ipad4_t ipad4;
|
||||
qse_memcpy (&ipad4.value, ipad->value+12, QSE_SIZEOF(ipad4.value));
|
||||
tp += qse_ipad4tostrx (&ipad4, tp, QSE_SIZEOF(tmp) - (tp - tmp));
|
||||
break;
|
||||
}
|
||||
|
||||
tp += qse_uint16tostr_lower (words[i], tp, QSE_SIZEOF(tmp) - (tp - tmp), 16, QSE_T('\0'));
|
||||
}
|
||||
|
||||
/* Was it a trailing run of 0x00's? */
|
||||
if (best.base != -1 &&
|
||||
(best.base + best.len) == IP6ADDR_NWORDS) *tp++ = QSE_T(':');
|
||||
*tp++ = QSE_T('\0');
|
||||
|
||||
return qse_strxcpy (buf, size, tmp);
|
||||
|
||||
#undef IP6ADDR_NWORDS
|
||||
}
|
||||
|
||||
int qse_strtoipad (const qse_char_t* str, qse_ipad_t* ipad)
|
||||
{
|
||||
if (qse_strtoipad4 (str, &ipad->u.ip4) <= -1)
|
||||
{
|
||||
if (qse_strtoipad6 (str, &ipad->u.ip6) <= -1) return -1;
|
||||
ipad->type = QSE_IPAD_IP6;
|
||||
}
|
||||
else ipad->type = QSE_IPAD_IP4;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int qse_strxtoipad (const qse_char_t* str, qse_size_t len, qse_ipad_t* ipad)
|
||||
{
|
||||
if (qse_strxtoipad4 (str, len, &ipad->u.ip4) <= -1)
|
||||
{
|
||||
if (qse_strxtoipad6 (str, len, &ipad->u.ip6) <= -1) return -1;
|
||||
ipad->type = QSE_IPAD_IP6;
|
||||
}
|
||||
else ipad->type = QSE_IPAD_IP4;
|
||||
|
||||
return 0;
|
||||
}
|
||||
#endif
|
@ -47,6 +47,7 @@ qse_cmgr_t* qse_slmbcmgr = &builtin_cmgr[0];
|
||||
qse_cmgr_t* qse_utf8cmgr = &builtin_cmgr[1];
|
||||
|
||||
static qse_cmgr_t* dfl_cmgr = &builtin_cmgr[0];
|
||||
static qse_cmgr_finder_t cmgr_finder = QSE_NULL;
|
||||
|
||||
qse_cmgr_t* qse_getdflcmgr (void)
|
||||
{
|
||||
@ -58,24 +59,34 @@ void qse_setdflcmgr (qse_cmgr_t* cmgr)
|
||||
dfl_cmgr = (cmgr? cmgr: &builtin_cmgr[0]);
|
||||
}
|
||||
|
||||
/* TODO:
|
||||
qse_addcmgr (const qse_char_t* name, qse_cmgr_t* cmgr);
|
||||
qse_delcmgr (const qse_char_t* name);
|
||||
*/
|
||||
|
||||
qse_cmgr_t* qse_getcmgrbyname (const qse_char_t* name)
|
||||
qse_cmgr_t* qse_findcmgr (const qse_char_t* name)
|
||||
{
|
||||
if (name)
|
||||
{
|
||||
/* TODO: binary search */
|
||||
if (cmgr_finder)
|
||||
{
|
||||
qse_cmgr_t* cmgr;
|
||||
cmgr = cmgr_finder (name);
|
||||
if (cmgr) return cmgr;
|
||||
}
|
||||
|
||||
if (qse_strcmp(name, QSE_T("")) == 0) return dfl_cmgr;
|
||||
if (qse_strcmp(name, QSE_T("utf8")) == 0) return qse_utf8cmgr;
|
||||
if (qse_strcmp(name, QSE_T("slmb")) == 0) return qse_slmbcmgr;
|
||||
/* TODO: add more - handle those added with qse_addcmgr() */
|
||||
}
|
||||
return QSE_NULL;
|
||||
}
|
||||
|
||||
void qse_setcmgrfinder (qse_cmgr_finder_t finder)
|
||||
{
|
||||
cmgr_finder = finder;
|
||||
}
|
||||
|
||||
qse_cmgr_finder_t qse_getcmgrfinder (void)
|
||||
{
|
||||
return cmgr_finder;
|
||||
}
|
||||
|
||||
/* string conversion function using default character conversion manager */
|
||||
|
||||
int qse_mbstowcs (
|
||||
|
37
qse/lib/cmn/nwad.c
Normal file
37
qse/lib/cmn/nwad.c
Normal file
@ -0,0 +1,37 @@
|
||||
/*
|
||||
* $Id$
|
||||
*
|
||||
Copyright 2006-2011 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 <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/* Copyright (c) 1996-1999 by Internet Software Consortium
|
||||
*
|
||||
* Permission to use, copy, modify, and distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS
|
||||
* ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
|
||||
* OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE
|
||||
* CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
|
||||
* DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
|
||||
* PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
|
||||
* ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
#include <qse/cmn/nwad.h>
|
@ -49,7 +49,6 @@ static qse_ssize_t pio_output (
|
||||
#if defined(_WIN32)
|
||||
static qse_pio_errnum_t syserr_to_errnum (DWORD e)
|
||||
{
|
||||
|
||||
switch (e)
|
||||
{
|
||||
case ERROR_INVALID_PARAMETER:
|
||||
@ -573,13 +572,18 @@ int qse_pio_init (
|
||||
if (flags & QSE_PIO_WRITEIN)
|
||||
{
|
||||
/* child reads, parent writes */
|
||||
if (CreatePipe (
|
||||
&handle[0], &handle[1],
|
||||
&secattr, 0) == FALSE) goto oops;
|
||||
if (CreatePipe (&handle[0], &handle[1], &secattr, 0) == FALSE)
|
||||
{
|
||||
pio->errnum = syserr_to_errnum (GetLastError());
|
||||
goto oops;
|
||||
}
|
||||
|
||||
/* don't inherit write handle */
|
||||
if (SetHandleInformation (
|
||||
handle[1], HANDLE_FLAG_INHERIT, 0) == FALSE) goto oops;
|
||||
if (SetHandleInformation (handle[1], HANDLE_FLAG_INHERIT, 0) == FALSE)
|
||||
{
|
||||
pio->errnum = syserr_to_errnum (GetLastError());
|
||||
goto oops;
|
||||
}
|
||||
|
||||
minidx = 0; maxidx = 1;
|
||||
}
|
||||
@ -587,13 +591,18 @@ int qse_pio_init (
|
||||
if (flags & QSE_PIO_READOUT)
|
||||
{
|
||||
/* child writes, parent reads */
|
||||
if (CreatePipe (
|
||||
&handle[2], &handle[3],
|
||||
&secattr, 0) == FALSE) goto oops;
|
||||
if (CreatePipe (&handle[2], &handle[3], &secattr, 0) == FALSE)
|
||||
{
|
||||
pio->errnum = syserr_to_errnum (GetLastError());
|
||||
goto oops;
|
||||
}
|
||||
|
||||
/* don't inherit read handle */
|
||||
if (SetHandleInformation (
|
||||
handle[2], HANDLE_FLAG_INHERIT, 0) == FALSE) goto oops;
|
||||
if (SetHandleInformation (handle[2], HANDLE_FLAG_INHERIT, 0) == FALSE)
|
||||
{
|
||||
pio->errnum = syserr_to_errnum (GetLastError());
|
||||
goto oops;
|
||||
}
|
||||
|
||||
if (minidx == -1) minidx = 2;
|
||||
maxidx = 3;
|
||||
@ -602,13 +611,18 @@ int qse_pio_init (
|
||||
if (flags & QSE_PIO_READERR)
|
||||
{
|
||||
/* child writes, parent reads */
|
||||
if (CreatePipe (
|
||||
&handle[4], &handle[5],
|
||||
&secattr, 0) == FALSE) goto oops;
|
||||
if (CreatePipe (&handle[4], &handle[5], &secattr, 0) == FALSE)
|
||||
{
|
||||
pio->errnum = syserr_to_errnum (GetLastError());
|
||||
goto oops;
|
||||
}
|
||||
|
||||
/* don't inherit read handle */
|
||||
if (SetHandleInformation (
|
||||
handle[4], HANDLE_FLAG_INHERIT, 0) == FALSE) goto oops;
|
||||
if (SetHandleInformation (handle[4], HANDLE_FLAG_INHERIT, 0) == FALSE)
|
||||
{
|
||||
pio->errnum = syserr_to_errnum (GetLastError());
|
||||
goto oops;
|
||||
}
|
||||
|
||||
if (minidx == -1) minidx = 4;
|
||||
maxidx = 5;
|
||||
@ -629,7 +643,11 @@ int qse_pio_init (
|
||||
FILE_SHARE_READ | FILE_SHARE_WRITE,
|
||||
&secattr, OPEN_EXISTING, 0, NULL
|
||||
);
|
||||
if (windevnul == INVALID_HANDLE_VALUE) goto oops;
|
||||
if (windevnul == INVALID_HANDLE_VALUE)
|
||||
{
|
||||
pio->errnum = syserr_to_errnum (GetLastError());
|
||||
goto oops;
|
||||
}
|
||||
}
|
||||
|
||||
QSE_MEMSET (&procinfo, 0, QSE_SIZEOF(procinfo));
|
||||
@ -743,25 +761,7 @@ int qse_pio_init (
|
||||
|
||||
QSE_MMGR_FREE (mmgr, dupcmd);
|
||||
if (x == FALSE)
|
||||
{
|
||||
DWORD e = GetLastError ();
|
||||
switch (e)
|
||||
{
|
||||
case ERROR_ACCESS_DENIED:
|
||||
pio->errnum = QSE_PIO_EACCES;
|
||||
break;
|
||||
|
||||
case ERROR_FILE_NOT_FOUND:
|
||||
case ERROR_PATH_NOT_FOUND:
|
||||
pio->errnum = QSE_PIO_ENOENT;
|
||||
break;
|
||||
|
||||
case ERROR_NOT_ENOUGH_MEMORY:
|
||||
case ERROR_OUTOFMEMORY:
|
||||
pio->errnum = QSE_PIO_ENOMEM;
|
||||
break;
|
||||
}
|
||||
}
|
||||
pio->errnum = syserr_to_errnum (GetLastError());
|
||||
}
|
||||
|
||||
if (windevnul != INVALID_HANDLE_VALUE)
|
||||
@ -792,18 +792,32 @@ int qse_pio_init (
|
||||
#elif defined(__OS2__)
|
||||
|
||||
#define DOS_DUP_HANDLE(x,y) QSE_BLOCK ( \
|
||||
if (DosDupHandle(x,y) != NO_ERROR) goto oops; \
|
||||
rc = DosDupHandle(x,y); \
|
||||
if (rc != NO_ERROR) \
|
||||
{ \
|
||||
pio->errnum = syserr_to_errnum (rc); \
|
||||
goto oops; \
|
||||
} \
|
||||
)
|
||||
|
||||
if (flags & QSE_PIO_WRITEIN)
|
||||
{
|
||||
/* child reads, parent writes */
|
||||
if (DosCreatePipe (
|
||||
&handle[0], &handle[1], pipe_size) != NO_ERROR) goto oops;
|
||||
rc = DosCreatePipe (&handle[0], &handle[1], pipe_size);
|
||||
if (rc != NO_ERROR)
|
||||
{
|
||||
pio->errnum = syserr_to_errnum (rc);
|
||||
goto oops;
|
||||
}
|
||||
|
||||
/* the parent writes to handle[1] and the child reads from
|
||||
* handle[0] inherited. set the flag not to inherit handle[1]. */
|
||||
if (DosSetFHState (handle[1], OPEN_FLAGS_NOINHERIT) != NO_ERROR) goto oops;
|
||||
rc = DosSetFHState (handle[1], OPEN_FLAGS_NOINHERIT);
|
||||
if (rc != NO_ERROR)
|
||||
{
|
||||
pio->errnum = syserr_to_errnum (rc);
|
||||
goto oops;
|
||||
}
|
||||
|
||||
/* Need to do somthing like this to set the flag instead?
|
||||
ULONG state;
|
||||
@ -816,12 +830,21 @@ int qse_pio_init (
|
||||
if (flags & QSE_PIO_READOUT)
|
||||
{
|
||||
/* child writes, parent reads */
|
||||
if (DosCreatePipe (
|
||||
&handle[2], &handle[3], pipe_size) != NO_ERROR) goto oops;
|
||||
rc = DosCreatePipe (&handle[2], &handle[3], pipe_size);
|
||||
if (rc != NO_ERROR)
|
||||
{
|
||||
pio->errnum = syserr_to_errnum (rc);
|
||||
goto oops;
|
||||
}
|
||||
|
||||
/* the parent reads from handle[2] and the child writes to
|
||||
* handle[3] inherited. set the flag not to inherit handle[2] */
|
||||
if (DosSetFHState (handle[2], OPEN_FLAGS_NOINHERIT) != NO_ERROR) goto oops;
|
||||
rc = DosSetFHState (handle[2], OPEN_FLAGS_NOINHERIT);
|
||||
if (rc != NO_ERROR)
|
||||
{
|
||||
pio->errnum = syserr_to_errnum (rc);
|
||||
goto oops;
|
||||
}
|
||||
|
||||
if (minidx == -1) minidx = 2;
|
||||
maxidx = 3;
|
||||
@ -830,12 +853,21 @@ int qse_pio_init (
|
||||
if (flags & QSE_PIO_READERR)
|
||||
{
|
||||
/* child writes, parent reads */
|
||||
if (DosCreatePipe (
|
||||
&handle[4], &handle[5], pipe_size) != NO_ERROR) goto oops;
|
||||
rc = DosCreatePipe (&handle[4], &handle[5], pipe_size);
|
||||
if (rc != NO_ERROR)
|
||||
{
|
||||
pio->errnum = syserr_to_errnum (rc);
|
||||
goto oops;
|
||||
}
|
||||
|
||||
/* the parent reads from handle[4] and the child writes to
|
||||
* handle[5] inherited. set the flag not to inherit handle[4] */
|
||||
if (DosSetFHState (handle[4], OPEN_FLAGS_NOINHERIT) != NO_ERROR) goto oops;
|
||||
rc = DosSetFHState (handle[4], OPEN_FLAGS_NOINHERIT);
|
||||
if (rc != NO_ERROR)
|
||||
{
|
||||
pio->errnum = syserr_to_errnum (rc);
|
||||
goto oops;
|
||||
}
|
||||
|
||||
if (minidx == -1) minidx = 4;
|
||||
maxidx = 5;
|
||||
@ -867,22 +899,32 @@ int qse_pio_init (
|
||||
OPEN_FLAGS_NOINHERIT | OPEN_SHARE_DENYNONE,
|
||||
0L
|
||||
);
|
||||
if (rc != NO_ERROR) goto oops;
|
||||
if (rc != NO_ERROR)
|
||||
{
|
||||
pio->errnum = syserr_to_errnum (rc);
|
||||
goto oops;
|
||||
}
|
||||
}
|
||||
|
||||
/* duplicate the current stdin/out/err to old_in/out/err as a new handle */
|
||||
|
||||
if (DosDupHandle (std_in, &old_in) != NO_ERROR)
|
||||
rc = DosDupHandle (std_in, &old_in);
|
||||
if (rc != NO_ERROR)
|
||||
{
|
||||
pio->errnum = syserr_to_errnum (rc);
|
||||
goto oops;
|
||||
}
|
||||
if (DosDupHandle (std_out, &old_out) != NO_ERROR)
|
||||
rc = DosDupHandle (std_out, &old_out);
|
||||
if (rc != NO_ERROR)
|
||||
{
|
||||
pio->errnum = syserr_to_errnum (rc);
|
||||
DosClose (old_in); old_in = QSE_PIO_HND_NIL;
|
||||
goto oops;
|
||||
}
|
||||
if (DosDupHandle (std_err, &old_err) != NO_ERROR)
|
||||
rc = DosDupHandle (std_err, &old_err);
|
||||
if (rc != NO_ERROR)
|
||||
{
|
||||
pio->errnum = syserr_to_errnum (rc);
|
||||
DosClose (old_out); old_out = QSE_PIO_HND_NIL;
|
||||
DosClose (old_in); old_in = QSE_PIO_HND_NIL;
|
||||
goto oops;
|
||||
@ -1060,8 +1102,6 @@ int qse_pio_init (
|
||||
cmd_file
|
||||
);
|
||||
|
||||
/* TODO: translate error code ... */
|
||||
|
||||
QSE_MMGR_FREE (mmgr, cmd_line);
|
||||
cmd_line = QSE_NULL;
|
||||
|
||||
@ -1074,7 +1114,11 @@ int qse_pio_init (
|
||||
DosDupHandle (old_err, &std_err);
|
||||
DosClose (old_err); old_err = QSE_PIO_HND_NIL;
|
||||
|
||||
if (rc != NO_ERROR) goto oops;
|
||||
if (rc != NO_ERROR)
|
||||
{
|
||||
pio->errnum = syserr_to_errnum (rc);
|
||||
goto oops;
|
||||
}
|
||||
pio->child = child_rc.codeTerminate;
|
||||
|
||||
#elif defined(__DOS__)
|
||||
@ -1085,20 +1129,32 @@ int qse_pio_init (
|
||||
#elif defined(HAVE_POSIX_SPAWN)
|
||||
if (flags & QSE_PIO_WRITEIN)
|
||||
{
|
||||
if (QSE_PIPE(&handle[0]) <= -1) goto oops;
|
||||
if (QSE_PIPE(&handle[0]) <= -1)
|
||||
{
|
||||
pio->errnum = syserr_to_errnum (errno);
|
||||
goto oops;
|
||||
}
|
||||
minidx = 0; maxidx = 1;
|
||||
}
|
||||
|
||||
if (flags & QSE_PIO_READOUT)
|
||||
{
|
||||
if (QSE_PIPE(&handle[2]) <= -1) goto oops;
|
||||
if (QSE_PIPE(&handle[2]) <= -1)
|
||||
{
|
||||
pio->errnum = syserr_to_errnum (errno);
|
||||
goto oops;
|
||||
}
|
||||
if (minidx == -1) minidx = 2;
|
||||
maxidx = 3;
|
||||
}
|
||||
|
||||
if (flags & QSE_PIO_READERR)
|
||||
{
|
||||
if (QSE_PIPE(&handle[4]) <= -1) goto oops;
|
||||
if (QSE_PIPE(&handle[4]) <= -1)
|
||||
{
|
||||
pio->errnum = syserr_to_errnum (errno);
|
||||
goto oops;
|
||||
}
|
||||
if (minidx == -1) minidx = 4;
|
||||
maxidx = 5;
|
||||
}
|
||||
|
Reference in New Issue
Block a user