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