some more changes and fixes

This commit is contained in:
ceriel 1990-10-01 11:44:27 +00:00
parent 14133b5e2f
commit eb1326e3ec
6 changed files with 43 additions and 9 deletions

View file

@ -109,9 +109,10 @@ unop_prio(op)
case E_NOT: case E_NOT:
case E_BNOT: case E_BNOT:
case E_MIN: case E_MIN:
case E_MUL: case E_DEREF:
case E_SELECT: case E_SELECT:
case E_PLUS: case E_PLUS:
case E_ADDR:
return 12; return 12;
} }
return 1; return 1;

View file

@ -439,6 +439,10 @@ LLlex()
c = getc(db_in); c = getc(db_in);
} while (c != EOF && class(c) == STSKIP); } while (c != EOF && class(c) == STSKIP);
if (c == EOF) return c; if (c == EOF) return c;
if (extended_charset && in_ext(c)) {
TOK = get_name(c);
return TOK;
}
switch(class(c)) { switch(class(c)) {
case STSTR: case STSTR:
TOK = (*currlang->get_string)(c); TOK = (*currlang->get_string)(c);

View file

@ -329,6 +329,8 @@ type(p_type *ptp; int *type_index; p_symbol sy;)
p_type t1, t2; p_type t1, t2;
long ic1, ic2; long ic1, ic2;
int A_used = 0; int A_used = 0;
int tclass;
char *str;
} }
: { *ptp = 0; } : { *ptp = 0; }
[ [
@ -336,16 +338,28 @@ type(p_type *ptp; int *type_index; p_symbol sy;)
/* these are used in C for references to a struct, union or /* these are used in C for references to a struct, union or
* enum that has not been declared (yet) * enum that has not been declared (yet)
*/ */
'x' { tp = new_type(); tp->ty_flags = T_CROSS; } 'x'
[ 's' /* struct */ [ 's' /* struct */
{ tp->ty_class = T_STRUCT; } { tclass = T_STRUCT; }
| 'u' /* union */ | 'u' /* union */
{ tp->ty_class = T_UNION; } { tclass = T_UNION; }
| 'e' /* enum */ | 'e' /* enum */
{ tp->ty_class = T_ENUM; } { tclass = T_ENUM; }
] ]
{ AllowName = 1; } { AllowName = 1; }
name(&(tp->ty_tag)) name(&str)
{ sy = Lookfromscope(str2idf(str,0),CurrentScope,TAG);
if (sy && sy->sy_type->ty_class == tclass) {
tp = sy->sy_type;
}
else {
tp = new_type();
tp->ty_flags = T_CROSS;
tp->ty_class = tclass;
tp->ty_tag = str;
sy = NewSymbol(str, CurrentScope, TAG, (struct outname *) 0);
}
}
| |
/* subrange */ /* subrange */
/* the integer_const's represent the lower and the upper bound. /* the integer_const's represent the lower and the upper bound.

View file

@ -871,6 +871,14 @@ array_addr(p, paddr, psize, ptp)
free(buf); free(buf);
return 0; return 0;
} }
if ((*ptp)->ty_class == T_POINTER) {
if (! get_bytes(pointer_size, *paddr, (char *) paddr)) {
error("could not get value");
free(buf);
return 0;
}
*paddr = get_int((char *) paddr, pointer_size, T_UNSIGNED);
}
if (! convert(&buf, &size, &tp, int_type, int_size)) { if (! convert(&buf, &size, &tp, int_type, int_size)) {
free(buf); free(buf);
return 0; return 0;

View file

@ -40,6 +40,7 @@ t_lineno currline, listline;
static int catch_sigpipe(); static int catch_sigpipe();
static int stopped(); static int stopped();
static int uputm(), ugetm(); static int uputm(), ugetm();
static t_addr curr_stop;
int int
init_run() init_run()
@ -169,7 +170,13 @@ start_child(p)
return 0; return 0;
} }
do_items(); do_items();
if (! restoring) send_cont(1); if (! restoring && ! item_addr_actions(curr_stop)) {
send_cont(1);
}
else if (! restoring) {
stopped("stopped", curr_stop);
handle_displays();
}
return 1; return 1;
} }
@ -294,10 +301,11 @@ stopped(s, a)
if (s) { if (s) {
fprintf(db_out, "%s ", s); fprintf(db_out, "%s ", s);
pos = print_position((t_addr) a, 1); pos = print_position(a, 1);
fputs("\n", db_out); fputs("\n", db_out);
list_position(pos); list_position(pos);
} }
curr_stop = a;
return 1; return 1;
} }

View file

@ -368,7 +368,6 @@ do_list(p)
p_position pos; p_position pos;
if (a == ILL_ADDR) { if (a == ILL_ADDR) {
error("could not determine address");
return; return;
} }
pos = get_position_from_addr(a); pos = get_position_from_addr(a);