implemented a non-recursive s-expression reader
This commit is contained in:
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: awk.c 343 2010-08-05 07:31:17Z hyunghwan.chung $
|
||||
* $Id: awk.c 344 2010-08-17 13:15:14Z hyunghwan.chung $
|
||||
*
|
||||
Copyright 2006-2009 Chung, Hyung-Hwan.
|
||||
This file is part of QSE.
|
||||
@ -270,7 +270,7 @@ static void dprint_return (qse_awk_rtx_t* rtx, qse_awk_val_t* ret)
|
||||
static void on_statement (
|
||||
qse_awk_rtx_t* rtx, qse_awk_nde_t* nde, void* data)
|
||||
{
|
||||
dprint (L"running %d at line %d\n", (int)nde->type, (int)nde->loc.lin);
|
||||
dprint (L"running %d at line %d\n", (int)nde->type, (int)nde->loc.line);
|
||||
}
|
||||
#endif
|
||||
|
||||
@ -659,11 +659,11 @@ static void print_awkerr (qse_awk_t* awk)
|
||||
print_err (
|
||||
QSE_T("CODE %d LINE %u COLUMN %u %s%s%s- %s\n"),
|
||||
qse_awk_geterrnum(awk),
|
||||
(unsigned int)loc->lin,
|
||||
(unsigned int)loc->col,
|
||||
((loc->fil == QSE_NULL)? QSE_T(""): QSE_T("FILE ")),
|
||||
((loc->fil == QSE_NULL)? QSE_T(""): loc->fil),
|
||||
((loc->fil == QSE_NULL)? QSE_T(""): QSE_T(" ")),
|
||||
(unsigned int)loc->line,
|
||||
(unsigned int)loc->colm,
|
||||
((loc->file == QSE_NULL)? QSE_T(""): QSE_T("FILE ")),
|
||||
((loc->file == QSE_NULL)? QSE_T(""): loc->file),
|
||||
((loc->file == QSE_NULL)? QSE_T(""): QSE_T(" ")),
|
||||
qse_awk_geterrmsg(awk)
|
||||
);
|
||||
}
|
||||
@ -675,11 +675,11 @@ static void print_rtxerr (qse_awk_rtx_t* rtx)
|
||||
print_err (
|
||||
QSE_T("CODE %d LINE %u COLUMN %u %s%s%s- %s\n"),
|
||||
qse_awk_rtx_geterrnum(rtx),
|
||||
(unsigned int)loc->lin,
|
||||
(unsigned int)loc->col,
|
||||
((loc->fil == QSE_NULL)? QSE_T(""): QSE_T("FILE ")),
|
||||
((loc->fil == QSE_NULL)? QSE_T(""): loc->fil),
|
||||
((loc->fil == QSE_NULL)? QSE_T(""): QSE_T(" ")),
|
||||
(unsigned int)loc->line,
|
||||
(unsigned int)loc->colm,
|
||||
((loc->file == QSE_NULL)? QSE_T(""): QSE_T("FILE ")),
|
||||
((loc->file == QSE_NULL)? QSE_T(""): loc->file),
|
||||
((loc->file == QSE_NULL)? QSE_T(""): QSE_T(" ")),
|
||||
qse_awk_rtx_geterrmsg(rtx)
|
||||
);
|
||||
}
|
||||
|
@ -15,118 +15,66 @@
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#ifdef _WIN32
|
||||
#include <windows.h>
|
||||
#include <tchar.h>
|
||||
#endif
|
||||
|
||||
#if defined(_WIN32) && defined(_MSC_VER) && defined(_DEBUG)
|
||||
#define _CRTDBG_MAP_ALLOC
|
||||
#include <crtdbg.h>
|
||||
#endif
|
||||
|
||||
#if defined(__linux) && defined(_DEBUG)
|
||||
#include <mcheck.h>
|
||||
#endif
|
||||
|
||||
static qse_ssize_t get_input (
|
||||
int cmd, void* arg, qse_char_t* data, qse_size_t size)
|
||||
qse_lsp_t* lsp, qse_lsp_io_cmd_t cmd,
|
||||
qse_lsp_io_arg_t* arg, qse_char_t* data, qse_size_t size)
|
||||
{
|
||||
switch (cmd)
|
||||
{
|
||||
case QSE_LSP_IO_OPEN:
|
||||
arg->handle = stdin;
|
||||
return 1;
|
||||
|
||||
case QSE_LSP_IO_CLOSE:
|
||||
return 0;
|
||||
|
||||
case QSE_LSP_IO_READ:
|
||||
{
|
||||
/*
|
||||
if (qse_fgets (data, size, stdin) == QSE_NULL)
|
||||
{
|
||||
if (ferror(stdin)) return -1;
|
||||
return 0;
|
||||
}
|
||||
return qse_lsp_strlen(data);
|
||||
*/
|
||||
|
||||
qse_cint_t c;
|
||||
|
||||
if (size <= 0) return -1;
|
||||
c = qse_fgetc (stdin);
|
||||
c = qse_fgetc ((FILE*)arg->handle);
|
||||
|
||||
if (c == QSE_CHAR_EOF)
|
||||
{
|
||||
if (ferror(stdin)) return -1;
|
||||
if (ferror((FILE*)arg->handle)) return -1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
data[0] = c;
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
return -1;
|
||||
default:
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
static qse_ssize_t put_output (
|
||||
int cmd, void* arg, qse_char_t* data, qse_size_t size)
|
||||
qse_lsp_t* lsp, qse_lsp_io_cmd_t cmd,
|
||||
qse_lsp_io_arg_t* arg, qse_char_t* data, qse_size_t size)
|
||||
{
|
||||
switch (cmd)
|
||||
{
|
||||
case QSE_LSP_IO_OPEN:
|
||||
arg->handle = stdout;
|
||||
return 1;
|
||||
|
||||
case QSE_LSP_IO_CLOSE:
|
||||
return 0;
|
||||
|
||||
case QSE_LSP_IO_WRITE:
|
||||
{
|
||||
int n = qse_fprintf (
|
||||
stdout, QSE_T("%.*s"), size, data);
|
||||
(FILE*)arg->handle, QSE_T("%.*s"), size, data);
|
||||
if (n < 0) return -1;
|
||||
|
||||
return size;
|
||||
}
|
||||
|
||||
default:
|
||||
return -1;
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
#ifdef _WIN32
|
||||
typedef struct prmfns_data_t prmfns_data_t;
|
||||
struct prmfns_data_t
|
||||
{
|
||||
HANDLE heap;
|
||||
};
|
||||
#endif
|
||||
|
||||
static void* custom_lsp_malloc (void* custom, qse_size_t n)
|
||||
{
|
||||
#ifdef _WIN32
|
||||
return HeapAlloc (((prmfns_data_t*)custom)->heap, 0, n);
|
||||
#else
|
||||
return malloc (n);
|
||||
#endif
|
||||
}
|
||||
|
||||
static void* custom_lsp_realloc (void* custom, void* ptr, qse_size_t n)
|
||||
{
|
||||
#ifdef _WIN32
|
||||
/* HeapReAlloc behaves differently from realloc */
|
||||
if (ptr == NULL)
|
||||
return HeapAlloc (((prmfns_data_t*)custom)->heap, 0, n);
|
||||
else
|
||||
return HeapReAlloc (((prmfns_data_t*)custom)->heap, 0, ptr, n);
|
||||
#else
|
||||
return realloc (ptr, n);
|
||||
#endif
|
||||
}
|
||||
|
||||
static void custom_lsp_free (void* custom, void* ptr)
|
||||
{
|
||||
#ifdef _WIN32
|
||||
HeapFree (((prmfns_data_t*)custom)->heap, 0, ptr);
|
||||
#else
|
||||
free (ptr);
|
||||
#endif
|
||||
}
|
||||
|
||||
static int custom_lsp_sprintf (
|
||||
@ -143,15 +91,6 @@ static int custom_lsp_sprintf (
|
||||
return n;
|
||||
}
|
||||
|
||||
|
||||
static void custom_lsp_dprintf (void* custom, const qse_char_t* fmt, ...)
|
||||
{
|
||||
va_list ap;
|
||||
va_start (ap, fmt);
|
||||
qse_vfprintf (stderr, fmt, ap);
|
||||
va_end (ap);
|
||||
}
|
||||
|
||||
static int opt_memsize = 1000;
|
||||
static int opt_meminc = 1000;
|
||||
|
||||
@ -222,69 +161,49 @@ int lsp_main (int argc, qse_char_t* argv[])
|
||||
{
|
||||
qse_lsp_t* lsp;
|
||||
qse_lsp_obj_t* obj;
|
||||
qse_lsp_prmfns_t prmfns;
|
||||
#ifdef _WIN32
|
||||
prmfns_data_t prmfns_data;
|
||||
#endif
|
||||
qse_lsp_prm_t prm;
|
||||
|
||||
if (handle_args (argc, argv) == -1) return -1;
|
||||
|
||||
qse_memset (&prmfns, 0, QSE_SIZEOF(prmfns));
|
||||
prm.sprintf = custom_lsp_sprintf;
|
||||
prm.udd = QSE_NULL;
|
||||
|
||||
prmfns.mmgr.alloc = custom_lsp_malloc;
|
||||
prmfns.mmgr.realloc = custom_lsp_realloc;
|
||||
prmfns.mmgr.free = custom_lsp_free;
|
||||
#ifdef _WIN32
|
||||
prmfns_data.heap = HeapCreate (0, 1000000, 1000000);
|
||||
if (prmfns_data.heap == NULL)
|
||||
{
|
||||
qse_printf (QSE_T("Error: cannot create an lsp heap\n"));
|
||||
return -1;
|
||||
}
|
||||
|
||||
prmfns.mmgr.udd = &prmfns_data;
|
||||
#else
|
||||
prmfns.mmgr.udd = QSE_NULL;
|
||||
#endif
|
||||
|
||||
prmfns.misc.sprintf = custom_lsp_sprintf;
|
||||
prmfns.misc.dprintf = custom_lsp_dprintf;
|
||||
prmfns.misc.udd = QSE_NULL;
|
||||
|
||||
lsp = qse_lsp_open (&prmfns, opt_memsize, opt_meminc);
|
||||
lsp = qse_lsp_open (QSE_NULL, 0, &prm, opt_memsize, opt_meminc);
|
||||
if (lsp == QSE_NULL)
|
||||
{
|
||||
#ifdef _WIN32
|
||||
HeapDestroy (prmfns_data.heap);
|
||||
#endif
|
||||
qse_printf (QSE_T("Error: cannot create a lsp instance\n"));
|
||||
return -1;
|
||||
}
|
||||
|
||||
qse_printf (QSE_T("ASELSP 0.0001\n"));
|
||||
qse_printf (QSE_T("QSELSP 0.0001\n"));
|
||||
|
||||
qse_lsp_attinput (lsp, get_input, QSE_NULL);
|
||||
qse_lsp_attoutput (lsp, put_output, QSE_NULL);
|
||||
{
|
||||
qse_lsp_io_t io = { get_input, put_output };
|
||||
qse_lsp_attachio (lsp, &io);
|
||||
}
|
||||
|
||||
while (1)
|
||||
{
|
||||
qse_printf (QSE_T("ASELSP $ "));
|
||||
qse_printf (QSE_T("QSELSP $ "));
|
||||
qse_fflush (stdout);
|
||||
|
||||
qse_lsp_gc (lsp);
|
||||
|
||||
obj = qse_lsp_read (lsp);
|
||||
if (obj == QSE_NULL)
|
||||
{
|
||||
int errnum;
|
||||
qse_lsp_errnum_t errnum;
|
||||
qse_lsp_loc_t errloc;
|
||||
const qse_char_t* errmsg;
|
||||
|
||||
qse_lsp_geterror (lsp, &errnum, &errmsg);
|
||||
qse_lsp_geterror (lsp, &errnum, &errmsg, &errloc);
|
||||
|
||||
if (errnum != QSE_LSP_EEND &&
|
||||
errnum != QSE_LSP_EEXIT)
|
||||
{
|
||||
qse_printf (
|
||||
QSE_T("error in read: [%d] %s\n"),
|
||||
errnum, errmsg);
|
||||
QSE_T("error in read: [%d] %s at line %d column %d\n"),
|
||||
errnum, errmsg, (int)errloc.line, (int)errloc.colm);
|
||||
}
|
||||
|
||||
/* TODO: change the following check */
|
||||
@ -299,44 +218,25 @@ int lsp_main (int argc, qse_char_t* argv[])
|
||||
}
|
||||
else
|
||||
{
|
||||
int errnum;
|
||||
qse_lsp_errnum_t errnum;
|
||||
qse_lsp_loc_t errloc;
|
||||
const qse_char_t* errmsg;
|
||||
|
||||
qse_lsp_geterror (lsp, &errnum, &errmsg);
|
||||
qse_lsp_geterror (lsp, &errnum, &errmsg, &errloc);
|
||||
if (errnum == QSE_LSP_EEXIT) break;
|
||||
|
||||
qse_printf (
|
||||
QSE_T("error in eval: [%d] %s\n"),
|
||||
errnum, errmsg);
|
||||
QSE_T("error in eval: [%d] %s at line %d column %d\n"),
|
||||
errnum, errmsg, (int)errloc.line, (int)errloc.colm);
|
||||
}
|
||||
}
|
||||
|
||||
qse_lsp_close (lsp);
|
||||
|
||||
#ifdef _WIN32
|
||||
HeapDestroy (prmfns_data.heap);
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
int qse_main (int argc, qse_achar_t* argv[])
|
||||
{
|
||||
int n;
|
||||
|
||||
#if defined(__linux) && defined(_DEBUG)
|
||||
mtrace ();
|
||||
#endif
|
||||
|
||||
n = qse_runmain (argc, argv, lsp_main);
|
||||
|
||||
#if defined(__linux) && defined(_DEBUG)
|
||||
muntrace ();
|
||||
#endif
|
||||
#if defined(_WIN32) && defined(_MSC_VER) && defined(_DEBUG)
|
||||
_CrtDumpMemoryLeaks ();
|
||||
wprintf (L"Press ENTER to quit\n");
|
||||
getchar ();
|
||||
#endif
|
||||
|
||||
return n;
|
||||
return qse_runmain (argc, argv, lsp_main);
|
||||
}
|
||||
|
@ -308,13 +308,13 @@ int sed_main (int argc, qse_char_t* argv[])
|
||||
if (qse_sed_comp (sed, g_script, qse_strlen(g_script)) == -1)
|
||||
{
|
||||
const qse_sed_loc_t* errloc = qse_sed_geterrloc(sed);
|
||||
if (errloc->lin > 0 || errloc->col > 0)
|
||||
if (errloc->line > 0 || errloc->colm > 0)
|
||||
{
|
||||
qse_fprintf (QSE_STDERR,
|
||||
QSE_T("cannot compile - %s at line %lu column %lu\n"),
|
||||
qse_sed_geterrmsg(sed),
|
||||
(unsigned long)errloc->lin,
|
||||
(unsigned long)errloc->col
|
||||
(unsigned long)errloc->line,
|
||||
(unsigned long)errloc->colm
|
||||
);
|
||||
}
|
||||
else
|
||||
@ -330,13 +330,13 @@ int sed_main (int argc, qse_char_t* argv[])
|
||||
if (qse_sed_exec (sed, in, out) == -1)
|
||||
{
|
||||
const qse_sed_loc_t* errloc = qse_sed_geterrloc(sed);
|
||||
if (errloc->lin > 0 || errloc->col > 0)
|
||||
if (errloc->line > 0 || errloc->colm > 0)
|
||||
{
|
||||
qse_fprintf (QSE_STDERR,
|
||||
QSE_T("cannot execute - %s at line %lu column %lu\n"),
|
||||
qse_sed_geterrmsg(sed),
|
||||
(unsigned long)errloc->lin,
|
||||
(unsigned long)errloc->col
|
||||
(unsigned long)errloc->line,
|
||||
(unsigned long)errloc->colm
|
||||
);
|
||||
}
|
||||
else
|
||||
@ -359,7 +359,7 @@ oops:
|
||||
return ret;
|
||||
}
|
||||
|
||||
int qse_main (int argc, char* argv[])
|
||||
int qse_main (int argc, qse_achar_t* argv[])
|
||||
{
|
||||
return qse_runmain (argc, argv, sed_main);
|
||||
}
|
||||
|
Reference in New Issue
Block a user