home *** CD-ROM | disk | FTP | other *** search
/ Geek Gadgets 1 / ADE-1.bin / ade-dist / kaffe-0.5p4-src.tgz / tar.out / contrib / kaffe / kaffeh / main.c < prev    next >
C/C++ Source or Header  |  1996-09-28  |  4KB  |  200 lines

  1. /*
  2.  * main.c
  3.  * Generate native code stubs from .class files.
  4.  *
  5.  * Copyright (c) 1996 Systems Architecture Research Centre,
  6.  *           City University, London, UK.
  7.  *
  8.  * See the file "license.terms" for information on usage and redistribution
  9.  * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
  10.  *
  11.  * Written by Tim Wilkinson <tim@sarc.city.ac.uk>, February 1996.
  12.  */
  13.  
  14. #include <stdio.h>
  15.  
  16. #define    BUFSZ    100
  17. #define    PATHSZ    1024
  18.  
  19. FILE* include;
  20. FILE* stub;
  21. char className[BUFSZ];
  22. char pathName[BUFSZ];
  23. char includeName[BUFSZ];
  24. char stubName[BUFSZ];
  25. char realClassPath[PATHSZ];
  26.  
  27. int flag_shrt = 0;
  28. int flag_stub = 0;
  29. char* postfix = "";
  30.  
  31. static void usage(void);
  32. static int options(char**);
  33.  
  34. /*
  35.  * MAIN
  36.  */
  37. int
  38. main(int argc, char* argv[])
  39. {
  40.     char* nm;
  41.     int i;
  42.     int farg;
  43.  
  44.     /* Process arguments */
  45.     farg = options(argv);
  46.  
  47.     if (argv[farg] == 0) {
  48.         usage();
  49.         exit(1);
  50.     }
  51.  
  52.     for (nm = argv[farg]; nm != 0; nm = argv[++farg]) {
  53.         for (i = 0; nm[i] != 0; i++) {
  54.             switch (nm[i]) {
  55.             case '/':
  56.             case '.':
  57.                 className[i] = '_';
  58.                 pathName[i] = '/';
  59.                 includeName[i] = '_';
  60.                 stubName[i] = '_';
  61.                 break;
  62.             default:
  63.                 className[i] = nm[i];
  64.                 pathName[i] = nm[i];
  65.                 includeName[i] = nm[i];
  66.                 stubName[i] = nm[i];
  67.                 break;
  68.             }
  69.         }
  70.         className[i] = 0;
  71.         pathName[i] = 0;
  72.         includeName[i] = 0;
  73.         stubName[i] = 0;
  74.  
  75.         /* If we are in 'base' mode, truncate the include and stub name
  76.          * to just the basename.
  77.          */
  78.         if (flag_shrt == 1) {
  79.             for (i = strlen(stubName); i >= 0; i--) {
  80.                 if (stubName[i] == '_') {
  81.                     strcpy(stubName, &stubName[i+1]);
  82.                     break;
  83.                 }
  84.             }
  85.             for (i = strlen(includeName); i >= 0; i--) {
  86.                 if (includeName[i] == '_') {
  87.                     strcpy(includeName, &includeName[i+1]);
  88.                     break;
  89.                 }
  90.             }
  91.         }
  92.  
  93.         strcat(includeName, postfix);
  94.         strcat(stubName, postfix);
  95.         strcat(includeName, ".h");
  96.         strcat(stubName, ".c");
  97.  
  98.         if (flag_stub == 0) {
  99.             include = fopen(includeName, "w");;
  100.             if (include == 0) {
  101.                 fprintf(stderr, "Failed to create '%s'.\n", includeName);
  102.                 exit(1);
  103.             }
  104.             startInclude();
  105.         }
  106.         else {
  107.             stub = fopen(stubName, "w");;
  108.             if (stub == 0) {
  109.                 fprintf(stderr, "Failed to create '%s'.\n", stubName);
  110.                 exit(1);
  111.             }
  112.             startStub();
  113.         }
  114.  
  115. #if 0
  116.         strcat(pathName, ".class");
  117.         fp = fopen(pathName, "rb");;
  118.         if (fp == 0) {
  119.             fprintf(stderr, "Failed to open '%s'.\n", pathName);
  120.             exit(1);
  121.         }
  122.         readClass(fp);
  123. #endif
  124.         findClass(pathName);
  125.  
  126.         if (stub != 0) {
  127.             fclose(stub);
  128.         }
  129.         if (include != 0) {
  130.             endInclude();
  131.             fclose(include);
  132.         }
  133.     }
  134.     exit(0);
  135. }
  136.  
  137. /*
  138.  * Process program's flags.
  139.  */
  140. static
  141. int
  142. options(char** argv)
  143. {
  144.     int i;
  145.  
  146.     for (i = 1; argv[i] != 0; i++) {
  147.         if (argv[i][0] != '-') {
  148.             break;
  149.         }
  150.  
  151.         if (strcmp(argv[i], "-help") == 0) {
  152.             usage();
  153.             exit(0);
  154.         }
  155.         else if (strcmp(argv[i], "-version") == 0) {
  156.             fprintf(stderr, "Kaffeh version %s ", KVER);
  157.             fprintf(stderr, "(c) Copyright Tim Wilkinson\n");
  158.             fprintf(stderr, "Systems Architecture Research Centre, City University, UK.\n");
  159.             exit(0);
  160.         }
  161.         else if (strcmp(argv[i], "-base") == 0) {
  162.             flag_shrt = 1;
  163.         }
  164.         else if (strcmp(argv[i], "-stubs") == 0) {
  165.             flag_stub = 1;
  166.         }
  167.         else if (strcmp(argv[i], "-classpath") == 0) {
  168.             i++;
  169.             strcpy(realClassPath, argv[i]);
  170.         }
  171.         else if (strcmp(argv[i], "-postfix") == 0) {
  172.             i++;
  173.             postfix = argv[i];
  174.         }
  175.         else {
  176.             fprintf(stderr, "Unknown flag: %s\n", argv[i]);
  177.         }
  178.     }
  179.  
  180.     /* Return first no-flag argument */
  181.     return (i);
  182. }
  183.  
  184. /*
  185.  * Print usage message.
  186.  */
  187. static
  188. void
  189. usage(void)
  190. {
  191.     fprintf(stderr, "usage: kaffeh [-options] class ...\n");
  192.     fprintf(stderr, "Options are:\n");
  193.     fprintf(stderr, "    -help            Print this message\n");
  194.     fprintf(stderr, "    -version        Print version number\n");
  195.     fprintf(stderr, "    -classpath <path>    Set classpath\n");
  196.     fprintf(stderr, "    -stubs            Generate stub rather than include\n");
  197.     fprintf(stderr, "    -base            Truncate stub and include names\n");
  198.     fprintf(stderr, "    -postfix <pfix>        Append the postfix to the generated file's name\n");
  199. }
  200.