1*f0d9efc0Sbeck /*
2*f0d9efc0Sbeck * File dump.c - dump a file/device both in hex and in ASCII.
3*f0d9efc0Sbeck
4*f0d9efc0Sbeck Written by Eric Youngdale (1993).
5*f0d9efc0Sbeck
6*f0d9efc0Sbeck Copyright 1993 Yggdrasil Computing, Incorporated
7*f0d9efc0Sbeck
8*f0d9efc0Sbeck This program is free software; you can redistribute it and/or modify
9*f0d9efc0Sbeck it under the terms of the GNU General Public License as published by
10*f0d9efc0Sbeck the Free Software Foundation; either version 2, or (at your option)
11*f0d9efc0Sbeck any later version.
12*f0d9efc0Sbeck
13*f0d9efc0Sbeck This program is distributed in the hope that it will be useful,
14*f0d9efc0Sbeck but WITHOUT ANY WARRANTY; without even the implied warranty of
15*f0d9efc0Sbeck MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16*f0d9efc0Sbeck GNU General Public License for more details.
17*f0d9efc0Sbeck
18*f0d9efc0Sbeck You should have received a copy of the GNU General Public License
19*f0d9efc0Sbeck along with this program; if not, write to the Free Software
20*f0d9efc0Sbeck Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
21*f0d9efc0Sbeck
22*f0d9efc0Sbeck static char rcsid[] ="$Id: dump.c,v 1.1 2000/10/10 20:40:27 beck Exp $";
23*f0d9efc0Sbeck
24*f0d9efc0Sbeck #include "../config.h"
25*f0d9efc0Sbeck
26*f0d9efc0Sbeck #include <stdio.h>
27*f0d9efc0Sbeck #ifdef HAVE_TERMIOS_H
28*f0d9efc0Sbeck #include <termios.h>
29*f0d9efc0Sbeck #include <sys/ioctl.h>
30*f0d9efc0Sbeck #else
31*f0d9efc0Sbeck #include <termio.h>
32*f0d9efc0Sbeck #endif
33*f0d9efc0Sbeck #include <signal.h>
34*f0d9efc0Sbeck
35*f0d9efc0Sbeck FILE * infile;
36*f0d9efc0Sbeck int file_addr;
37*f0d9efc0Sbeck unsigned char buffer[256];
38*f0d9efc0Sbeck unsigned char search[64];
39*f0d9efc0Sbeck
40*f0d9efc0Sbeck #define PAGE 256
41*f0d9efc0Sbeck
42*f0d9efc0Sbeck #ifdef HAVE_TERMIOS_H
43*f0d9efc0Sbeck struct termios savetty;
44*f0d9efc0Sbeck struct termios newtty;
45*f0d9efc0Sbeck #else
46*f0d9efc0Sbeck struct termio savetty;
47*f0d9efc0Sbeck struct termio newtty;
48*f0d9efc0Sbeck #endif
49*f0d9efc0Sbeck
reset_tty()50*f0d9efc0Sbeck reset_tty(){
51*f0d9efc0Sbeck #ifdef HAVE_TERMIOS_H
52*f0d9efc0Sbeck if(tcsetattr(0, TCSANOW, &savetty) == -1)
53*f0d9efc0Sbeck #else
54*f0d9efc0Sbeck if(ioctl(0, TCSETAF, &savetty)==-1)
55*f0d9efc0Sbeck #endif
56*f0d9efc0Sbeck {
57*f0d9efc0Sbeck printf("cannot put tty into normal mode\n");
58*f0d9efc0Sbeck exit(1);
59*f0d9efc0Sbeck }
60*f0d9efc0Sbeck }
61*f0d9efc0Sbeck
set_tty()62*f0d9efc0Sbeck set_tty(){
63*f0d9efc0Sbeck #ifdef HAVE_TERMIOS_H
64*f0d9efc0Sbeck if(tcsetattr(0, TCSANOW, &newtty) == -1)
65*f0d9efc0Sbeck #else
66*f0d9efc0Sbeck if(ioctl(0, TCSETAF, &newtty)==-1)
67*f0d9efc0Sbeck #endif
68*f0d9efc0Sbeck {
69*f0d9efc0Sbeck printf("cannot put tty into raw mode\n");
70*f0d9efc0Sbeck exit(1);
71*f0d9efc0Sbeck }
72*f0d9efc0Sbeck }
73*f0d9efc0Sbeck
74*f0d9efc0Sbeck
75*f0d9efc0Sbeck /* Come here when we get a suspend signal from the terminal */
76*f0d9efc0Sbeck
77*f0d9efc0Sbeck void
onsusp(int sig)78*f0d9efc0Sbeck onsusp (int sig)
79*f0d9efc0Sbeck {
80*f0d9efc0Sbeck /* ignore SIGTTOU so we don't get stopped if csh grabs the tty */
81*f0d9efc0Sbeck signal(SIGTTOU, SIG_IGN);
82*f0d9efc0Sbeck reset_tty ();
83*f0d9efc0Sbeck fflush (stdout);
84*f0d9efc0Sbeck signal(SIGTTOU, SIG_DFL);
85*f0d9efc0Sbeck /* Send the TSTP signal to suspend our process group */
86*f0d9efc0Sbeck signal(SIGTSTP, SIG_DFL);
87*f0d9efc0Sbeck /* sigsetmask(0);*/
88*f0d9efc0Sbeck kill (0, SIGTSTP);
89*f0d9efc0Sbeck /* Pause for station break */
90*f0d9efc0Sbeck
91*f0d9efc0Sbeck /* We're back */
92*f0d9efc0Sbeck signal (SIGTSTP, onsusp);
93*f0d9efc0Sbeck set_tty ();
94*f0d9efc0Sbeck }
95*f0d9efc0Sbeck
96*f0d9efc0Sbeck
97*f0d9efc0Sbeck
crsr2(int row,int col)98*f0d9efc0Sbeck crsr2(int row, int col){
99*f0d9efc0Sbeck printf("\033[%d;%dH",row,col);
100*f0d9efc0Sbeck }
101*f0d9efc0Sbeck
showblock(int flag)102*f0d9efc0Sbeck showblock(int flag){
103*f0d9efc0Sbeck unsigned int k;
104*f0d9efc0Sbeck int i, j;
105*f0d9efc0Sbeck lseek(fileno(infile), file_addr, 0);
106*f0d9efc0Sbeck read(fileno(infile), buffer, sizeof(buffer));
107*f0d9efc0Sbeck if(flag) {
108*f0d9efc0Sbeck for(i=0;i<16;i++){
109*f0d9efc0Sbeck crsr2(i+3,1);
110*f0d9efc0Sbeck printf("%8.8x ",file_addr+(i<<4));
111*f0d9efc0Sbeck for(j=15;j>=0;j--){
112*f0d9efc0Sbeck printf("%2.2x",buffer[(i<<4)+j]);
113*f0d9efc0Sbeck if(!(j & 0x3)) printf(" ");
114*f0d9efc0Sbeck };
115*f0d9efc0Sbeck for(j=0;j< 16;j++){
116*f0d9efc0Sbeck k = buffer[(i << 4) + j];
117*f0d9efc0Sbeck if(k >= ' ' && k < 0x80) printf("%c",k);
118*f0d9efc0Sbeck else printf(".");
119*f0d9efc0Sbeck };
120*f0d9efc0Sbeck }
121*f0d9efc0Sbeck };
122*f0d9efc0Sbeck crsr2(20,1);
123*f0d9efc0Sbeck printf(" Zone, zone offset: %6x %4.4x ",file_addr>>11, file_addr & 0x7ff);
124*f0d9efc0Sbeck fflush(stdout);
125*f0d9efc0Sbeck }
126*f0d9efc0Sbeck
getbyte()127*f0d9efc0Sbeck getbyte()
128*f0d9efc0Sbeck {
129*f0d9efc0Sbeck char c1;
130*f0d9efc0Sbeck c1 = buffer[file_addr & (PAGE-1)];
131*f0d9efc0Sbeck file_addr++;
132*f0d9efc0Sbeck if ((file_addr & (PAGE-1)) == 0) showblock(0);
133*f0d9efc0Sbeck return c1;
134*f0d9efc0Sbeck }
135*f0d9efc0Sbeck
main(int argc,char * argv[])136*f0d9efc0Sbeck main(int argc, char * argv[]){
137*f0d9efc0Sbeck char c;
138*f0d9efc0Sbeck int nbyte;
139*f0d9efc0Sbeck int i,j;
140*f0d9efc0Sbeck if(argc < 2) return 0;
141*f0d9efc0Sbeck infile = fopen(argv[1],"rb");
142*f0d9efc0Sbeck for(i=0;i<30;i++) printf("\n");
143*f0d9efc0Sbeck file_addr = 0;
144*f0d9efc0Sbeck /* Now setup the keyboard for single character input. */
145*f0d9efc0Sbeck #ifdef HAVE_TERMIOS_H
146*f0d9efc0Sbeck if(tcgetattr(0, &savetty) == -1)
147*f0d9efc0Sbeck #else
148*f0d9efc0Sbeck if(ioctl(0, TCGETA, &savetty) == -1)
149*f0d9efc0Sbeck #endif
150*f0d9efc0Sbeck {
151*f0d9efc0Sbeck printf("stdin must be a tty\n");
152*f0d9efc0Sbeck exit(1);
153*f0d9efc0Sbeck }
154*f0d9efc0Sbeck newtty=savetty;
155*f0d9efc0Sbeck newtty.c_lflag&=~ICANON;
156*f0d9efc0Sbeck newtty.c_lflag&=~ECHO;
157*f0d9efc0Sbeck newtty.c_cc[VMIN]=1;
158*f0d9efc0Sbeck set_tty();
159*f0d9efc0Sbeck signal(SIGTSTP, onsusp);
160*f0d9efc0Sbeck
161*f0d9efc0Sbeck do{
162*f0d9efc0Sbeck if(file_addr < 0) file_addr = 0;
163*f0d9efc0Sbeck showblock(1);
164*f0d9efc0Sbeck read (0, &c, 1);
165*f0d9efc0Sbeck if (c == 'a') file_addr -= PAGE;
166*f0d9efc0Sbeck if (c == 'b') file_addr += PAGE;
167*f0d9efc0Sbeck if (c == 'g') {
168*f0d9efc0Sbeck crsr2(20,1);
169*f0d9efc0Sbeck printf("Enter new starting block (in hex):");
170*f0d9efc0Sbeck scanf("%x",&file_addr);
171*f0d9efc0Sbeck file_addr = file_addr << 11;
172*f0d9efc0Sbeck crsr2(20,1);
173*f0d9efc0Sbeck printf(" ");
174*f0d9efc0Sbeck };
175*f0d9efc0Sbeck if (c == 'f') {
176*f0d9efc0Sbeck crsr2(20,1);
177*f0d9efc0Sbeck printf("Enter new search string:");
178*f0d9efc0Sbeck fgets((char *)search,sizeof(search),stdin);
179*f0d9efc0Sbeck while(search[strlen(search)-1] == '\n') search[strlen(search)-1] = 0;
180*f0d9efc0Sbeck crsr2(20,1);
181*f0d9efc0Sbeck printf(" ");
182*f0d9efc0Sbeck };
183*f0d9efc0Sbeck if (c == '+') {
184*f0d9efc0Sbeck while(1==1){
185*f0d9efc0Sbeck while(1==1){
186*f0d9efc0Sbeck c = getbyte(&file_addr);
187*f0d9efc0Sbeck if (c == search[0]) break;
188*f0d9efc0Sbeck };
189*f0d9efc0Sbeck for (j=1;j<strlen(search);j++)
190*f0d9efc0Sbeck if(search[j] != getbyte()) break;
191*f0d9efc0Sbeck if(j==strlen(search)) break;
192*f0d9efc0Sbeck };
193*f0d9efc0Sbeck file_addr &= ~(PAGE-1);
194*f0d9efc0Sbeck showblock(1);
195*f0d9efc0Sbeck };
196*f0d9efc0Sbeck if (c == 'q') break;
197*f0d9efc0Sbeck } while(1==1);
198*f0d9efc0Sbeck reset_tty();
199*f0d9efc0Sbeck fclose(infile);
200*f0d9efc0Sbeck }
201*f0d9efc0Sbeck
202*f0d9efc0Sbeck
203*f0d9efc0Sbeck
204*f0d9efc0Sbeck
205