home *** CD-ROM | disk | FTP | other *** search
/ Crawly Crypt Collection 1 / crawlyvol1.bin / program / compiler / as32 / main.c < prev    next >
C/C++ Source or Header  |  1991-03-22  |  3KB  |  148 lines

  1. /* ----------------------------------------------------------------------
  2.  * FILE: main.c
  3.  * PACKAGE: as31 - 8031/8051 Assembler.
  4.  *
  5.  * DESCRIPTION:
  6.  *    The file contains main(). It handles the arguments and makes
  7.  *    sure that pass 1 is done before pass 2 etc...
  8.  *
  9.  * REVISION HISTORY:
  10.  *    Jan. 19, 1990 - Created. (Ken Stauffer)
  11.  *
  12.  * AUTHOR:
  13.  *    All code in this file written by Ken Stauffer (University of Calgary).
  14.  *    January, 1990. */ static char
  15.  *    id_id= "Written by: Ken Stauffer";/*
  16.  *
  17.  */
  18.  
  19. #include <stdio.h>
  20. #include <setjmp.h>
  21.  
  22. extern int lineno;
  23. extern int pass,fatal;
  24. extern unsigned long lc;
  25.  
  26. jmp_buf main_env;
  27. char *asmfile;
  28. int dashl=0;
  29. FILE *listing;
  30.  
  31. /* ----------------------------------------------------------------------
  32.  * checkext:
  33.  *    Check the string s, for the presence of an extenstion e.
  34.  *    Return the position of the start of e in s.
  35.  *    or return NULL.
  36.  */
  37.  
  38. char *checkext(s,e)
  39. char *s,*e;
  40. {
  41.     register char *ps = s, *pe = e;
  42.  
  43.     while( *ps ) ps++;
  44.     while( *pe ) pe++;
  45.  
  46.     for( ; ps>=s && pe>=e && *ps == *pe; ps--, pe-- )
  47.         if( pe == e ) return(ps);
  48.     return(NULL);
  49. }
  50.  
  51. main(argc,argv)
  52. char *argv[];
  53. {
  54.     FILE *fin;
  55.     char *p,*dashF=NULL, *dashA=NULL;
  56.     char objfile[100];
  57.     char lstfile[100];
  58.     int i;
  59.  
  60.     if( argc < 2 ) {
  61.         fprintf(stderr,"Usage: %s [-l] [-Ffmt] [-Aarg] infile.asm\n",
  62.                         argv[0]);
  63.         emitusage();
  64.         exit(1);
  65.     }
  66.  
  67.     for(i=1; i<argc; i++ ) {
  68.         if( argv[i][0] != '-' ) break;
  69.         if( argv[i][1] == 'l' ) dashl = 1;
  70.         else if( dashF == NULL && argv[i][1] == 'F' )
  71.             dashF = argv[i]+2;
  72.         else if( dashA == NULL && argv[i][1] == 'A' )
  73.             dashA = argv[i]+2;
  74.         else {
  75.             fprintf(stderr,"Duplicate or unknown flag.\n");
  76.             exit(1);
  77.         }
  78.     }
  79.     if( i == argc ) {
  80.         fprintf(stderr,"Missing input file.\n");
  81.         exit(1);
  82.     }
  83.  
  84.     if( (p=checkext(argv[i],".asm")) == NULL ) {
  85.         fprintf(stderr,"Input file \"%s\" must end with .asm\n",
  86.                 argv[i]);
  87.         exit(1);
  88.     }
  89.     asmfile = argv[i];
  90.  
  91.     if( (fin = freopen(argv[i],"r",stdin)) == NULL ) {
  92.         fprintf(stderr,"Cannot open input file: %s\n",argv[i]);
  93.         exit(1);
  94.     }
  95.  
  96.     if( dashl ) {
  97.         strcpy(lstfile,argv[i]);
  98.         strcpy(lstfile+(p-argv[i]),".lst");
  99.         listing = fopen(lstfile,"w");
  100.         if( listing == NULL ) {
  101.             fprintf(stderr,"Cannot open file: %s for writting.\n",
  102.                 lstfile);
  103.             exit(1);
  104.         }
  105.     }
  106.     strcpy(objfile,argv[i]);
  107.     strcpy(objfile+(p-argv[i]),".obj");
  108.  
  109.     emitopen(objfile,dashF,dashA);
  110.  
  111.     syminit();
  112.     fatal = 0;
  113.     lineno = 1;
  114.     pass=0;
  115.     lc = 0x0000;
  116.  
  117.     if( setjmp(main_env) ) {
  118.         fclose(fin);
  119.         emitclose();
  120.         unlink(objfile);
  121.         exit(1);
  122.     }
  123.  
  124.     /*
  125.     ** P A S S    1
  126.     */
  127.     yyparse();
  128.     if( fatal ) longjmp(main_env,1);
  129.  
  130.     rewind(fin);
  131.     lineno = 1;
  132.     pass++;
  133.     lc = 0x0000;
  134.     emitaddr(lc);
  135.  
  136.     /*
  137.     ** P A S S    2
  138.     */
  139.     yyparse();
  140.  
  141.     emitclose();
  142.     fclose(fin);
  143.     if( dashl )
  144.         fclose(listing);
  145.     exit(0);
  146.  
  147. }
  148.