void dump_bkod() { opcode_type opcode; int i, line; char text[50000]; char opcode_char; static int last_line = 0; // printf("at %08X\n",index); inst_start = index; line = find_linenum(index); if (line != last_line) { printf("*** Line %d\n", line); last_line = line; } opcode_char = get_byte(); memcpy(&opcode,&opcode_char,1); /* opcode = (opcode_type)get_byte(); can't get to compile */ switch (opcode.command) { case UNARY_ASSIGN : dump_unary_assign(opcode,text); break; case BINARY_ASSIGN : dump_binary_assign(opcode,text); break; case GOTO : dump_goto(opcode,text); break; case CALL : dump_call(opcode,text); break; case RETURN : dump_return(opcode,text); break; case DEBUG_LINE : dump_debug_line(opcode,text); break; default : sprintf(text,"INVALID"); break; } if (dump_hex) { printf("BKOD raw: "); for (i=0;i<index-inst_start;i++) print_hex_byte(file_mem[inst_start+i]); printf("\n"); } printf("@%08X: ",inst_start); printf("%s\n",text); }
/* * Return the value of a prototype conditional. * A prototype string may include conditionals which consist of a * question mark followed by a single letter. * Here we decode that letter and return the appropriate boolean value. */ static int cond(char c, int where) { off_t len; switch (c) { case 'a': /* Anything in the message yet? */ return (*message != '\0'); case 'b': /* Current byte offset known? */ return (curr_byte(where) != -1); case 'c': return (hshift != 0); case 'e': /* At end of file? */ return (eof_displayed()); case 'f': /* Filename known? */ return (strcmp(get_filename(curr_ifile), "-") != 0); case 'l': /* Line number known? */ case 'd': /* Same as l */ return (linenums); case 'L': /* Final line number known? */ case 'D': /* Final page number known? */ return (linenums && ch_length() != -1); case 'm': /* More than one file? */ return (ntags() ? (ntags() > 1) : (nifile() > 1)); case 'n': /* First prompt in a new file? */ return (ntags() ? 1 : new_file); case 'p': /* Percent into file (bytes) known? */ return (curr_byte(where) != -1 && ch_length() > 0); case 'P': /* Percent into file (lines) known? */ return (currline(where) != 0 && (len = ch_length()) > 0 && find_linenum(len) != 0); case 's': /* Size of file known? */ case 'B': return (ch_length() != -1); case 'x': /* Is there a "next" file? */ if (ntags()) return (0); return (next_ifile(curr_ifile) != NULL); } return (0); }
static void jump_linenum (int linenum) { FILE *original; int finished; /* Not only does this verify whether the scanner finished, if it has finished, it additionally closes the stream. */ finished = tokenizer_finished(); /* We save this copy in case the scanner wasn't finished. */ original = io_handle(); /* Start a new scanner from the beginning of the file. */ tokenizer_init(io_file()); reset(T_ERROR); io_reset(); /* Search for linenum. */ find_linenum(linenum); /* If the search ended at EOF, linenum could not be found! */ if (tokenizer_finished()) { dprintf( "*warning: could not jump to `%d'\n", E_WARNING, linenum); /* Set back to original stream */ io_set(io_file(), original); /* Prepare scanner to continue. */ if (!finished) { reset(T_NUMBER); io_reset(); io_next(); } } }
/* * Decode a "percent" prototype character. * A prototype string may include various "percent" escapes; * that is, a percent sign followed by a single letter. * Here we decode that letter and take the appropriate action, * usually by appending something to the message being built. */ static void protochar(int c, int where) { off_t pos; off_t len; int n; off_t linenum; off_t last_linenum; IFILE h; #undef PAGE_NUM #define PAGE_NUM(linenum) ((((linenum) - 1) / (sc_height - 1)) + 1) switch (c) { case 'b': /* Current byte offset */ pos = curr_byte(where); if (pos != -1) ap_pos(pos); else ap_quest(); break; case 'c': ap_int(hshift); break; case 'd': /* Current page number */ linenum = currline(where); if (linenum > 0 && sc_height > 1) ap_pos(PAGE_NUM(linenum)); else ap_quest(); break; case 'D': /* Final page number */ /* Find the page number of the last byte in the file (len-1). */ len = ch_length(); if (len == -1) { ap_quest(); } else if (len == 0) { /* An empty file has no pages. */ ap_pos(0); } else { linenum = find_linenum(len - 1); if (linenum <= 0) ap_quest(); else ap_pos(PAGE_NUM(linenum)); } break; case 'E': /* Editor name */ ap_str(editor); break; case 'f': /* File name */ ap_str(get_filename(curr_ifile)); break; case 'F': /* Last component of file name */ ap_str(last_component(get_filename(curr_ifile))); break; case 'i': /* Index into list of files */ if (ntags()) ap_int(curr_tag()); else ap_int(get_index(curr_ifile)); break; case 'l': /* Current line number */ linenum = currline(where); if (linenum != 0) ap_pos(linenum); else ap_quest(); break; case 'L': /* Final line number */ len = ch_length(); if (len == -1 || len == ch_zero() || (linenum = find_linenum(len)) <= 0) ap_quest(); else ap_pos(linenum-1); break; case 'm': /* Number of files */ n = ntags(); if (n) ap_int(n); else ap_int(nifile()); break; case 'p': /* Percent into file (bytes) */ pos = curr_byte(where); len = ch_length(); if (pos != -1 && len > 0) ap_int(percentage(pos, len)); else ap_quest(); break; case 'P': /* Percent into file (lines) */ linenum = currline(where); if (linenum == 0 || (len = ch_length()) == -1 || len == ch_zero() || (last_linenum = find_linenum(len)) <= 0) ap_quest(); else ap_int(percentage(linenum, last_linenum)); break; case 's': /* Size of file */ case 'B': len = ch_length(); if (len != -1) ap_pos(len); else ap_quest(); break; case 't': /* Truncate trailing spaces in the message */ while (mp > message && mp[-1] == ' ') mp--; *mp = '\0'; break; case 'T': /* Type of list */ if (ntags()) ap_str("tag"); else ap_str("file"); break; case 'x': /* Name of next file */ h = next_ifile(curr_ifile); if (h != NULL) ap_str(get_filename(h)); else ap_quest(); break; } }
/* * Insert the line number (of the given position) into the line buffer. */ void plinenum(off_t pos) { LINENUM linenum = 0; int i; if (linenums == OPT_ONPLUS) { /* * Get the line number and put it in the current line. * {{ Note: since find_linenum calls forw_raw_line, * it may seek in the input file, requiring the caller * of plinenum to re-seek if necessary. }} * {{ Since forw_raw_line modifies linebuf, we must * do this first, before storing anything in linebuf. }} */ linenum = find_linenum(pos); } /* * Display a status column if the -J option is set. */ if (status_col) { linebuf[curr] = ' '; if (start_attnpos != -1 && pos >= start_attnpos && pos < end_attnpos) attr[curr] = AT_NORMAL|AT_HILITE; else attr[curr] = AT_NORMAL; curr++; column++; } /* * Display the line number at the start of each line * if the -N option is set. */ if (linenums == OPT_ONPLUS) { char buf[INT_STRLEN_BOUND(pos) + 2]; int n; linenumtoa(linenum, buf); n = strlen(buf); if (n < MIN_LINENUM_WIDTH) n = MIN_LINENUM_WIDTH; sprintf(linebuf+curr, "%*s ", n, buf); n++; /* One space after the line number. */ for (i = 0; i < n; i++) attr[curr+i] = AT_NORMAL; curr += n; column += n; lmargin += n; } /* * Append enough spaces to bring us to the lmargin. */ while (column < lmargin) { linebuf[curr] = ' '; attr[curr++] = AT_NORMAL; column++; } }