*** empty log message ***

This commit is contained in:
hyung-hwan 2006-09-22 14:05:30 +00:00
parent d44d550ff8
commit 5754c542db
17 changed files with 335 additions and 382 deletions

View File

@ -1,14 +1,9 @@
/* /*
* $Id: awk.c,v 1.76 2006-09-01 04:03:28 bacon Exp $ * $Id: awk.c,v 1.77 2006-09-22 14:04:25 bacon Exp $
*/ */
#include <xp/awk/awk_i.h> #include <xp/awk/awk_i.h>
#ifndef XP_AWK_STAND_ALONE
#include <xp/bas/memory.h>
#include <xp/bas/assert.h>
#endif
static void __free_afn (void* awk, void* afn); static void __free_afn (void* awk, void* afn);
xp_awk_t* xp_awk_open (xp_awk_syscas_t* syscas) xp_awk_t* xp_awk_open (xp_awk_syscas_t* syscas)

View File

@ -1,5 +1,5 @@
/* /*
* $Id: awk.h,v 1.116 2006-09-14 06:40:06 bacon Exp $ * $Id: awk.h,v 1.117 2006-09-22 14:04:25 bacon Exp $
*/ */
#ifndef _XP_AWK_AWK_H_ #ifndef _XP_AWK_AWK_H_
@ -74,6 +74,8 @@ struct xp_awk_syscas_t
xp_cint_t (*to_upper) (xp_cint_t c); xp_cint_t (*to_upper) (xp_cint_t c);
xp_cint_t (*to_lower) (xp_cint_t c); xp_cint_t (*to_lower) (xp_cint_t c);
int (*sprintf) (xp_char_t* buf, xp_size_t size, xp_char_t* fmt, ...);
void* custom_data; void* custom_data;
}; };
@ -386,12 +388,6 @@ xp_char_t* xp_awk_strxnstr (
const xp_char_t* str, xp_size_t strsz, const xp_char_t* str, xp_size_t strsz,
const xp_char_t* sub, xp_size_t subsz); const xp_char_t* sub, xp_size_t subsz);
int xp_awk_printf (xp_awk_t* awk, const xp_char_t* fmt, ...);
int xp_awk_sprintf (
xp_awk_t* awk, xp_char_t* buf,
xp_size_t size, const xp_char_t* fmt, ...);
/* utility functions to convert an error number ot a string */ /* utility functions to convert an error number ot a string */
const xp_char_t* xp_awk_geterrstr (int errnum); const xp_char_t* xp_awk_geterrstr (int errnum);

View File

@ -1,5 +1,5 @@
/* /*
* $Id: awk_i.h,v 1.57 2006-09-09 04:52:40 bacon Exp $ * $Id: awk_i.h,v 1.58 2006-09-22 14:04:25 bacon Exp $
*/ */
#ifndef _XP_AWK_AWKI_H_ #ifndef _XP_AWK_AWKI_H_
@ -18,7 +18,6 @@ typedef struct xp_awk_tree_t xp_awk_tree_t;
#endif #endif
#include <string.h> #include <string.h>
#include <stdarg.h>
#include <assert.h> #include <assert.h>
#define xp_assert assert #define xp_assert assert
@ -28,12 +27,9 @@ typedef struct xp_awk_tree_t xp_awk_tree_t;
#define xp_memmove(dst,src,len) memmove(dst,src,len) #define xp_memmove(dst,src,len) memmove(dst,src,len)
#define xp_memcmp(src1,src2,len) memcmp(src1,src2,len) #define xp_memcmp(src1,src2,len) memcmp(src1,src2,len)
#define xp_memzero(dst,len) memset(dst,0,len) #define xp_memzero(dst,len) memset(dst,0,len)
#else
#define xp_va_start(pvar,param) va_start(pvar,param) #include <xp/bas/memory.h>
#define xp_va_list va_list #include <xp/bas/assert.h>
#define xp_va_end(pvar) va_end(pvar)
#define xp_va_arg(pvar,type) va_arg(pvar,type)
#endif #endif
#include <xp/awk/str.h> #include <xp/awk/str.h>
@ -247,7 +243,18 @@ struct xp_awk_run_t
void* rs; void* rs;
void* fs; void* fs;
int ignorecase; int ignorecase;
} rex;
struct
{
xp_char_t* ptr;
xp_size_t len;
} ofs;
struct
{
xp_char_t* ptr;
xp_size_t len;
} subsep;
} global;
/* extio chain */ /* extio chain */
struct struct

View File

@ -1,13 +1,9 @@
/* /*
* $Id: extio.c,v 1.47 2006-09-10 15:50:34 bacon Exp $ * $Id: extio.c,v 1.48 2006-09-22 14:04:25 bacon Exp $
*/ */
#include <xp/awk/awk_i.h> #include <xp/awk/awk_i.h>
#ifndef XP_AWK_STAND_ALONE
#include <xp/bas/assert.h>
#endif
enum enum
{ {
__MASK_READ = 0x0100, __MASK_READ = 0x0100,
@ -287,12 +283,12 @@ int xp_awk_readextio (
const xp_char_t* match_ptr; const xp_char_t* match_ptr;
xp_size_t match_len; xp_size_t match_len;
xp_assert (run->rex.rs != XP_NULL); xp_assert (run->global.rs != XP_NULL);
/* TODO: safematchrex */ /* TODO: safematchrex */
n = xp_awk_matchrex ( n = xp_awk_matchrex (
run->awk, run->rex.rs, run->awk, run->global.rs,
((run->rex.ignorecase)? XP_AWK_REX_IGNORECASE: 0), ((run->global.ignorecase)? XP_AWK_REX_IGNORECASE: 0),
XP_AWK_STR_BUF(buf), XP_AWK_STR_LEN(buf), XP_AWK_STR_BUF(buf), XP_AWK_STR_LEN(buf),
&match_ptr, &match_len, &run->errnum); &match_ptr, &match_len, &run->errnum);
if (n == -1) if (n == -1)

View File

@ -1,13 +1,9 @@
/* /*
* $Id: func.c,v 1.52 2006-09-16 12:58:38 bacon Exp $ * $Id: func.c,v 1.53 2006-09-22 14:04:25 bacon Exp $
*/ */
#include <xp/awk/awk_i.h> #include <xp/awk/awk_i.h>
#ifndef XP_AWK_STAND_ALONE
#include <xp/bas/assert.h>
#endif
#ifdef _WIN32 #ifdef _WIN32
#include <tchar.h> #include <tchar.h>
#include <math.h> #include <math.h>
@ -586,7 +582,7 @@ static int __bfn_split (xp_awk_t* awk, void* run)
if (fs_len > 1) if (fs_len > 1)
{ {
fs_rex = ((xp_awk_run_t*)run)->rex.fs; fs_rex = ((xp_awk_run_t*)run)->global.fs;
fs_rex_free = XP_NULL; fs_rex_free = XP_NULL;
} }
} }
@ -938,7 +934,7 @@ static int __substitute (xp_awk_t* awk, void* run, xp_long_t max_count)
} }
} }
opt = (((xp_awk_run_t*)run)->rex.ignorecase)? XP_AWK_REX_IGNORECASE: 0; opt = (((xp_awk_run_t*)run)->global.ignorecase)? XP_AWK_REX_IGNORECASE: 0;
cur_ptr = a2_ptr; cur_ptr = a2_ptr;
cur_len = a2_len; cur_len = a2_len;
sub_count = 0; sub_count = 0;

View File

@ -1,13 +1,9 @@
/* /*
* $Id: map.c,v 1.24 2006-09-01 07:18:39 bacon Exp $ * $Id: map.c,v 1.25 2006-09-22 14:04:25 bacon Exp $
*/ */
#include <xp/awk/awk_i.h> #include <xp/awk/awk_i.h>
#ifndef XP_AWK_STAND_ALONE
#include <xp/bas/assert.h>
#endif
/* TODO: improve the entire map routines. /* TODO: improve the entire map routines.
support automatic bucket resizing and remaping, etc. */ support automatic bucket resizing and remaping, etc. */

View File

@ -1,22 +1,9 @@
/* /*
* $Id: misc.c,v 1.20 2006-09-10 16:04:34 bacon Exp $ * $Id: misc.c,v 1.21 2006-09-22 14:04:25 bacon Exp $
*/ */
#include <xp/awk/awk_i.h> #include <xp/awk/awk_i.h>
#ifndef XP_AWK_STAND_ALONE
#include <xp/bas/assert.h>
#include <xp/bas/stdarg.h>
#endif
static int __vprintf (
xp_awk_t* awk, const xp_char_t* fmt, xp_va_list ap);
static int __vsprintf (
xp_awk_t* awk, xp_char_t* buf, xp_size_t size,
const xp_char_t* fmt, xp_va_list ap);
static xp_char_t* __adjust_format (xp_awk_t* awk, const xp_char_t* format);
xp_long_t xp_awk_strtolong ( xp_long_t xp_awk_strtolong (
xp_awk_t* awk, const xp_char_t* str, xp_awk_t* awk, const xp_char_t* str,
int base, const xp_char_t** endptr) int base, const xp_char_t** endptr)
@ -622,7 +609,7 @@ xp_char_t* xp_awk_strxntok (
{ {
/* each token is delimited by one of charaters /* each token is delimited by one of charaters
* in the delimeter set "delim". */ * in the delimeter set "delim". */
if (run->rex.ignorecase) if (run->global.ignorecase)
{ {
while (p < end) while (p < end)
{ {
@ -657,7 +644,7 @@ xp_char_t* xp_awk_strxntok (
* in the delimeter set "delim". however, all space characters * in the delimeter set "delim". however, all space characters
* surrounding the token are removed */ * surrounding the token are removed */
while (p < end && XP_AWK_ISSPACE(run->awk,*p)) p++; while (p < end && XP_AWK_ISSPACE(run->awk,*p)) p++;
if (run->rex.ignorecase) if (run->global.ignorecase)
{ {
while (p < end) while (p < end)
{ {
@ -730,7 +717,7 @@ xp_char_t* xp_awk_strxntokbyrex (
{ {
n = xp_awk_matchrex ( n = xp_awk_matchrex (
run->awk, rex, run->awk, rex,
((run->rex.ignorecase)? XP_AWK_REX_IGNORECASE: 0), ((run->global.ignorecase)? XP_AWK_REX_IGNORECASE: 0),
ptr, left, (const xp_char_t**)&match_ptr, &match_len, ptr, left, (const xp_char_t**)&match_ptr, &match_len,
errnum); errnum);
if (n == -1) return XP_NULL; if (n == -1) return XP_NULL;
@ -809,215 +796,4 @@ exit_loop:
} }
} }
int xp_awk_printf (xp_awk_t* awk, const xp_char_t* fmt, ...)
{
int n;
xp_va_list ap;
xp_va_start (ap, fmt);
n = __vprintf (awk, fmt, ap);
xp_va_end (ap);
return n;
}
static int __vprintf (xp_awk_t* awk, const xp_char_t* fmt, xp_va_list ap)
{
int n;
xp_char_t* nf = __adjust_format (awk, fmt);
if (nf == XP_NULL) return -1;
#ifdef XP_CHAR_IS_MCHAR
n = vprintf (nf, ap);
#else
n = vwprintf (nf, ap);
#endif
XP_AWK_FREE (awk, nf);
return n;
}
int xp_awk_sprintf (
xp_awk_t* awk, xp_char_t* buf, xp_size_t size,
const xp_char_t* fmt, ...)
{
int n;
xp_va_list ap;
xp_va_start (ap, fmt);
n = __vsprintf (awk, buf, size, fmt, ap);
xp_va_end (ap);
return n;
}
static int __vsprintf (
xp_awk_t* awk, xp_char_t* buf, xp_size_t size,
const xp_char_t* fmt, xp_va_list ap)
{
int n;
xp_char_t* nf = __adjust_format (awk, fmt);
if (nf == XP_NULL) return -1;
#if defined(dos) || defined(__dos)
n = vsprintf (buf, nf, ap); /* TODO: write your own vsnprintf */
#elif defined(XP_CHAR_IS_MCHAR)
n = vsnprintf (buf, size, nf, ap);
#elif defined(_WIN32)
n = _vsnwprintf (buf, size, nf, ap);
#else
n = vswprintf (buf, size, nf, ap);
#endif
XP_AWK_FREE (awk, nf);
return n;
}
#define MOD_SHORT 1
#define MOD_LONG 2
#define MOD_LONGLONG 3
#define ADDC(str,c) \
do { \
if (xp_awk_str_ccat(&str, c) == (xp_size_t)-1) { \
xp_awk_str_close (&str); \
return XP_NULL; \
} \
} while (0)
static xp_char_t* __adjust_format (xp_awk_t* awk, const xp_char_t* format)
{
const xp_char_t* fp = format;
xp_char_t* tmp;
xp_awk_str_t str;
xp_char_t ch;
int modifier;
if (xp_awk_str_open (&str, 256, awk) == XP_NULL) return XP_NULL;
while (*fp != XP_T('\0'))
{
while (*fp != XP_T('\0') && *fp != XP_T('%'))
{
ADDC (str, *fp++);
}
if (*fp == XP_T('\0')) break;
xp_assert (*fp == XP_T('%'));
ch = *fp++;
ADDC (str, ch); /* add % */
ch = *fp++;
/* flags */
for (;;)
{
if (ch == XP_T(' ') || ch == XP_T('+') ||
ch == XP_T('-') || ch == XP_T('#'))
{
ADDC (str, ch);
}
else if (ch == XP_T('0'))
{
ADDC (str, ch);
ch = *fp++;
break;
}
else break;
ch = *fp++;
}
/* check the width */
if (ch == XP_T('*')) ADDC (str, ch);
else
{
while (XP_AWK_ISDIGIT (awk, ch))
{
ADDC (str, ch);
ch = *fp++;
}
}
/* precision */
if (ch == XP_T('.'))
{
ADDC (str, ch);
ch = *fp++;
if (ch == XP_T('*')) ADDC (str, ch);
else
{
while (XP_AWK_ISDIGIT (awk, ch))
{
ADDC (str, ch);
ch = *fp++;
}
}
}
/* modifier */
for (modifier = 0;;)
{
if (ch == XP_T('h')) modifier = MOD_SHORT;
else if (ch == XP_T('l'))
{
modifier = (modifier == MOD_LONG)? MOD_LONGLONG: MOD_LONG;
}
else break;
ch = *fp++;
}
/* type */
if (ch == XP_T('%')) ADDC (str, ch);
else if (ch == XP_T('c') || ch == XP_T('s'))
{
#if !defined(XP_CHAR_IS_MCHAR) && !defined(_WIN32)
ADDC (str, 'l');
#endif
ADDC (str, ch);
}
else if (ch == XP_T('C') || ch == XP_T('S'))
{
#ifdef _WIN32
ADDC (str, ch);
#else
#ifdef XP_CHAR_IS_MCHAR
ADDC (str, 'l');
#endif
ADDC (str, XP_AWK_TOLOWER(awk,ch));
#endif
}
else if (ch == XP_T('d') || ch == XP_T('i') ||
ch == XP_T('o') || ch == XP_T('u') ||
ch == XP_T('x') || ch == XP_T('X'))
{
if (modifier == MOD_SHORT)
{
ADDC (str, 'h');
}
else if (modifier == MOD_LONG)
{
ADDC (str, 'l');
}
else if (modifier == MOD_LONGLONG)
{
#if defined(_WIN32) && !defined(__LCC__)
ADDC (str, 'I');
ADDC (str, '6');
ADDC (str, '4');
#else
ADDC (str, 'l');
ADDC (str, 'l');
#endif
}
ADDC (str, ch);
}
else if (ch == XP_T('\0')) break;
else ADDC (str, ch);
}
tmp = XP_AWK_STR_BUF(&str);
xp_awk_str_forfeit (&str);
return tmp;
}

View File

@ -1,14 +1,9 @@
/* /*
* $Id: parse.c,v 1.180 2006-09-11 14:29:22 bacon Exp $ * $Id: parse.c,v 1.181 2006-09-22 14:04:25 bacon Exp $
*/ */
#include <xp/awk/awk_i.h> #include <xp/awk/awk_i.h>
#ifndef XP_AWK_STAND_ALONE
#include <xp/bas/memory.h>
#include <xp/bas/assert.h>
#endif
enum enum
{ {
TOKEN_EOF, TOKEN_EOF,

View File

@ -1,13 +1,11 @@
/* /*
* $Id: rex.c,v 1.29 2006-09-10 15:50:34 bacon Exp $ * $Id: rex.c,v 1.30 2006-09-22 14:04:26 bacon Exp $
*/ */
#include <xp/awk/awk_i.h> #include <xp/awk/awk_i.h>
#ifndef XP_AWK_STAND_ALONE #ifndef XP_AWK_STAND_ALONE
#include <xp/bas/memory.h>
#include <xp/bas/assert.h> #include <xp/bas/assert.h>
#include <xp/bas/ctype.h>
#endif #endif

View File

@ -1,5 +1,5 @@
/* /*
* $Id: run.c,v 1.203 2006-09-13 14:16:13 bacon Exp $ * $Id: run.c,v 1.204 2006-09-22 14:04:26 bacon Exp $
*/ */
#include <xp/awk/awk_i.h> #include <xp/awk/awk_i.h>
@ -9,7 +9,6 @@
#ifndef XP_AWK_STAND_ALONE #ifndef XP_AWK_STAND_ALONE
#include <xp/bas/assert.h> #include <xp/bas/assert.h>
#include <xp/bas/memory.h>
#endif #endif
#define DEF_BUF_CAPA 256 #define DEF_BUF_CAPA 256
@ -41,6 +40,9 @@ enum
#define PANIC_I(run,code) \ #define PANIC_I(run,code) \
do { (run)->errnum = (code); return -1; } while (0) do { (run)->errnum = (code); return -1; } while (0)
#define DEFAULT_OFS XP_T(" ")
#define DEFAULT_SUBSEP XP_T("\034")
static void __add_run (xp_awk_t* awk, xp_awk_run_t* run); static void __add_run (xp_awk_t* awk, xp_awk_run_t* run);
static void __del_run (xp_awk_t* awk, xp_awk_run_t* run); static void __del_run (xp_awk_t* awk, xp_awk_run_t* run);
@ -272,13 +274,13 @@ int xp_awk_setglobal (void* run, xp_size_t idx, xp_awk_val_t* val)
return -1; return -1;
} }
if (r->rex.rs != XP_NULL) if (r->global.rs != XP_NULL)
{ {
xp_awk_freerex ( xp_awk_freerex (
((xp_awk_run_t*)run)->awk, ((xp_awk_run_t*)run)->awk,
r->rex.rs); r->global.rs);
} }
r->rex.rs = rex; r->global.rs = rex;
} }
if (val->type != XP_AWK_VAL_STR) if (val->type != XP_AWK_VAL_STR)
@ -321,13 +323,13 @@ int xp_awk_setglobal (void* run, xp_size_t idx, xp_awk_val_t* val)
return -1; return -1;
} }
if (r->rex.fs != XP_NULL) if (r->global.fs != XP_NULL)
{ {
xp_awk_freerex ( xp_awk_freerex (
((xp_awk_run_t*)run)->awk, ((xp_awk_run_t*)run)->awk,
r->rex.fs); r->global.fs);
} }
r->rex.fs = rex; r->global.fs = rex;
} }
if (val->type != XP_AWK_VAL_STR) if (val->type != XP_AWK_VAL_STR)
@ -342,11 +344,11 @@ int xp_awk_setglobal (void* run, xp_size_t idx, xp_awk_val_t* val)
(val->type == XP_AWK_VAL_STR && (val->type == XP_AWK_VAL_STR &&
((xp_awk_val_str_t*)val)->len == 0)) ((xp_awk_val_str_t*)val)->len == 0))
{ {
((xp_awk_run_t*)run)->rex.ignorecase = 0; ((xp_awk_run_t*)run)->global.ignorecase = 0;
} }
else else
{ {
((xp_awk_run_t*)run)->rex.ignorecase = 1; ((xp_awk_run_t*)run)->global.ignorecase = 1;
} }
} }
else if (idx == XP_AWK_GLOBAL_NF) else if (idx == XP_AWK_GLOBAL_NF)
@ -355,7 +357,6 @@ int xp_awk_setglobal (void* run, xp_size_t idx, xp_awk_val_t* val)
xp_long_t lv; xp_long_t lv;
xp_real_t rv; xp_real_t rv;
/* TODO: need to recompute $0, etc */
n = xp_awk_valtonum (run, val, &lv, &rv); n = xp_awk_valtonum (run, val, &lv, &rv);
if (n == -1) return -1; if (n == -1) return -1;
if (n == 1) lv = (xp_long_t)rv; if (n == 1) lv = (xp_long_t)rv;
@ -365,9 +366,33 @@ int xp_awk_setglobal (void* run, xp_size_t idx, xp_awk_val_t* val)
if (__shorten_record (r, (xp_size_t)lv) == -1) return -1; if (__shorten_record (r, (xp_size_t)lv) == -1) return -1;
} }
} }
else if (idx == XP_AWK_GLOBAL_OFS)
{
xp_char_t* ofs_ptr;
xp_size_t ofs_len;
xp_awk_refdownval (run, old); ofs_ptr = xp_awk_valtostr (
STACK_GLOBAL((xp_awk_run_t*)run,idx) = val; run, val, xp_true, XP_NULL, &ofs_len);
if (ofs_ptr == XP_NULL) return -1;
r->global.ofs.ptr = ofs_ptr;
r->global.ofs.len = ofs_len;
}
else if (idx == XP_AWK_GLOBAL_SUBSEP)
{
xp_char_t* subsep_ptr;
xp_size_t subsep_len;
subsep_ptr = xp_awk_valtostr (
run, val, xp_true, XP_NULL, &subsep_len);
if (subsep_ptr == XP_NULL) return -1;
r->global.subsep.ptr = subsep_ptr;
r->global.subsep.len = subsep_len;
}
xp_awk_refdownval (r, old);
STACK_GLOBAL(r,idx) = val;
xp_awk_refupval (val); xp_awk_refupval (val);
return 0; return 0;
@ -615,9 +640,13 @@ static int __init_run (
run->extio.handler[XP_AWK_EXTIO_CONSOLE] = runios->console; run->extio.handler[XP_AWK_EXTIO_CONSOLE] = runios->console;
run->extio.chain = XP_NULL; run->extio.chain = XP_NULL;
run->rex.rs = XP_NULL; run->global.rs = XP_NULL;
run->rex.fs = XP_NULL; run->global.fs = XP_NULL;
run->rex.ignorecase = 0; run->global.ignorecase = 0;
run->global.ofs.ptr = DEFAULT_OFS;
run->global.ofs.len = xp_awk_strlen(DEFAULT_OFS);
run->global.subsep.ptr = DEFAULT_SUBSEP;
run->global.subsep.len = xp_awk_strlen(DEFAULT_SUBSEP);
return 0; return 0;
} }
@ -631,15 +660,31 @@ static void __deinit_run (xp_awk_run_t* run)
xp_awk_clearextio (run); xp_awk_clearextio (run);
xp_assert (run->extio.chain == XP_NULL); xp_assert (run->extio.chain == XP_NULL);
if (run->rex.rs != XP_NULL) if (run->global.rs != XP_NULL)
{ {
XP_AWK_FREE (run->awk, run->rex.rs); XP_AWK_FREE (run->awk, run->global.rs);
run->rex.rs = XP_NULL; run->global.rs = XP_NULL;
} }
if (run->rex.fs != XP_NULL) if (run->global.fs != XP_NULL)
{ {
XP_AWK_FREE (run->awk, run->rex.fs); XP_AWK_FREE (run->awk, run->global.fs);
run->rex.fs = XP_NULL; run->global.fs = XP_NULL;
}
if (run->global.ofs.ptr != XP_NULL &&
run->global.ofs.ptr != DEFAULT_SUBSEP)
{
XP_AWK_FREE (run->awk, run->global.ofs.ptr);
run->global.ofs.ptr = XP_NULL;
run->global.ofs.len = 0;
}
if (run->global.subsep.ptr != XP_NULL &&
run->global.subsep.ptr != DEFAULT_SUBSEP)
{
XP_AWK_FREE (run->awk, run->global.subsep.ptr);
run->global.subsep.ptr = XP_NULL;
run->global.subsep.len = 0;
} }
/* destroy input record. __clear_record should be called /* destroy input record. __clear_record should be called
@ -1947,7 +1992,7 @@ static xp_awk_val_t* __eval_expression (xp_awk_run_t* run, xp_awk_nde_t* nde)
n = xp_awk_matchrex ( n = xp_awk_matchrex (
((xp_awk_run_t*)run)->awk, ((xp_awk_run_t*)run)->awk,
((xp_awk_val_rex_t*)v)->code, ((xp_awk_val_rex_t*)v)->code,
((((xp_awk_run_t*)run)->rex.ignorecase)? XP_AWK_REX_IGNORECASE: 0), ((((xp_awk_run_t*)run)->global.ignorecase)? XP_AWK_REX_IGNORECASE: 0),
((xp_awk_val_str_t*)run->inrec.d0)->buf, ((xp_awk_val_str_t*)run->inrec.d0)->buf,
((xp_awk_val_str_t*)run->inrec.d0)->len, ((xp_awk_val_str_t*)run->inrec.d0)->len,
XP_NULL, XP_NULL, &errnum); XP_NULL, XP_NULL, &errnum);
@ -2778,7 +2823,7 @@ static xp_awk_val_t* __eval_binop_eq (
else if (left->type == XP_AWK_VAL_STR && else if (left->type == XP_AWK_VAL_STR &&
right->type == XP_AWK_VAL_STR) right->type == XP_AWK_VAL_STR)
{ {
if (run->rex.ignorecase) if (run->global.ignorecase)
{ {
r = xp_awk_strxncasecmp ( r = xp_awk_strxncasecmp (
run->awk, run->awk,
@ -2845,7 +2890,7 @@ static xp_awk_val_t* __eval_binop_ne (
else if (left->type == XP_AWK_VAL_STR && else if (left->type == XP_AWK_VAL_STR &&
right->type == XP_AWK_VAL_STR) right->type == XP_AWK_VAL_STR)
{ {
if (run->rex.ignorecase) if (run->global.ignorecase)
{ {
r = xp_awk_strxncasecmp ( r = xp_awk_strxncasecmp (
run->awk, run->awk,
@ -2906,7 +2951,7 @@ static xp_awk_val_t* __eval_binop_gt (
else if (left->type == XP_AWK_VAL_STR && else if (left->type == XP_AWK_VAL_STR &&
right->type == XP_AWK_VAL_STR) right->type == XP_AWK_VAL_STR)
{ {
if (run->rex.ignorecase) if (run->global.ignorecase)
{ {
r = xp_awk_strxncasecmp ( r = xp_awk_strxncasecmp (
run->awk, run->awk,
@ -2967,7 +3012,7 @@ static xp_awk_val_t* __eval_binop_ge (
else if (left->type == XP_AWK_VAL_STR && else if (left->type == XP_AWK_VAL_STR &&
right->type == XP_AWK_VAL_STR) right->type == XP_AWK_VAL_STR)
{ {
if (run->rex.ignorecase) if (run->global.ignorecase)
{ {
r = xp_awk_strxncasecmp ( r = xp_awk_strxncasecmp (
run->awk, run->awk,
@ -3028,7 +3073,7 @@ static xp_awk_val_t* __eval_binop_lt (
else if (left->type == XP_AWK_VAL_STR && else if (left->type == XP_AWK_VAL_STR &&
right->type == XP_AWK_VAL_STR) right->type == XP_AWK_VAL_STR)
{ {
if (run->rex.ignorecase) if (run->global.ignorecase)
{ {
r = xp_awk_strxncasecmp ( r = xp_awk_strxncasecmp (
run->awk, run->awk,
@ -3089,7 +3134,7 @@ static xp_awk_val_t* __eval_binop_le (
else if (left->type == XP_AWK_VAL_STR && else if (left->type == XP_AWK_VAL_STR &&
right->type == XP_AWK_VAL_STR) right->type == XP_AWK_VAL_STR)
{ {
if (run->rex.ignorecase) if (run->global.ignorecase)
{ {
r = xp_awk_strxncasecmp ( r = xp_awk_strxncasecmp (
run->awk, run->awk,
@ -3486,7 +3531,7 @@ static xp_awk_val_t* __eval_binop_match0 (
{ {
n = xp_awk_matchrex ( n = xp_awk_matchrex (
run->awk, rex_code, run->awk, rex_code,
((run->rex.ignorecase)? XP_AWK_REX_IGNORECASE: 0), ((run->global.ignorecase)? XP_AWK_REX_IGNORECASE: 0),
((xp_awk_val_str_t*)left)->buf, ((xp_awk_val_str_t*)left)->buf,
((xp_awk_val_str_t*)left)->len, ((xp_awk_val_str_t*)left)->len,
XP_NULL, XP_NULL, &errnum); XP_NULL, XP_NULL, &errnum);
@ -3517,7 +3562,7 @@ static xp_awk_val_t* __eval_binop_match0 (
n = xp_awk_matchrex ( n = xp_awk_matchrex (
run->awk, rex_code, run->awk, rex_code,
((run->rex.ignorecase)? XP_AWK_REX_IGNORECASE: 0), ((run->global.ignorecase)? XP_AWK_REX_IGNORECASE: 0),
str, len, XP_NULL, XP_NULL, &errnum); str, len, XP_NULL, XP_NULL, &errnum);
if (n == -1) if (n == -1)
{ {
@ -4908,7 +4953,7 @@ static int __split_record (xp_awk_run_t* run)
else else
{ {
p = xp_awk_strxntokbyrex (run, p, len, p = xp_awk_strxntokbyrex (run, p, len,
run->rex.fs, &tok, &tok_len, &errnum); run->global.fs, &tok, &tok_len, &errnum);
if (p == XP_NULL && errnum != XP_AWK_ENOERR) if (p == XP_NULL && errnum != XP_AWK_ENOERR)
{ {
if (fs_free != XP_NULL) if (fs_free != XP_NULL)
@ -4963,7 +5008,7 @@ static int __split_record (xp_awk_run_t* run)
else else
{ {
p = xp_awk_strxntokbyrex (run, p, len, p = xp_awk_strxntokbyrex (run, p, len,
run->rex.fs, &tok, &tok_len, &errnum); run->global.fs, &tok, &tok_len, &errnum);
if (p == XP_NULL && errnum != XP_AWK_ENOERR) if (p == XP_NULL && errnum != XP_AWK_ENOERR)
{ {
if (fs_free != XP_NULL) if (fs_free != XP_NULL)
@ -5042,8 +5087,6 @@ static int __recomp_record_fields (
xp_awk_run_t* run, xp_size_t lv, xp_char_t* str, xp_size_t len) xp_awk_run_t* run, xp_size_t lv, xp_char_t* str, xp_size_t len)
{ {
xp_awk_val_t* v; xp_awk_val_t* v;
xp_char_t* ofs_free = XP_NULL, * ofs;
xp_size_t ofs_len;
xp_size_t max, i, nflds; xp_size_t max, i, nflds;
/* recomposes the record and the fields when $N has been assigned /* recomposes the record and the fields when $N has been assigned
@ -5097,45 +5140,15 @@ static int __recomp_record_fields (
xp_awk_str_clear (&run->inrec.line); xp_awk_str_clear (&run->inrec.line);
if (max > 1)
{
/* gets the value of OFS to use it as a field separator */
v = STACK_GLOBAL(run, XP_AWK_GLOBAL_OFS);
xp_awk_refupval (v);
if (v->type == XP_AWK_VAL_NIL)
{
/* OFS not set */
ofs = XP_T(" ");
ofs_len = 1;
}
else if (v->type == XP_AWK_VAL_STR)
{
ofs = ((xp_awk_val_str_t*)v)->buf;
ofs_len = ((xp_awk_val_str_t*)v)->len;
}
else
{
ofs = xp_awk_valtostr (
run, v, xp_true, XP_NULL, &ofs_len);
if (ofs == XP_NULL) return -1;
ofs_free = ofs;
}
}
for (i = 0; i < max; i++) for (i = 0; i < max; i++)
{ {
if (i > 0) if (i > 0)
{ {
if (xp_awk_str_ncat ( if (xp_awk_str_ncat (
&run->inrec.line, &run->inrec.line,
ofs, ofs_len) == (xp_size_t)-1) run->global.ofs.ptr,
run->global.ofs.len) == (xp_size_t)-1)
{ {
if (ofs_free != XP_NULL)
XP_AWK_FREE (run->awk, ofs_free);
if (max > 1) xp_awk_refdownval (run, v);
run->errnum = XP_AWK_ENOMEM; run->errnum = XP_AWK_ENOMEM;
return -1; return -1;
} }
@ -5153,9 +5166,6 @@ static int __recomp_record_fields (
if (xp_awk_str_ncat ( if (xp_awk_str_ncat (
&run->inrec.line, str, len) == (xp_size_t)-1) &run->inrec.line, str, len) == (xp_size_t)-1)
{ {
if (ofs_free != XP_NULL)
XP_AWK_FREE (run->awk, ofs_free);
if (max > 1) xp_awk_refdownval (run, v);
run->errnum = XP_AWK_ENOMEM; run->errnum = XP_AWK_ENOMEM;
return -1; return -1;
} }
@ -5163,9 +5173,6 @@ static int __recomp_record_fields (
tmp = xp_awk_makestrval (run, str,len); tmp = xp_awk_makestrval (run, str,len);
if (tmp == XP_NULL) if (tmp == XP_NULL)
{ {
if (ofs_free != XP_NULL)
XP_AWK_FREE (run->awk, ofs_free);
if (max > 1) xp_awk_refdownval (run, v);
run->errnum = XP_AWK_ENOMEM; run->errnum = XP_AWK_ENOMEM;
return -1; return -1;
} }
@ -5187,9 +5194,6 @@ static int __recomp_record_fields (
if (xp_awk_str_cat ( if (xp_awk_str_cat (
&run->inrec.line, XP_T("")) == (xp_size_t)-1) &run->inrec.line, XP_T("")) == (xp_size_t)-1)
{ {
if (ofs_free != XP_NULL)
XP_AWK_FREE (run->awk, ofs_free);
if (max > 1) xp_awk_refdownval (run, v);
run->errnum = XP_AWK_ENOMEM; run->errnum = XP_AWK_ENOMEM;
return -1; return -1;
} }
@ -5216,18 +5220,12 @@ static int __recomp_record_fields (
if (xp_awk_str_ncat (&run->inrec.line, if (xp_awk_str_ncat (&run->inrec.line,
tmp->buf, tmp->len) == (xp_size_t)-1) tmp->buf, tmp->len) == (xp_size_t)-1)
{ {
if (ofs_free != XP_NULL)
XP_AWK_FREE (run->awk, ofs_free);
if (max > 1) xp_awk_refdownval (run, v);
run->errnum = XP_AWK_ENOMEM; run->errnum = XP_AWK_ENOMEM;
return -1; return -1;
} }
} }
} }
if (ofs_free != XP_NULL) XP_AWK_FREE (run->awk, ofs_free);
if (max > 1) xp_awk_refdownval (run, v);
v = STACK_GLOBAL(run, XP_AWK_GLOBAL_NF); v = STACK_GLOBAL(run, XP_AWK_GLOBAL_NF);
xp_assert (v->type == XP_AWK_VAL_INT); xp_assert (v->type == XP_AWK_VAL_INT);
if (((xp_awk_val_int_t*)v)->val != max) if (((xp_awk_val_int_t*)v)->val != max)
@ -5385,9 +5383,10 @@ static xp_char_t* __idxnde_to_str (
xp_awk_refupval (idx); xp_awk_refupval (idx);
/* TODO: configurable index seperator, not just a comma */
if (XP_AWK_STR_LEN(&idxstr) > 0 && if (XP_AWK_STR_LEN(&idxstr) > 0 &&
xp_awk_str_cat (&idxstr, XP_T(",")) == (xp_size_t)-1) xp_awk_str_ncat (&idxstr,
run->global.subsep.ptr,
run->global.subsep.len) == (xp_size_t)-1)
{ {
xp_awk_refdownval (run, idx); xp_awk_refdownval (run, idx);
xp_awk_str_close (&idxstr); xp_awk_str_close (&idxstr);
@ -5413,4 +5412,3 @@ static xp_char_t* __idxnde_to_str (
return str; return str;
} }

View File

@ -1,11 +1,10 @@
/* /*
* $Id: str.c,v 1.4 2006-09-10 15:50:34 bacon Exp $ * $Id: str.c,v 1.5 2006-09-22 14:04:26 bacon Exp $
*/ */
#include <xp/awk/awk_i.h> #include <xp/awk/awk_i.h>
#ifndef XP_AWK_STAND_ALONE #ifndef XP_AWK_STAND_ALONE
#include <xp/bas/memory.h>
#include <xp/bas/assert.h> #include <xp/bas/assert.h>
#endif #endif

View File

@ -1,11 +1,10 @@
/* /*
* $Id: tab.c,v 1.16 2006-09-01 07:18:40 bacon Exp $ * $Id: tab.c,v 1.17 2006-09-22 14:04:26 bacon Exp $
*/ */
#include <xp/awk/awk_i.h> #include <xp/awk/awk_i.h>
#ifndef XP_AWK_STAND_ALONE #ifndef XP_AWK_STAND_ALONE
#include <xp/bas/memory.h>
#include <xp/bas/assert.h> #include <xp/bas/assert.h>
#endif #endif

View File

@ -1,13 +1,11 @@
/* /*
* $Id: tree.c,v 1.74 2006-09-11 14:29:22 bacon Exp $ * $Id: tree.c,v 1.75 2006-09-22 14:04:26 bacon Exp $
*/ */
#include <xp/awk/awk_i.h> #include <xp/awk/awk_i.h>
#ifndef XP_AWK_STAND_ALONE #ifndef XP_AWK_STAND_ALONE
#include <xp/bas/memory.h>
#include <xp/bas/assert.h> #include <xp/bas/assert.h>
#include <xp/bas/stdio.h>
#endif #endif
static const xp_char_t* __assop_str[] = static const xp_char_t* __assop_str[] =
@ -242,9 +240,17 @@ static int __print_expression (xp_awk_t* awk, xp_awk_nde_t* nde)
case XP_AWK_NDE_REAL: case XP_AWK_NDE_REAL:
{ {
xp_char_t tmp[128]; xp_char_t tmp[128];
xp_awk_sprintf ( #if (XP_SIZEOF_LONG_DOUBLE != 0)
awk, tmp, xp_countof(tmp), XP_T("%Lf"), awk->syscas->sprintf (
tmp, xp_countof(tmp), XP_T("%Lf"),
(long double)((xp_awk_nde_real_t*)nde)->val); (long double)((xp_awk_nde_real_t*)nde)->val);
#elif (XP_SIZEOF_DOUBLE != 0)
awk->syscas->sprintf (
tmp, xp_countof(tmp), XP_T("%f"),
(double)((xp_awk_nde_real_t*)nde)->val);
#else
#error unsupported floating-point data type
#endif
PUT_SRCSTR (awk, tmp); PUT_SRCSTR (awk, tmp);
break; break;
} }

View File

@ -1,13 +1,11 @@
/* /*
* $Id: val.c,v 1.59 2006-09-01 07:18:40 bacon Exp $ * $Id: val.c,v 1.60 2006-09-22 14:04:26 bacon Exp $
*/ */
#include <xp/awk/awk_i.h> #include <xp/awk/awk_i.h>
#ifndef XP_AWK_STAND_ALONE #ifndef XP_AWK_STAND_ALONE
#include <xp/bas/memory.h>
#include <xp/bas/assert.h> #include <xp/bas/assert.h>
#include <xp/bas/stdio.h>
#endif #endif
static xp_awk_val_nil_t __awk_nil = { XP_AWK_VAL_NIL, 0 }; static xp_awk_val_nil_t __awk_nil = { XP_AWK_VAL_NIL, 0 };
@ -491,12 +489,12 @@ xp_char_t* xp_awk_valtostr (
xp_char_t tbuf[256], * tmp; xp_char_t tbuf[256], * tmp;
#if (XP_SIZEOF_LONG_DOUBLE != 0) #if (XP_SIZEOF_LONG_DOUBLE != 0)
xp_awk_sprintf ( run->awk->syscas->sprintf (
run->awk, tbuf, xp_countof(tbuf), XP_T("%Lf"), tbuf, xp_countof(tbuf), XP_T("%Lf"),
(long double)((xp_awk_val_real_t*)v)->val); (long double)((xp_awk_val_real_t*)v)->val);
#elif (XP_SIZEOF_DOUBLE != 0) #elif (XP_SIZEOF_DOUBLE != 0)
xp_awk_sprintf ( run->awk->syscas->sprintf (
run->awk, tbuf, xp_countof(tbuf), XP_T("%f"), tbuf, xp_countof(tbuf), XP_T("%f"),
(double)((xp_awk_val_real_t*)v)->val); (double)((xp_awk_val_real_t*)v)->val);
#else #else
#error unsupported floating-point data type #error unsupported floating-point data type

View File

@ -1,8 +1,9 @@
/* /*
* $Id: awk.c,v 1.89 2006-09-08 14:51:15 bacon Exp $ * $Id: awk.c,v 1.90 2006-09-22 14:05:30 bacon Exp $
*/ */
#include <xp/awk/awk.h> #include <xp/awk/awk.h>
#include <xp/bas/stdio.h>
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
#include <signal.h> #include <signal.h>
@ -670,6 +671,7 @@ static int __main (int argc, xp_char_t* argv[])
syscas.to_upper = towupper; syscas.to_upper = towupper;
syscas.to_lower = towlower; syscas.to_lower = towlower;
#endif #endif
syscas.sprintf = xp_sprintf;
#ifdef _WIN32 #ifdef _WIN32
syscas_data.heap = HeapCreate (0, 1000000, 1000000); syscas_data.heap = HeapCreate (0, 1000000, 1000000);
@ -754,6 +756,170 @@ static int __main (int argc, xp_char_t* argv[])
return 0; return 0;
} }
#ifdef _WIN32
/*
NTSYSAPI PTEB NTAPI NtCurrentTeb();
Function NtCurrentTeb returns address of TEB (Thread Environment Block) for calling thread.
NtCurrentTeb isn't typical NT CALL realised via INT 2E, becouse TEB is accessable at address fs:[0018h].
Microsoft declare NtCurrentTeb as __cdecl, but ntdll.dll export it as __stdcall (it don't have metter, becouse function don't have any parameters), so you cannot use ntdll.dll export. In this case the better way is write NtCurrentTeb manually, declaring it as __cdecl.
typedef UCHAR BOOLEAN;
typedef struct _TEB {
NT_TIB Tib;
PVOID EnvironmentPointer;
CLIENT_ID Cid;
PVOID ActiveRpcInfo;
PVOID ThreadLocalStoragePointer;
PPEB Peb;
ULONG LastErrorValue;
ULONG CountOfOwnedCriticalSections;
PVOID CsrClientThread;
PVOID Win32ThreadInfo;
ULONG Win32ClientInfo[0x1F];
PVOID WOW32Reserved;
ULONG CurrentLocale;
ULONG FpSoftwareStatusRegister;
PVOID SystemReserved1[0x36];
PVOID Spare1;
ULONG ExceptionCode;
ULONG SpareBytes1[0x28];
PVOID SystemReserved2[0xA];
ULONG GdiRgn;
ULONG GdiPen;
ULONG GdiBrush;
CLIENT_ID RealClientId;
PVOID GdiCachedProcessHandle;
ULONG GdiClientPID;
ULONG GdiClientTID;
PVOID GdiThreadLocaleInfo;
PVOID UserReserved[5];
PVOID GlDispatchTable[0x118];
ULONG GlReserved1[0x1A];
PVOID GlReserved2;
PVOID GlSectionInfo;
PVOID GlSection;
PVOID GlTable;
PVOID GlCurrentRC;
PVOID GlContext;
NTSTATUS LastStatusValue;
UNICODE_STRING StaticUnicodeString;
WCHAR StaticUnicodeBuffer[0x105];
PVOID DeallocationStack;
PVOID TlsSlots[0x40];
LIST_ENTRY TlsLinks;
PVOID Vdm;
PVOID ReservedForNtRpc;
PVOID DbgSsReserved[0x2];
ULONG HardErrorDisabled;
PVOID Instrumentation[0x10];
PVOID WinSockData;
ULONG GdiBatchCount;
ULONG Spare2;
ULONG Spare3;
ULONG Spare4;
PVOID ReservedForOle;
ULONG WaitingOnLoaderLock;
PVOID StackCommit;
PVOID StackCommitMax;
PVOID StackReserved;
} TEB, *PTEB;
typedef struct _PEB {
BOOLEAN InheritedAddressSpace;
BOOLEAN ReadImageFileExecOptions;
BOOLEAN BeingDebugged;
BOOLEAN Spare;
HANDLE Mutant;
PVOID ImageBaseAddress;
PPEB_LDR_DATA LoaderData;
PRTL_USER_PROCESS_PARAMETERS ProcessParameters;
PVOID SubSystemData;
PVOID ProcessHeap;
PVOID FastPebLock;
PPEBLOCKROUTINE FastPebLockRoutine;
PPEBLOCKROUTINE FastPebUnlockRoutine;
ULONG EnvironmentUpdateCount;
PPVOID KernelCallbackTable;
PVOID EventLogSection;
PVOID EventLog;
PPEB_FREE_BLOCK FreeList;
ULONG TlsExpansionCounter;
PVOID TlsBitmap;
ULONG TlsBitmapBits[0x2];
PVOID ReadOnlySharedMemoryBase;
PVOID ReadOnlySharedMemoryHeap;
PPVOID ReadOnlyStaticServerData;
PVOID AnsiCodePageData;
PVOID OemCodePageData;
PVOID UnicodeCaseTableData;
ULONG NumberOfProcessors;
ULONG NtGlobalFlag;
BYTE Spare2[0x4];
LARGE_INTEGER CriticalSectionTimeout;
ULONG HeapSegmentReserve;
ULONG HeapSegmentCommit;
ULONG HeapDeCommitTotalFreeThreshold;
ULONG HeapDeCommitFreeBlockThreshold;
ULONG NumberOfHeaps;
ULONG MaximumNumberOfHeaps;
PPVOID *ProcessHeaps;
PVOID GdiSharedHandleTable;
PVOID ProcessStarterHelper;
PVOID GdiDCAttributeList;
PVOID LoaderLock;
ULONG OSMajorVersion;
ULONG OSMinorVersion;
ULONG OSBuildNumber;
ULONG OSPlatformId;
ULONG ImageSubSystem;
ULONG ImageSubSystemMajorVersion;
ULONG ImageSubSystemMinorVersion;
ULONG GdiHandleBuffer[0x22];
ULONG PostProcessInitRoutine;
ULONG TlsExpansionBitmap;
BYTE TlsExpansionBitmapBits[0x80];
ULONG SessionId;
} PEB, *PPEB;
*/
void* get_current_teb ()
{
_asm
{
mov eax, fs:[0x18]
}
}
void* get_current_peb ()
{
void* teb = get_current_teb ();
return *(void**)((char*)teb + 0x30);
}
int is_debugger_present ()
{
void *peb = get_current_peb ();
return *((char*)peb+0x02);
}
int is_debugger_present2 ()
{
_asm
{
mov eax, fs:[0x18]
mov ebx, [eax+0x30]
xor eax, eax
mov al, byte ptr[ebx+0x02]
}
}
#endif
#if defined(__STAND_ALONE) && !defined(_WIN32) #if defined(__STAND_ALONE) && !defined(_WIN32)
int main (int argc, char* argv[]) int main (int argc, char* argv[])
#else #else
@ -779,6 +945,19 @@ if (n == (xp_size_t)-1)
} }
else xp_printf (XP_T("%d, %s\n"), n, buf); else xp_printf (XP_T("%d, %s\n"), n, buf);
} }
if (IsDebuggerPresent ())
{
xp_printf (XP_T("Running application in a debugger....\n"));
}
if (is_debugger_present ())
{
xp_printf (XP_T("Running application in a debugger by is_debugger_present...\n"));
}
if (is_debugger_present2 ())
{
xp_printf (XP_T("Running application in a debugger by is_debugger_present2...\n"));
}
#endif #endif
n = __main (argc, argv); n = __main (argc, argv);

19
ase/test/awk/t47.awk Normal file
View File

@ -0,0 +1,19 @@
BEGIN {
a[1] = 20;
a[2] = 40;
a[3,5,6] = 40;
a["abc"] = 20;
for (i in a) print "a[" i "]=" a[i];
#SUBSEP=",,,";
#SUBSEP=4.5;
SUBSEP=555;
print "------------------------";
a[9,x,3] = 40;
for (i in a) print "a[" i "]=" a[i];
}

View File

@ -66,7 +66,7 @@ LINK32=link.exe
# PROP Ignore_Export_Lib 0 # PROP Ignore_Export_Lib 0
# PROP Target_Dir "" # PROP Target_Dir ""
# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "..\..\.." /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_UNICODE" /D "__STAND_ALONE" /FR /YX /FD /GZ /c # ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "..\..\.." /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_UNICODE" /D _WIN32_WINNT=0x0400 /D "__STAND_ALONE" /FR /YX /FD /GZ /c
# ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD BASE RSC /l 0x409 /d "_DEBUG"
# ADD RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG"
BSC32=bscmake.exe BSC32=bscmake.exe