SCCS-vsn: usr.bin/tn3270/tools/mkmake.y 1.5
%token <string> TOKEN QUOTED_STRING
%token <intval> MACRO_CHAR BREAK_CHAR WHITE_SPACE NL END_OF_FILE
%token <intval> ':' '=' '$' '{' '}'
%token <string> TOKEN QUOTED_STRING
%token <intval> MACRO_CHAR BREAK_CHAR WHITE_SPACE NL END_OF_FILE
%token <intval> ':' '=' '$' '{' '}'
- $$ = same_copy(value_of($3));
#define visit(what,via) \
(visit_stack[++clock].next = 0, visit_stack[clock].first = via = what)
#define visit(what,via) \
(visit_stack[++clock].next = 0, visit_stack[clock].first = via = what)
-#define visited(via) (((via) == 0) \
+#define visited(via) (visitcheck(via) || ((via) == 0) \
|| (visit_stack[clock].next && (via == visit_stack[clock].first)))
#define visit_next(via) (visit_stack[clock].next = 1, (via) = (via)->nexttoken)
#define visit_end() (clock--)
|| (visit_stack[clock].next && (via == visit_stack[clock].first)))
#define visit_next(via) (visit_stack[clock].next = 1, (via) = (via)->nexttoken)
#define visit_end() (clock--)
+int
+visitcheck(same)
+same_t *same;
+{
+ if (same->string == 0) {
+ yyerror("BUG - freed 'same' in use...");
+ exit(1);
+ }
+ return 0;
+}
+
int
string_hashof(string, length)
char *string;
int
string_hashof(string, length)
char *string;
token = list;
do {
ptr = token->nexttoken;
token = list;
do {
ptr = token->nexttoken;
(void) free((char *)token);
token = ptr;
} while (token != list);
(void) free((char *)token);
token = ptr;
} while (token != list);
token->lasttoken->nexttoken = token->nexttoken;
token->nexttoken->lasttoken = token->lasttoken;
token->nexttoken = token->lasttoken = token;
token->lasttoken->nexttoken = token->nexttoken;
token->nexttoken->lasttoken = token->lasttoken;
token->nexttoken = token->lasttoken = token;
- (void) free((char *) token);
- same_t *ptr, *original = target;
if (target == 0) {
return 0;
if (target == 0) {
return 0;
do {
target->action_list = same_cat(target->action_list,
same_copy(actions));
do {
target->action_list = same_cat(target->action_list,
same_copy(actions));
- ptr = target->nexttoken;
+ if ((ptr = target->nexttoken) == target) {
+ ptr = 0;
+ }
same_unlink(target);
add_target(target);
target = ptr;
same_unlink(target);
add_target(target);
target = ptr;
- } while (target != original);
same_free(actions);
return 0;
same_free(actions);
return 0;
+dump_same(same)
+same_t *same;
+{
+ same_t *same2;
+
+ for (visit(same, same2); !visited(same2); visit_next(same2)) {
+ printf(same2->string->string);
+ }
+ visit_end();
+}
+
do_dump()
{
string_t *string;
do_dump()
{
string_t *string;