enhanced the cli-mode reader a bit
This commit is contained in:
parent
25243fc7af
commit
0634bf26b3
10
lib/exec.c
10
lib/exec.c
@ -1130,13 +1130,13 @@ static HCL_INLINE int exec_syscmd (hcl_t* hcl, hcl_ooi_t nargs)
|
|||||||
if (argv)
|
if (argv)
|
||||||
{
|
{
|
||||||
argv[0] = cmd;
|
argv[0] = cmd;
|
||||||
for (i = 0; i < nargs; i++)
|
HCL_DEBUG1 (hcl, "NARG %d\n", (int)nargs);
|
||||||
|
for (i = 0; i < nargs;)
|
||||||
{
|
{
|
||||||
hcl_oop_t ta;
|
hcl_oop_t ta = HCL_STACK_GETARG(hcl, nargs, i);
|
||||||
|
|
||||||
ta = HCL_STACK_GETARG(hcl, nargs, i);
|
|
||||||
/* TODO: check if an argument is a string or a symbol */
|
/* TODO: check if an argument is a string or a symbol */
|
||||||
argv[i + 1] = hcl_dupootobchars (hcl, HCL_OBJ_GET_CHAR_SLOT(ta), HCL_OBJ_GET_SIZE(ta), HCL_NULL);
|
argv[++i] = hcl_dupootobchars(hcl, HCL_OBJ_GET_CHAR_SLOT(ta), HCL_OBJ_GET_SIZE(ta), HCL_NULL);
|
||||||
|
HCL_DEBUG2 (hcl, "ARG %d -> %hs\n", (int)i - 1, argv[i]);
|
||||||
}
|
}
|
||||||
argv[nargs + 1] = HCL_NULL;
|
argv[nargs + 1] = HCL_NULL;
|
||||||
execvp (xcmd, argv);
|
execvp (xcmd, argv);
|
||||||
|
72
lib/read.c
72
lib/read.c
@ -1983,7 +1983,7 @@ static int read_object (hcl_t* hcl)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
obj = leave_list (hcl, &flagv, &oldflagv);
|
obj = leave_list(hcl, &flagv, &oldflagv);
|
||||||
|
|
||||||
level--;
|
level--;
|
||||||
if (LIST_FLAG_GET_CONCODE(oldflagv) == HCL_CONCODE_ARRAY) array_level--;
|
if (LIST_FLAG_GET_CONCODE(oldflagv) == HCL_CONCODE_ARRAY) array_level--;
|
||||||
@ -2158,7 +2158,7 @@ static int read_object (hcl_t* hcl)
|
|||||||
|
|
||||||
/* exit out of the quoted list. the quoted list can have
|
/* exit out of the quoted list. the quoted list can have
|
||||||
* one element only. */
|
* one element only. */
|
||||||
obj = leave_list (hcl, &flagv, &oldflagv);
|
obj = leave_list(hcl, &flagv, &oldflagv);
|
||||||
|
|
||||||
/* one level up toward the top */
|
/* one level up toward the top */
|
||||||
level--;
|
level--;
|
||||||
@ -2191,7 +2191,17 @@ static int read_object_in_cli_mode (hcl_t* hcl)
|
|||||||
{
|
{
|
||||||
int level = 0, array_level = 0, flagv = 0;
|
int level = 0, array_level = 0, flagv = 0;
|
||||||
hcl_oop_t obj;
|
hcl_oop_t obj;
|
||||||
|
int start_virtual_list = 1;
|
||||||
|
int prev_eoled = 0;
|
||||||
|
|
||||||
|
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;
|
flagv = 0;
|
||||||
LIST_FLAG_SET_CONCODE (flagv, HCL_CONCODE_XLIST);
|
LIST_FLAG_SET_CONCODE (flagv, HCL_CONCODE_XLIST);
|
||||||
|
|
||||||
@ -2201,9 +2211,9 @@ static int read_object_in_cli_mode (hcl_t* hcl)
|
|||||||
level++;
|
level++;
|
||||||
//if (LIST_FLAG_GET_CONCODE(flagv) == HCL_CONCODE_ARRAY) array_level++;
|
//if (LIST_FLAG_GET_CONCODE(flagv) == HCL_CONCODE_ARRAY) array_level++;
|
||||||
|
|
||||||
while (1)
|
start_virtual_list = 0;
|
||||||
{
|
}
|
||||||
redo:
|
|
||||||
switch (TOKEN_TYPE(hcl))
|
switch (TOKEN_TYPE(hcl))
|
||||||
{
|
{
|
||||||
default:
|
default:
|
||||||
@ -2228,13 +2238,13 @@ static int read_object_in_cli_mode (hcl_t* hcl)
|
|||||||
|
|
||||||
case HCL_IOTOK_LPAREN: /* () */
|
case HCL_IOTOK_LPAREN: /* () */
|
||||||
{
|
{
|
||||||
int first = 1;
|
/*int first = 1;
|
||||||
|
|
||||||
redo_lparen:
|
redo_lparen:*/
|
||||||
flagv = 0;
|
flagv = 0;
|
||||||
LIST_FLAG_SET_CONCODE (flagv, HCL_CONCODE_XLIST);
|
LIST_FLAG_SET_CONCODE (flagv, HCL_CONCODE_XLIST);
|
||||||
SET_TOKEN_TYPE (hcl, HCL_IOTOK_EOL); /* to have get_token() to ignore immediate <EOL> after ( */
|
SET_TOKEN_TYPE (hcl, HCL_IOTOK_EOL); /* to have get_token() to ignore immediate <EOL> after ( */
|
||||||
start_list:
|
/*start_list:*/
|
||||||
if (level >= HCL_TYPE_MAX(int))
|
if (level >= HCL_TYPE_MAX(int))
|
||||||
{
|
{
|
||||||
/* the nesting level has become too deep */
|
/* the nesting level has become too deep */
|
||||||
@ -2244,18 +2254,21 @@ static int read_object_in_cli_mode (hcl_t* hcl)
|
|||||||
|
|
||||||
/* push some data to simulate recursion into
|
/* push some data to simulate recursion into
|
||||||
* a list literal or an array literal */
|
* a list literal or an array literal */
|
||||||
|
HCL_DEBUG0 (hcl, "111 STARTING list...\n");
|
||||||
if (enter_list(hcl, flagv) == HCL_NULL) return -1;
|
if (enter_list(hcl, flagv) == HCL_NULL) return -1;
|
||||||
level++;
|
level++;
|
||||||
//if (LIST_FLAG_GET_CONCODE(flagv) == HCL_CONCODE_ARRAY) array_level++;
|
//if (LIST_FLAG_GET_CONCODE(flagv) == HCL_CONCODE_ARRAY) array_level++;
|
||||||
|
|
||||||
|
/*
|
||||||
if (first)
|
if (first)
|
||||||
{
|
{
|
||||||
first = 0;
|
first = 0;
|
||||||
goto redo_lparen;
|
goto redo_lparen;
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
/* read the next token */
|
/* read the next token */
|
||||||
GET_TOKEN (hcl);
|
GET_TOKEN (hcl);
|
||||||
|
start_virtual_list = 1;
|
||||||
goto redo;
|
goto redo;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2271,20 +2284,42 @@ static int read_object_in_cli_mode (hcl_t* hcl)
|
|||||||
}
|
}
|
||||||
|
|
||||||
//concode = LIST_FLAG_GET_CONCODE(flagv);
|
//concode = LIST_FLAG_GET_CONCODE(flagv);
|
||||||
obj = leave_list (hcl, &flagv, &oldflagv);
|
obj = leave_list(hcl, &flagv, &oldflagv);
|
||||||
|
|
||||||
level--;
|
level--;
|
||||||
//if (LIST_FLAG_GET_CONCODE(oldflagv) == HCL_CONCODE_ARRAY) array_level--;
|
//if (LIST_FLAG_GET_CONCODE(oldflagv) == HCL_CONCODE_ARRAY) array_level--;
|
||||||
|
|
||||||
|
start_virtual_list = 1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case HCL_IOTOK_RPAREN:
|
case HCL_IOTOK_RPAREN:
|
||||||
{
|
{
|
||||||
int first = 1;
|
|
||||||
int oldflagv;
|
int oldflagv;
|
||||||
//int concode;
|
//int concode;
|
||||||
|
|
||||||
|
if (prev_eoled)
|
||||||
|
{
|
||||||
|
/* exit #1 */
|
||||||
|
if (level <= 0)
|
||||||
|
{
|
||||||
|
hcl_setsynerr (hcl, HCL_SYNERR_UNBALPBB, TOKEN_LOC(hcl), HCL_NULL);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
//concode = LIST_FLAG_GET_CONCODE(flagv);
|
||||||
|
obj = leave_list(hcl, &flagv, &oldflagv);
|
||||||
|
level--;
|
||||||
|
//if (LIST_FLAG_GET_CONCODE(oldflagv) == HCL_CONCODE_ARRAY) array_level--;
|
||||||
|
|
||||||
|
if (!obj) return -1;
|
||||||
|
HCL_ASSERT (hcl, level > 0);
|
||||||
|
HCL_DEBUG1 (hcl, "00 ADDING TO LIST %O\n", obj);
|
||||||
|
if (chain_to_list(hcl, obj) == HCL_NULL) return -1;
|
||||||
|
clear_comma_colon_flag (hcl);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* exit #2 */
|
||||||
if (level <= 0)
|
if (level <= 0)
|
||||||
{
|
{
|
||||||
unbalpbb:
|
unbalpbb:
|
||||||
@ -2292,19 +2327,14 @@ static int read_object_in_cli_mode (hcl_t* hcl)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
redo_rparen:
|
|
||||||
//concode = LIST_FLAG_GET_CONCODE(flagv);
|
//concode = LIST_FLAG_GET_CONCODE(flagv);
|
||||||
obj = leave_list (hcl, &flagv, &oldflagv);
|
obj = leave_list(hcl, &flagv, &oldflagv);
|
||||||
|
|
||||||
level--;
|
level--;
|
||||||
|
|
||||||
|
level--; /* double exit??? */
|
||||||
//if (LIST_FLAG_GET_CONCODE(oldflagv) == HCL_CONCODE_ARRAY) array_level--;
|
//if (LIST_FLAG_GET_CONCODE(oldflagv) == HCL_CONCODE_ARRAY) array_level--;
|
||||||
|
|
||||||
if (first)
|
SET_TOKEN_TYPE (hcl, HCL_IOTOK_EOL); /* to have get_token() to ignore immediate <EOL> after ( */
|
||||||
{
|
|
||||||
first = 0;
|
|
||||||
goto redo_rparen;
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2326,9 +2356,11 @@ static int read_object_in_cli_mode (hcl_t* hcl)
|
|||||||
|
|
||||||
/* if not, append the element read into the current list.
|
/* if not, append the element read into the current list.
|
||||||
* if we are not at the top level, we must be in a 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) return -1;
|
if (chain_to_list(hcl, obj) == HCL_NULL) return -1;
|
||||||
clear_comma_colon_flag (hcl);
|
clear_comma_colon_flag (hcl);
|
||||||
|
|
||||||
|
prev_eoled = (TOKEN_TYPE(hcl) == HCL_IOTOK_EOL);
|
||||||
/* read the next token */
|
/* read the next token */
|
||||||
GET_TOKEN (hcl);
|
GET_TOKEN (hcl);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user