xref: /openbsd-src/gnu/usr.sbin/mkhybrid/src/diag/dump.c (revision f0d9efc08bdf8f314c206a5c81ebc300245394f8)
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