home *** CD-ROM | disk | FTP | other *** search
/ Dream 49 / Amiga_Dream_49.iso / beos / utils / mkisofs-1.000 / mkisofs-1.11-beos / diag / dump.c next >
C/C++ Source or Header  |  1997-04-09  |  5KB  |  205 lines

  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.2 1997/02/23 19:10:49 eric Rel $";
  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.  
  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.  
  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
  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.  
  98. crsr2(int row, int col){
  99.   printf("\033[%d;%dH",row,col);
  100. }
  101.  
  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.  
  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.  
  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(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.