dropped cli-mode code. it turned out to be not effective
This commit is contained in:
		
							
								
								
									
										268
									
								
								hcl/lib/read.c
									
									
									
									
									
								
							
							
						
						
									
										268
									
								
								hcl/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