dropped cli-mode code. it turned out to be not effective
This commit is contained in:
268
lib/read.c
268
lib/read.c
@ -1015,18 +1015,7 @@ retry:
|
||||
do
|
||||
{
|
||||
/* skip spaces */
|
||||
while (is_spacechar(hcl->c->lxc.c))
|
||||
{
|
||||
if ((hcl->option.trait & HCL_CLI_MODE) && hcl->c->lxc.c == '\n' && TOKEN_TYPE(hcl) != HCL_IOTOK_EOL)
|
||||
{
|
||||
SET_TOKEN_TYPE (hcl, HCL_IOTOK_EOL);
|
||||
CLEAR_TOKEN_NAME (hcl);
|
||||
ADD_TOKEN_STR(hcl, vocas[VOCA_EOL].str, vocas[VOCA_EOL].len);
|
||||
hcl->c->tok.loc = hcl->c->lxc.l; /* set token location */
|
||||
goto done;
|
||||
}
|
||||
GET_CHAR (hcl);
|
||||
}
|
||||
while (is_spacechar(hcl->c->lxc.c)) GET_CHAR (hcl);
|
||||
/* the first character after the last space is in hcl->c->lxc */
|
||||
if ((n = skip_comment(hcl)) <= -1) return -1;
|
||||
}
|
||||
@ -2187,258 +2176,6 @@ static int read_object (hcl_t* hcl)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int read_object_in_cli_mode (hcl_t* hcl)
|
||||
{
|
||||
/*
|
||||
( ls -laF
|
||||
pwd ) -> ( (ls -laF) (pwd) )
|
||||
|
||||
|
||||
|
||||
ls -laF (pwd) -> (ls -laF ( (pwd ) )
|
||||
|
||||
|
||||
ls -laF -> (ls -laF)
|
||||
|
||||
|
||||
( -> (
|
||||
ls -laF -> (ls -laF)
|
||||
pwd -> (pwd)
|
||||
) -> )
|
||||
|
||||
|
||||
( (
|
||||
pwd ( (pwd (
|
||||
ls -laF (ls -laF)
|
||||
) ) )
|
||||
) )
|
||||
|
||||
* SOME key test cases
|
||||
------------
|
||||
(pwd)
|
||||
------------
|
||||
(pwd
|
||||
)
|
||||
------------
|
||||
(
|
||||
pwd)
|
||||
------------
|
||||
(
|
||||
pwd
|
||||
)
|
||||
------------
|
||||
pwd (pwd)
|
||||
------------
|
||||
pwd (pwd
|
||||
)
|
||||
*
|
||||
|
||||
---------------
|
||||
pwd) -------> error
|
||||
|
||||
*/
|
||||
int level = 0, array_level = 0, flagv = 0;
|
||||
hcl_oop_t obj;
|
||||
int start_virtual_list = 1;
|
||||
hcl_iotok_type_t prev_token_type = HCL_IOTOK_EOF;
|
||||
|
||||
if (TOKEN_TYPE(hcl) == HCL_IOTOK_LPAREN) start_virtual_list = 0;
|
||||
|
||||
while (1)
|
||||
{
|
||||
redo:
|
||||
if (start_virtual_list)
|
||||
{
|
||||
HCL_DEBUG0 (hcl, "STARTING vritual list...\n");
|
||||
flagv = 0;
|
||||
LIST_FLAG_SET_CONCODE (flagv, HCL_CONCODE_XLIST);
|
||||
|
||||
/* push some data to simulate recursion into
|
||||
* a list literal or an array literal */
|
||||
if (enter_list(hcl, flagv) == HCL_NULL) goto oops;
|
||||
level++;
|
||||
//if (LIST_FLAG_GET_CONCODE(flagv) == HCL_CONCODE_ARRAY) array_level++;
|
||||
|
||||
start_virtual_list = 0;
|
||||
}
|
||||
|
||||
switch (TOKEN_TYPE(hcl))
|
||||
{
|
||||
default:
|
||||
hcl_setsynerr (hcl, HCL_SYNERR_ILTOK, TOKEN_LOC(hcl), TOKEN_NAME(hcl));
|
||||
goto oops;
|
||||
|
||||
case HCL_IOTOK_EOF:
|
||||
hcl_setsynerr (hcl, HCL_SYNERR_EOF, TOKEN_LOC(hcl), TOKEN_NAME(hcl));
|
||||
goto oops;
|
||||
|
||||
case HCL_IOTOK_INCLUDE:
|
||||
/* TODO: should i limit where #include can be specified?
|
||||
* disallow it inside a list literal or an array literal? */
|
||||
GET_TOKEN (hcl);
|
||||
if (TOKEN_TYPE(hcl) != HCL_IOTOK_STRLIT)
|
||||
{
|
||||
hcl_setsynerr (hcl, HCL_SYNERR_STRING, TOKEN_LOC(hcl), TOKEN_NAME(hcl));
|
||||
goto oops;
|
||||
}
|
||||
if (begin_include(hcl) <= -1) goto oops;
|
||||
goto redo;
|
||||
|
||||
case HCL_IOTOK_LPAREN: /* () */
|
||||
flagv = 0;
|
||||
LIST_FLAG_SET_CONCODE (flagv, HCL_CONCODE_EXPLIST);
|
||||
/*start_list:*/
|
||||
if (level >= HCL_TYPE_MAX(int))
|
||||
{
|
||||
/* the nesting level has become too deep */
|
||||
hcl_setsynerr (hcl, HCL_SYNERR_NESTING, TOKEN_LOC(hcl), TOKEN_NAME(hcl));
|
||||
goto oops;
|
||||
}
|
||||
|
||||
/* push some data to simulate recursion into
|
||||
* a list literal or an array literal */
|
||||
HCL_DEBUG0 (hcl, "111 STARTING list...\n");
|
||||
if (enter_list(hcl, flagv) == HCL_NULL) goto oops;
|
||||
level++;
|
||||
//if (LIST_FLAG_GET_CONCODE(flagv) == HCL_CONCODE_ARRAY) array_level++;
|
||||
|
||||
/* read the next token */
|
||||
start_virtual_list = 1;
|
||||
goto next_token;
|
||||
|
||||
case HCL_IOTOK_EOL:
|
||||
{
|
||||
int oldflagv;
|
||||
//int concode;
|
||||
|
||||
if (prev_token_type == HCL_IOTOK_EOL || prev_token_type == HCL_IOTOK_LPAREN) goto next_token;
|
||||
|
||||
if (level <= 0)
|
||||
{
|
||||
hcl_setsynerr (hcl, HCL_SYNERR_UNBALPBB, TOKEN_LOC(hcl), HCL_NULL);
|
||||
goto oops;
|
||||
}
|
||||
|
||||
HCL_DEBUG1 (hcl, "11 LEAVING LIST level->%d\n", (int)level);
|
||||
//concode = LIST_FLAG_GET_CONCODE(flagv);
|
||||
obj = leave_list(hcl, &flagv, &oldflagv);
|
||||
|
||||
level--;
|
||||
//if (LIST_FLAG_GET_CONCODE(oldflagv) == HCL_CONCODE_ARRAY) array_level--;
|
||||
|
||||
start_virtual_list = 1;
|
||||
break;
|
||||
}
|
||||
|
||||
case HCL_IOTOK_RPAREN:
|
||||
{
|
||||
int oldflagv;
|
||||
//int concode;
|
||||
|
||||
if (prev_token_type == HCL_IOTOK_LPAREN)
|
||||
{
|
||||
hcl_setsynerr (hcl, HCL_SYNERR_EMPTYXLIST, TOKEN_LOC(hcl), HCL_NULL); /* TODO: change error code?? */
|
||||
goto oops;
|
||||
}
|
||||
else if (prev_token_type == HCL_IOTOK_EOL)
|
||||
{
|
||||
if (level <= 1) goto unbalpbb;
|
||||
|
||||
obj = leave_list(hcl, &flagv, &oldflagv);
|
||||
level--;
|
||||
//if (LIST_FLAG_GET_CONCODE(oldflagv) == HCL_CONCODE_ARRAY) array_level--;
|
||||
|
||||
if (!obj) goto oops;
|
||||
HCL_ASSERT (hcl, level > 0);
|
||||
HCL_ASSERT (hcl, obj == hcl->_nil);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* exit #1 */
|
||||
if (level <= 1) goto unbalpbb;
|
||||
|
||||
//concode = LIST_FLAG_GET_CONCODE(flagv);
|
||||
HCL_DEBUG0 (hcl, "22 LEAVING LIST\n");
|
||||
obj = leave_list(hcl, &flagv, &oldflagv);
|
||||
level--;
|
||||
//if (LIST_FLAG_GET_CONCODE(oldflagv) == HCL_CONCODE_ARRAY) array_level--;
|
||||
|
||||
if (!obj) goto oops;
|
||||
HCL_ASSERT (hcl, level > 0);
|
||||
|
||||
if (obj != hcl->_nil)
|
||||
{
|
||||
//HCL_ASSERT (hcl, obj == hcl->_nil);
|
||||
HCL_DEBUG1 (hcl, "00 ADDING TO LIST %O\n", obj);
|
||||
if (chain_to_list(hcl, obj) == HCL_NULL) goto oops;
|
||||
clear_comma_colon_flag (hcl);
|
||||
}
|
||||
}
|
||||
|
||||
/* exit #2 */
|
||||
if (level <= 0)
|
||||
{
|
||||
unbalpbb:
|
||||
hcl_setsynerr (hcl, HCL_SYNERR_UNBALPBB, TOKEN_LOC(hcl), HCL_NULL);
|
||||
goto oops;
|
||||
}
|
||||
|
||||
HCL_DEBUG1 (hcl, "33 LEAVING LIST level %d\n", level);
|
||||
//concode = LIST_FLAG_GET_CONCODE(flagv);
|
||||
obj = leave_list(hcl, &flagv, &oldflagv); /* this object is added to the chain after break */
|
||||
level--;
|
||||
|
||||
//if (LIST_FLAG_GET_CONCODE(oldflagv) == HCL_CONCODE_ARRAY) array_level--;
|
||||
|
||||
if (!obj) goto oops;
|
||||
if (obj == hcl->_nil)
|
||||
{
|
||||
/* consider an input like ls (pwd <EOL>) where EOL is '\n' */
|
||||
goto next_token;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case HCL_IOTOK_NUMLIT:
|
||||
case HCL_IOTOK_RADNUMLIT:
|
||||
obj = string_to_num(hcl, TOKEN_NAME(hcl), TOKEN_TYPE(hcl) == HCL_IOTOK_RADNUMLIT);
|
||||
break;
|
||||
|
||||
case HCL_IOTOK_STRLIT:
|
||||
obj = hcl_makestring(hcl, TOKEN_NAME_PTR(hcl), TOKEN_NAME_LEN(hcl), 0);
|
||||
break;
|
||||
|
||||
case HCL_IOTOK_IDENT:
|
||||
obj = hcl_makestring(hcl, TOKEN_NAME_PTR(hcl), TOKEN_NAME_LEN(hcl), 0);
|
||||
obj = hcl_makesymbol(hcl, TOKEN_NAME_PTR(hcl), TOKEN_NAME_LEN(hcl));
|
||||
break;
|
||||
}
|
||||
|
||||
if (!obj) goto oops;
|
||||
|
||||
/* check if we are at the top level */
|
||||
if (level <= 0) break; /* yes */
|
||||
|
||||
/* if not, append the element read into the current list.
|
||||
* if we are not at the top level, we must be in a list */
|
||||
HCL_DEBUG1 (hcl, "11 ADDING TO LIST %O\n", obj);
|
||||
if (chain_to_list(hcl, obj) == HCL_NULL) goto oops;
|
||||
clear_comma_colon_flag (hcl);
|
||||
|
||||
next_token:
|
||||
prev_token_type = TOKEN_TYPE(hcl);
|
||||
/* read the next token */
|
||||
GET_TOKEN (hcl);
|
||||
}
|
||||
|
||||
hcl->c->r.e = obj;
|
||||
return 0;
|
||||
|
||||
oops:
|
||||
SET_TOKEN_TYPE (hcl, HCL_IOTOK_EOL); /* to make get_token() not return an immediate EOL after error */
|
||||
return -1;
|
||||
}
|
||||
|
||||
static HCL_INLINE int __read (hcl_t* hcl)
|
||||
{
|
||||
if (get_token(hcl) <= -1) return -1;
|
||||
@ -2447,7 +2184,7 @@ static HCL_INLINE int __read (hcl_t* hcl)
|
||||
hcl_seterrnum (hcl, HCL_EFINIS);
|
||||
return -1;
|
||||
}
|
||||
return (hcl->option.trait & HCL_CLI_MODE)? read_object_in_cli_mode(hcl): read_object(hcl);
|
||||
return read_object(hcl);
|
||||
}
|
||||
|
||||
hcl_oop_t hcl_read (hcl_t* hcl)
|
||||
@ -2615,7 +2352,6 @@ int hcl_attachio (hcl_t* hcl, hcl_ioimpl_t reader, hcl_ioimpl_t printer)
|
||||
|
||||
/* the stream is open. set it as the current input stream */
|
||||
hcl->c->curinp = &hcl->c->inarg;
|
||||
if (hcl->option.trait & HCL_CLI_MODE) SET_TOKEN_TYPE (hcl, HCL_IOTOK_EOL);
|
||||
return 0;
|
||||
|
||||
oops:
|
||||
|
Reference in New Issue
Block a user