home *** CD-ROM | disk | FTP | other *** search
/ rtsi.com / 2014.01.www.rtsi.com.tar / www.rtsi.com / OS9 / OSK / SRC / unc.lzh / UNC / main.c < prev    next >
C/C++ Source or Header  |  1991-06-12  |  6KB  |  269 lines

  1.  
  2. /*
  3.  *   SCCS:   %W%   %G%   %U%
  4.  *   Main routine etc.
  5.  *
  6.  *EMACS_MODES:c
  7.  */
  8.  
  9. #define VERSION "OSK V. 1.0   June 1991  reto/hcz"
  10. #include <stdio.h>
  11. #define __MAIN__
  12. #include "a.out.h"
  13. #include "osk.h"
  14. #include "ctype.h"
  15. #include "unc.h"
  16.  
  17. #define   LINELNG   70
  18.  
  19. void   inturdat(), intutext(), intudat(), intlsym(), bfclose();
  20. void   ptext(), pdata(), pabs(), lscan(), usage();
  21. char *strdup();
  22.  
  23. extern int    par_entry, par_round;   /*  68000 parameters  */
  24.  
  25. extern int   nmods;         /*  Number of modules it looks like  */
  26.  
  27. char   *tfnam = "split";
  28. char *fnam = NULL, *ofnam;
  29. int ipath;
  30.  
  31. char   lsyms;         /*  Generate local symbols  */
  32. extern char   noabs;         /*  No non-global absolutes  */
  33. int   rel;         /*  File being analysed is relocatable  */
  34. extern int   lpos;
  35.  
  36. symbol   dosymb();
  37. extern int errno;
  38.  
  39. void clean(err)
  40. {
  41.    bfclose(&mainfile);
  42.    exit(err);
  43. }
  44.    
  45. /*
  46.  *   Open binary files.  Arrange to erase them when finished.
  47.  */
  48.  
  49. void   bfopen(nam, fid)
  50. char   *nam;
  51. ef_fid   fid;
  52. {
  53.    char   fnam[80];
  54.    
  55.    (void) sprintf(fnam, "%s.tx", nam);
  56.    if  ((fid->ef_t = open(fnam, O_RDWR|O_CREAT, 0666)) < 0)  {
  57. efil:      (void) fprintf(stderr, "Help could not open %s\n", fnam);
  58.       exit(4);
  59.    }
  60.    fid->t_name = strdup(fnam);
  61.    (void) sprintf(fnam, "%s.dt", nam);
  62.    if  ((fid->ef_d = open(fnam, O_RDWR|O_CREAT, 0666)) < 0)
  63.       goto  efil;
  64.    fid->d_name = strdup(fnam);
  65. }
  66.  
  67. /*
  68.  *   Close binary files.  They should get zapped anyway.
  69.  */
  70.  
  71. void   bfclose(fid)
  72. ef_fid   fid;
  73. {
  74.    (void) close(fid->ef_t);
  75.    (void) close(fid->ef_d);
  76.    unlink(fid->t_name);
  77.    unlink(fid->d_name);
  78. }
  79.  
  80. /*
  81.  *   Main routine.
  82.  */
  83.  
  84. main(argc, argv)
  85. int   argc;
  86. char   *argv[];
  87. {
  88.    int   i;
  89.    char   *progname = argv[0];
  90.    char   *msg;
  91.    register  struct  libit  *lfd;
  92.    
  93.    setbuf(stdout,NULL);
  94.    setbuf(stderr,NULL);
  95.  
  96.    popt = ropt = 0;
  97.    verbose = 1;
  98.    getparms(argc, argv);
  99.    if (fnam == 0)
  100.    {
  101.       usage();
  102.       clean(_errmsg(1, "No input file"));
  103.    }
  104.    
  105.    bfopen(tfnam, &mainfile);
  106.    if ((ipath = open(fnam, O_RDONLY, 0)) < 0)
  107.       clean(_errmsg(errno, "cannot open '%s'\n", fnam));
  108.  
  109.    if  (verbose) (void) fprintf(stderr, "Scanning text\n");
  110.    if  ( (rtext(ipath, &mainfile) != ISOK)
  111.          || rdata(ipath, &mainfile) != ISOK)
  112.       clean(_errmsg(1, "Bad format input file - reading %s\n", fnam));
  113.    (void) close(lfd->lf_fd);
  114.    if  (verbose) (void) fprintf(stderr, "End of input\n");
  115.  
  116.    if  (mainfile.ef_stvec != NULL)
  117.    {
  118.       free(mainfile.ef_stvec);
  119.       mainfile.ef_stvec = NULL;
  120.       mainfile.ef_stcnt = 0;
  121.    }
  122.    
  123.    if  (verbose) 
  124.       (void) fprintf(stderr, "Text anal 1\n");
  125.    intutext();
  126.    if  (verbose) 
  127.       (void) fprintf(stderr, "Text anal 2\n");
  128.    if  (lsyms)  {
  129.       if  (verbose)
  130.          (void) fprintf(stderr, "Local symbol scan\n");
  131. /*      intlsym(); hcz */
  132.    }
  133.    pabs();
  134.    ptext(&mainfile);
  135.    pdata(&mainfile);
  136.    bfclose(&mainfile);
  137.    clean(0);
  138. }
  139.  
  140. /*
  141.  *   Talk about implemented things.....
  142.  */
  143.  
  144. void   unimpl(msg)
  145. char   *msg;
  146. {
  147.    (void) fprintf(stderr, "Warning: handling of \"%s\" not implemented\n", msg);
  148. }
  149.  
  150. int getparms(argc, argv)
  151. int argc;
  152. char *argv[];
  153. {
  154.    char  c, *parm, *getstr();
  155.    int   i;
  156.  
  157.    for (i=1; i < argc; i++)
  158.    {
  159.       parm = argv[i];
  160.       if(*parm != '-')
  161.       {
  162.          if (fnam == NULL)
  163.             fnam = parm;
  164.          else
  165.             clean(_errmsg(1, "illegal argument '%s'\n", parm));
  166.          continue;   
  167.       }
  168.       parm++;
  169.       while( (c = *parm++) != '\0') 
  170.          switch( tolower(c) )
  171.          {
  172.             case 'd': debug++; break;
  173.             case 'x': xact=getint(&parm,1); break;
  174.             case 's': lsyms++; break;
  175.             case 'q': verbose=getint(&parm, 0);
  176.             case 'p': popt = getint(&parm, 1);
  177.             case 'a': noabs++; break;
  178.             case 'r': ropt++; break;
  179. /*            case 'o':
  180.                ofnam=getstr(&parm, NULL);
  181.                if (ofnam == NULL)
  182.                   clean(_errmsg(1, "missing output filename"));
  183.                if (reopen(ofnam, "w", stdout) == 0)   
  184.                   clean(_errmsg(errno, "can't open %s", ofnam));
  185.                break;   */
  186.             case '?':  usage(); clean(0); break;
  187.             case 'v':  fputs(VERSION, stderr); clean(0);
  188.             default: 
  189.                usage();
  190.                clean(_errmsg(1, "illegal option '%c'\n", c)) ;
  191.          }
  192.    }
  193. }
  194.  
  195. /* getint(&par) und getstr(&par) untersuchen den String ab **par.
  196.  * *par wird erhöht und steht 1 hinter dem letzten erkannten Zeichen
  197.  * bei ungültigem oder nicht vorhandenem Argument wird der übergebene
  198.  * Defaultwert zurückgegeben.
  199.  */
  200. int getint(par, difauld)
  201. char    **par;
  202. int     difauld;
  203. {
  204.     int i;
  205.     if (**par == '=')
  206.         ++*par;
  207.     if (isdigit(**par))
  208.         i = atoi(*par); /* Zahl zurückgeben */
  209.     else 
  210.         i = difauld;
  211.     while (isdigit(**par))  /* skippen bis Zahlende */
  212.         ++*par;
  213.     return(i);
  214. }
  215.  
  216. int gethex(par, difauld)
  217. char    **par;
  218. int     difauld;
  219. {
  220.     int i;
  221.     if (**par == '=')
  222.         ++*par;
  223.     if (**par == '0' || **par == '$')
  224.         ++*par;
  225.     if (**par == 'x' || **par == 'X')
  226.         ++*par;
  227.     if (sscanf(*par, "%x", &i) != 1)
  228.         i = difauld; /* nix gefunden */
  229.     while (isxdigit(**par))  /* skippen bis Zahlende */
  230.         ++*par;
  231.     return(i);
  232. }
  233.  
  234. char *getstr(par, difauld)
  235. char    **par, *difauld;
  236. {
  237.     char    *cp;
  238.     if (**par == '=')
  239.         ++*par;
  240.     if (**par != '\0')
  241.     {
  242.         cp = *par;  /* Übergabe: Stringbeginn */
  243.         while(**par) ++*par;    /* skippen bis Stringende */
  244.         return(cp);
  245.     }
  246.     return(difauld);
  247. }    
  248.  
  249. void usage()
  250. {
  251.     fputs(
  252. "\
  253. Syntax: unc {-<opts>} <file> {-<opts>}\n\
  254. Funkcion: 68k Disassembler\n\
  255. Options:    -p     print address and opcode values too\n\
  256.             -x=<n> exactness mode\n\
  257.                    <n> = 0: Best guess,\n\
  258.                          1: no check for labels falling into instruction argument,\n\
  259.                          2: as above plus no check for bad jsr/bxx thread,\n\
  260.                          3: don't check instruction thread at all\n\
  261.             -d     debug mode\n\
  262. "          
  263.     , stderr); fputs("\
  264. "             
  265.     , stderr);
  266. }
  267.  
  268.  
  269.