interim commit
This commit is contained in:
parent
876cd7bec9
commit
64753ed49f
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: StdAwk.cpp 251 2009-08-10 07:11:16Z hyunghwan.chung $
|
||||
* $Id: StdAwk.cpp 252 2009-08-11 01:28:32Z hyunghwan.chung $
|
||||
*
|
||||
Copyright 2006-2009 Chung, Hyung-Hwan.
|
||||
|
||||
@ -798,7 +798,14 @@ int StdAwk::SourceFile::open (Data& io)
|
||||
QSE_SIO_READ:
|
||||
(QSE_SIO_WRITE|QSE_SIO_CREATE|QSE_SIO_TRUNCATE))
|
||||
);
|
||||
if (sio == QSE_NULL) return -1;
|
||||
if (sio == QSE_NULL)
|
||||
{
|
||||
qse_cstr_t ea;
|
||||
ea.ptr = name;
|
||||
ea.len = qse_strlen(name);
|
||||
((Awk*)io)->setError (ERR_OPEN, 0, &ea);
|
||||
return -1;
|
||||
}
|
||||
|
||||
base = qse_awk_basename ((awk_t*)io, name);
|
||||
if (base != name)
|
||||
@ -850,7 +857,14 @@ int StdAwk::SourceFile::open (Data& io)
|
||||
);
|
||||
|
||||
if (dbuf != QSE_NULL) QSE_MMGR_FREE (((awk_t*)io)->mmgr, dbuf);
|
||||
if (sio == QSE_NULL) return -1;
|
||||
if (sio == QSE_NULL)
|
||||
{
|
||||
qse_cstr_t ea;
|
||||
ea.ptr = file;
|
||||
ea.len = qse_strlen(file);
|
||||
((Awk*)io)->setError (ERR_OPEN, 0, &ea);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
io.setHandle (sio);
|
||||
@ -903,7 +917,14 @@ int StdAwk::SourceString::open (Data& io)
|
||||
QSE_SIO_READ:
|
||||
(QSE_SIO_WRITE|QSE_SIO_CREATE|QSE_SIO_TRUNCATE))
|
||||
);
|
||||
if (sio == QSE_NULL) return -1;
|
||||
if (sio == QSE_NULL)
|
||||
{
|
||||
qse_cstr_t ea;
|
||||
ea.ptr = ioname;
|
||||
ea.len = qse_strlen(ioname);
|
||||
((Awk*)io)->setError (ERR_OPEN, 0, &ea);
|
||||
return -1;
|
||||
}
|
||||
io.setHandle (sio);
|
||||
}
|
||||
|
||||
@ -914,7 +935,6 @@ int StdAwk::SourceString::close (Data& io)
|
||||
{
|
||||
if (io.getName() != QSE_NULL)
|
||||
qse_sio_close ((qse_sio_t*)io.getHandle());
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -48,36 +48,12 @@ static bool verbose = false;
|
||||
class MyAwk: public QSE::StdAwk
|
||||
{
|
||||
public:
|
||||
MyAwk (): srcInName(QSE_NULL), srcOutName(QSE_NULL)
|
||||
|
||||
{
|
||||
#ifdef _WIN32
|
||||
heap = QSE_NULL;
|
||||
#endif
|
||||
}
|
||||
|
||||
~MyAwk ()
|
||||
{
|
||||
close ();
|
||||
}
|
||||
MyAwk () { }
|
||||
~MyAwk () { close (); }
|
||||
|
||||
int open ()
|
||||
{
|
||||
#ifdef _WIN32
|
||||
QSE_ASSERT (heap == QSE_NULL);
|
||||
heap = ::HeapCreate (0, 1000000, 1000000);
|
||||
if (heap == QSE_NULL) return -1;
|
||||
#endif
|
||||
|
||||
int n = StdAwk::open ();
|
||||
if (n <= -1)
|
||||
{
|
||||
#ifdef _WIN32
|
||||
HeapDestroy (heap);
|
||||
heap = QSE_NULL;
|
||||
#endif
|
||||
return -1;
|
||||
}
|
||||
if (StdAwk::open () <= -1) return -1;
|
||||
|
||||
idLastSleep = addGlobal (QSE_T("LAST_SLEEP"));
|
||||
if (idLastSleep <= -1) goto failure;
|
||||
@ -94,27 +70,9 @@ public:
|
||||
|
||||
failure:
|
||||
StdAwk::close ();
|
||||
|
||||
#ifdef _WIN32
|
||||
HeapDestroy (heap);
|
||||
heap = QSE_NULL;
|
||||
#endif
|
||||
return -1;
|
||||
}
|
||||
|
||||
void close ()
|
||||
{
|
||||
StdAwk::close ();
|
||||
|
||||
#ifdef _WIN32
|
||||
if (heap != QSE_NULL)
|
||||
{
|
||||
HeapDestroy (heap);
|
||||
heap = QSE_NULL;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
int sleep (Run& run, Value& ret, const Value* args, size_t nargs,
|
||||
const char_t* name, size_t len)
|
||||
{
|
||||
@ -188,15 +146,9 @@ public:
|
||||
return 0;
|
||||
}
|
||||
|
||||
Run* parse (const char_t* in, const char_t* out)
|
||||
{
|
||||
srcInName = in;
|
||||
srcOutName = out;
|
||||
return StdAwk::parse ();
|
||||
}
|
||||
|
||||
protected:
|
||||
|
||||
#if 0
|
||||
bool onLoopEnter (Run& run)
|
||||
{
|
||||
set_intr_run ();
|
||||
@ -214,135 +166,10 @@ protected:
|
||||
qse_printf (QSE_T("*** return [%.*s] ***\n"), (int)len, ptr);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
int openSource (Source& io)
|
||||
{
|
||||
Source::Mode mode = io.getMode();
|
||||
FILE* fp = QSE_NULL;
|
||||
|
||||
// TODO: use sio instead of stdio
|
||||
if (mode == Source::READ)
|
||||
{
|
||||
if (srcInName == QSE_NULL)
|
||||
{
|
||||
io.setHandle (stdin);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (srcInName[0] == QSE_T('\0')) fp = stdin;
|
||||
else fp = qse_fopen (srcInName, QSE_T("r"));
|
||||
}
|
||||
else if (mode == Source::WRITE)
|
||||
{
|
||||
if (srcOutName == QSE_NULL)
|
||||
{
|
||||
io.setHandle (stdout);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (srcOutName[0] == QSE_T('\0')) fp = stdout;
|
||||
else fp = qse_fopen (srcOutName, QSE_T("w"));
|
||||
}
|
||||
|
||||
if (fp == QSE_NULL) return -1;
|
||||
io.setHandle (fp);
|
||||
return 1;
|
||||
}
|
||||
|
||||
int closeSource (Source& io)
|
||||
{
|
||||
FILE* fp = (FILE*)io.getHandle();
|
||||
if (fp == stdout || fp == stderr) fflush (fp);
|
||||
if (fp != stdin && fp != stdout && fp != stderr) fclose (fp);
|
||||
io.setHandle (QSE_NULL);
|
||||
return 0;
|
||||
}
|
||||
|
||||
ssize_t readSource (Source& io, char_t* buf, size_t len)
|
||||
{
|
||||
FILE* fp = (FILE*)io.getHandle();
|
||||
ssize_t n = 0;
|
||||
|
||||
while (n < (ssize_t)len)
|
||||
{
|
||||
qse_cint_t c = qse_fgetc (fp);
|
||||
if (c == QSE_CHAR_EOF)
|
||||
{
|
||||
if (qse_ferror(fp)) n = -1;
|
||||
break;
|
||||
}
|
||||
|
||||
buf[n++] = c;
|
||||
if (c == QSE_T('\n')) break;
|
||||
}
|
||||
|
||||
return n;
|
||||
}
|
||||
|
||||
ssize_t writeSource (Source& io, char_t* buf, size_t len)
|
||||
{
|
||||
FILE* fp = (FILE*)io.getHandle();
|
||||
size_t left = len;
|
||||
|
||||
while (left > 0)
|
||||
{
|
||||
if (*buf == QSE_T('\0'))
|
||||
{
|
||||
if (qse_fputc(*buf,fp) == QSE_CHAR_EOF) return -1;
|
||||
left -= 1; buf += 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
int chunk = (left > QSE_TYPE_MAX(int))? QSE_TYPE_MAX(int): (int)left;
|
||||
int n = qse_fprintf (fp, QSE_T("%.*s"), chunk, buf);
|
||||
if (n < 0 || n > chunk) return -1;
|
||||
left -= n; buf += n;
|
||||
}
|
||||
}
|
||||
|
||||
return len;
|
||||
}
|
||||
|
||||
void* allocMem (size_t n) throw ()
|
||||
{
|
||||
#ifdef _WIN32
|
||||
return ::HeapAlloc (heap, 0, n);
|
||||
#else
|
||||
return ::malloc (n);
|
||||
#endif
|
||||
}
|
||||
|
||||
void* reallocMem (void* ptr, size_t n) throw ()
|
||||
{
|
||||
#ifdef _WIN32
|
||||
if (ptr == NULL)
|
||||
return ::HeapAlloc (heap, 0, n);
|
||||
else
|
||||
return ::HeapReAlloc (heap, 0, ptr, n);
|
||||
#else
|
||||
return ::realloc (ptr, n);
|
||||
#endif
|
||||
}
|
||||
|
||||
void freeMem (void* ptr) throw ()
|
||||
{
|
||||
#ifdef _WIN32
|
||||
::HeapFree (heap, 0, ptr);
|
||||
#else
|
||||
::free (ptr);
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
||||
private:
|
||||
const char_t* srcInName;
|
||||
const char_t* srcOutName;
|
||||
|
||||
int idLastSleep;
|
||||
|
||||
#ifdef _WIN32
|
||||
void* heap;
|
||||
#endif
|
||||
};
|
||||
|
||||
#ifdef _WIN32
|
||||
@ -603,6 +430,7 @@ static int awk_main (int argc, qse_char_t* argv[])
|
||||
{
|
||||
const qse_char_t* p;
|
||||
qse_size_t l;
|
||||
qse_cstr_t ow, nw;
|
||||
|
||||
p = qse_strchr(argv[i], QSE_T(':'));
|
||||
if (p == QSE_NULL)
|
||||
@ -613,10 +441,13 @@ static int awk_main (int argc, qse_char_t* argv[])
|
||||
|
||||
l = qse_strlen (argv[i]);
|
||||
|
||||
awk.setWord (
|
||||
argv[i], p - argv[i],
|
||||
p + 1, l - (p - argv[i] + 1));
|
||||
ow.ptr = argv[i];
|
||||
ow.len = p - argv[i];
|
||||
|
||||
nw.ptr = p + 1;
|
||||
nw.len = l - (ow.len + 1);
|
||||
|
||||
awk.setWord (&ow, &nw);
|
||||
mode = 0;
|
||||
}
|
||||
}
|
||||
@ -629,7 +460,10 @@ static int awk_main (int argc, qse_char_t* argv[])
|
||||
return -1;
|
||||
}
|
||||
|
||||
run = awk.parse (srcin, srcout);
|
||||
MyAwk::SourceFile sin (srcin);
|
||||
MyAwk::SourceFile sout (srcout);
|
||||
|
||||
run = awk.parse (sin, sout);
|
||||
if (run == QSE_NULL)
|
||||
{
|
||||
qse_fprintf (stderr, QSE_T("cannot parse: LINE[%d] %s\n"),
|
||||
@ -638,10 +472,10 @@ static int awk_main (int argc, qse_char_t* argv[])
|
||||
return -1;
|
||||
}
|
||||
|
||||
awk.enableRunCallback ();
|
||||
app_awk = &awk;
|
||||
|
||||
if (awk.loop () <= -1)
|
||||
MyAwk::Value ret;
|
||||
if (awk.loop (&ret) <= -1)
|
||||
{
|
||||
qse_fprintf (stderr, QSE_T("cannot run: LINE[%d] %s\n"),
|
||||
awk.getErrorLine(), awk.getErrorMessage());
|
||||
@ -649,20 +483,6 @@ static int awk_main (int argc, qse_char_t* argv[])
|
||||
return -1;
|
||||
}
|
||||
|
||||
#if 0
|
||||
MyAwk::Value args[2];
|
||||
|
||||
args[0].setRun (run);
|
||||
args[1].setRun (run);
|
||||
|
||||
if (awk.call (QSE_T("add"), args, 2) <= -1)
|
||||
{
|
||||
qse_fprintf (stderr, QSE_T("cannot run: LINE[%d] %s\n"),
|
||||
awk.getErrorLine(), awk.getErrorMessage());
|
||||
awk.close ();
|
||||
}
|
||||
#endif
|
||||
|
||||
app_awk = QSE_NULL;
|
||||
awk.close ();
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user