home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Source Code 1993 July / THE_SOURCE_CODE_CD_ROM.iso / bsd_srcs / usr.bin / lisp / liszt / 68k / liszt.c < prev    next >
Encoding:
C/C++ Source or Header  |  1983-07-25  |  4.4 KB  |  245 lines

  1. #ifndef lint
  2. static char *rcsid = "$Header: liszt.c 1.6 83/07/25 12:07:31 layer Exp $";
  3. #endif
  4.  
  5. /*
  6. **            -[Wed May  4 18:18:10 1983 by layer]-
  7. **
  8. **
  9. ** liszt :: interface to the lisp compiler
  10. **
  11. ** There are two reasons for having a C interface to the compiler:
  12. **    1) Fseek doesn't work properly from lisp, and there is no
  13. **       lseek.
  14. **    2) To start up a process from a 1 Mb process, like when liszt forks
  15. **       a /usr/lib/lisp/as to assemble the output of the compiler, takes
  16. **       too long. (The compiler is 100 times larger than this program.)
  17. **
  18. **/
  19.  
  20. #include    <stdio.h>
  21. #include    "../../franz/h/aout.h"
  22. #include    "../../franz/h/config.h"
  23.  
  24. #ifndef LISZT
  25. #define LISZT    "/usr/ucb/xliszt"
  26. #endif
  27.  
  28. #ifndef AS
  29. #define AS    "/usr/lib/lisp/as"
  30. #endif
  31.  
  32. #ifndef OFFSET
  33. #define OFFSET        0x0
  34. #endif
  35.  
  36. main(argc,argv,envp)
  37.     register char *argv[], **envp;
  38. {
  39.     struct exec header;
  40.     register int autorun = 0;
  41.     register int no_assem = 0;
  42.     register char *p;
  43.     register int oflag = 0, cur;
  44.     register int objp;
  45.     register int slen;
  46.     char temp[20], tempfile[20], srcfile[20], outfile[20];
  47.     char *args_to_string();
  48.     char *flags_to_string();
  49.     char command[1024];
  50.     
  51.     /*
  52.     **  process arguments :: check for -r and -S switches
  53.     **
  54.     **  -F is a special flag that means just to fix the offset in the
  55.     ** object file, and then quit.
  56.     **
  57.     **/
  58.     /* If no args, then give the user an interactive liszt */
  59.         if (argc == 1)
  60.     {
  61.         execle(LISZT, "liszt", 0, envp);
  62.         exit(100);
  63.     } else
  64.     {
  65.         for (cur = 1; cur < argc; cur++) {
  66.             if (*argv[cur] == '-')
  67.             {
  68.                 p = argv[cur];
  69.                 p++;
  70.                 if (*p == 'o')
  71.                 {
  72.                         strcpy(outfile,argv[++cur]);
  73.                         oflag++;
  74.                 }
  75.                 else if (*p == 'F')
  76.                 {
  77.                     strcpy(outfile,argv[++cur]);
  78.                     autorun = 1;
  79.                     goto fixit;
  80.                 }
  81.                 else
  82.                 {
  83.                         for (; *p; p++) {
  84.                         switch (*p)
  85.                         {
  86.                             case 'S':
  87.                                 no_assem++;
  88.                                 break;
  89.                             case 'r':
  90.                                 autorun++;
  91.                                 break;
  92.                             default:
  93.                                 break;
  94.                         }
  95.                         }
  96.                 }
  97.                 }
  98.             else
  99.             {    /* must be filename */
  100.                     strcpy(srcfile, argv[cur]);
  101.                 }
  102.             }
  103.         }
  104.  
  105.     if (no_assem)
  106.     {
  107.             sprintf(command, "%s %s", LISZT, args_to_string(argv));
  108. #ifdef debug
  109.             printf("%s\n", command);
  110. #else
  111.         exit(system(command));
  112. #endif
  113.     }
  114.  
  115.     sprintf(tempfile, "/tmp/Lzt%d.s", getpid());
  116.  
  117.     /* If output file not given, then we deduce it... */
  118.     if (oflag == 0)
  119.     {
  120.         strcpy(outfile,srcfile);
  121.         slen = strlen(outfile);
  122.         if (outfile[slen - 2] == '.')
  123.         {
  124.             outfile[slen - 1] = 'o';
  125.         }
  126.         else
  127.         {
  128.             strcpy(temp,outfile);
  129.             sprintf(outfile, "%s.o", temp);
  130.         }
  131.     }
  132.  
  133.     sprintf(command, "%s -S%s -o %s %s",
  134.              LISZT, flags_to_string(argc, argv), tempfile, srcfile);
  135. #ifdef debug
  136.     printf("%s\n", command);
  137. #else
  138.         if (system(command) != 0)
  139.     {
  140.         exit(101);
  141.         }
  142. #endif
  143.  
  144.     sprintf(command, "%s -o %s %s", AS, outfile, tempfile);
  145. #ifdef debug
  146.     printf("%s\n", command);
  147. #else
  148.     if (system(command) != 0)
  149.     {
  150.         exit(102);
  151.     }
  152.     unlink(tempfile);
  153.  
  154. fixit:
  155.         if (autorun)
  156.     {
  157.         if ((objp = open(outfile,2)) == -1)
  158.         {
  159.                 perror(outfile);
  160.                 exit(103);
  161.         }
  162.         if (read(objp,&header,sizeof header) != sizeof (struct exec))
  163.         {
  164.             perror("read failed");
  165.             exit(1);
  166.         }
  167.  
  168.         /* Change the offset to the correct value */
  169.         header.a_entry = OFFSET;
  170.  
  171.         /* seek back to beginning */
  172.         if (lseek(objp,0,0) != 0)
  173.         {
  174.                 perror("seek failed");
  175.                 exit(104);
  176.         }
  177.  
  178.         /* write the new a.out header... */
  179.         if (write(objp,&header,sizeof header) != sizeof(struct exec))
  180.         {
  181.                 perror("write failed");
  182.                 exit(105);
  183.         }
  184.  
  185.         /* make it executable */
  186.         chmod(outfile, 0755);
  187.         } else
  188.         exit(0);
  189. #endif
  190. }
  191.  
  192. char *
  193. args_to_string(pp)
  194.     char *pp[];
  195. {
  196.         char result[1024];
  197.         register int ii = 0,
  198.              jj = 1;
  199.  
  200.         for (; pp[jj]; ii++, jj++)
  201.     {
  202.         xstrcpy(&result[ii],pp[jj]);
  203.         ii = ii + strlen(pp[jj]);
  204.         }
  205.         result[ii++] = '\0';
  206.         return(result);
  207. }
  208.  
  209. char *
  210. flags_to_string(argc, argv)
  211.     int argc;
  212.     char *argv[];
  213. {
  214.         char result[128];
  215.         register int chari, word, skipnext = 0, out = 0;
  216.  
  217.     for (word = 1; word < argc; word++)
  218.     {
  219.         if (skipnext)
  220.         {
  221.             skipnext = 0;
  222.             word++;
  223.             continue;
  224.         }
  225.         if (*argv[word] == '-')
  226.             for (chari = 1; argv[word][chari]; chari++)
  227.                 if (argv[word][chari] == 'o')
  228.                     skipnext = 1;
  229.                 else
  230.                     result[out++] = argv[word][chari];
  231.     }
  232.         result[out] = '\0';
  233.         return(result);
  234. }
  235.  
  236. xstrcpy(s, t)
  237.     char *s, *t;
  238. {
  239.         while (*t != '\0')
  240.     {
  241.             *s++ = *t++;
  242.         }
  243.         *s = ' ';
  244. }
  245.