00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027 #include "config.h"
00028 #include "system.h"
00029 #include "obstack.h"
00030 #include "jcf.h"
00031 #include "tree.h"
00032 #include "java-tree.h"
00033
00034 static char * do_mangle_classname PARAMS ((const char *string));
00035
00036 struct obstack name_obstack;
00037 struct obstack *mangle_obstack = &name_obstack;
00038
00039 void
00040 gcc_obstack_init (obstack)
00041 struct obstack *obstack;
00042 {
00043
00044 #ifndef OBSTACK_CHUNK_SIZE
00045 #define OBSTACK_CHUNK_SIZE 0
00046 #endif
00047
00048 #ifndef OBSTACK_CHUNK_ALLOC
00049 #define OBSTACK_CHUNK_ALLOC xmalloc
00050 #endif
00051 #ifndef OBSTACK_CHUNK_FREE
00052 #define OBSTACK_CHUNK_FREE free
00053 #endif
00054 _obstack_begin (obstack, OBSTACK_CHUNK_SIZE, 0,
00055 (void *(*) PARAMS ((long))) OBSTACK_CHUNK_ALLOC,
00056 (void (*) PARAMS ((void *))) OBSTACK_CHUNK_FREE);
00057 }
00058
00059 static void usage (const char *) ATTRIBUTE_NORETURN;
00060
00061 static void
00062 usage (const char *name)
00063 {
00064 fprintf (stderr, "Usage: %s [OPTIONS]... CLASSNAMEmain [OUTFILE]\n", name);
00065 exit (1);
00066 }
00067
00068 int
00069 main (int argc, char **argv)
00070 {
00071 char *classname, *p;
00072 FILE *stream;
00073 const char *mangled_classname;
00074 int i, last_arg;
00075
00076 if (argc < 2)
00077 usage (argv[0]);
00078
00079 for (i = 1; i < argc; ++i)
00080 {
00081 if (! strncmp (argv[i], "-D", 2))
00082 {
00083
00084 }
00085 else
00086 break;
00087 }
00088
00089 if (i < argc - 2 || i == argc)
00090 usage (argv[0]);
00091 last_arg = i;
00092
00093 classname = argv[i];
00094
00095
00096 p = strrchr (classname, 'm');
00097 if (p == NULL || p == classname || strcmp (p, "main") != 0)
00098 usage (argv[0]);
00099 else
00100 *p = '\0';
00101
00102 gcc_obstack_init (mangle_obstack);
00103 mangled_classname = do_mangle_classname (classname);
00104
00105 if (i < argc - 1 && strcmp (argv[i + 1], "-") != 0)
00106 {
00107 const char *outfile = argv[i + 1];
00108 stream = fopen (outfile, "w");
00109 if (stream == NULL)
00110 {
00111 fprintf (stderr, "%s: Cannot open output file: %s\n",
00112 argv[0], outfile);
00113 exit (1);
00114 }
00115 }
00116 else
00117 stream = stdout;
00118
00119
00120
00121 fprintf (stream, "extern const char **_Jv_Compiler_Properties;\n");
00122 fprintf (stream, "static const char *props[] =\n{\n");
00123 for (i = 1; i < last_arg; ++i)
00124 {
00125 const char *p;
00126 fprintf (stream, " \"");
00127 for (p = &argv[i][2]; *p; ++p)
00128 {
00129 if (! ISPRINT (*p))
00130 fprintf (stream, "\\%o", *p);
00131 else if (*p == '\\' || *p == '"')
00132 fprintf (stream, "\\%c", *p);
00133 else
00134 putc (*p, stream);
00135 }
00136 fprintf (stream, "\",\n");
00137 }
00138 fprintf (stream, " 0\n};\n\n");
00139
00140 fprintf (stream, "extern int %s;\n", mangled_classname);
00141 fprintf (stream, "int main (int argc, const char **argv)\n");
00142 fprintf (stream, "{\n");
00143 fprintf (stream, " _Jv_Compiler_Properties = props;\n");
00144 fprintf (stream, " JvRunMain (&%s, argc, argv);\n", mangled_classname);
00145 fprintf (stream, "}\n");
00146 if (stream != stdout && fclose (stream) != 0)
00147 {
00148 fprintf (stderr, "%s: Failed to close output file %s\n",
00149 argv[0], argv[2]);
00150 exit (1);
00151 }
00152 return 0;
00153 }
00154
00155
00156 static char *
00157 do_mangle_classname (string)
00158 const char *string;
00159 {
00160 const char *ptr;
00161 int count = 0;
00162
00163 obstack_grow (&name_obstack, "_ZN", 3);
00164
00165 for (ptr = string; *ptr; ptr++ )
00166 {
00167 if (ptr[0] == '.')
00168 {
00169 append_gpp_mangled_name (&ptr [-count], count);
00170 count = 0;
00171 }
00172 else
00173 count++;
00174 }
00175 append_gpp_mangled_name (&ptr [-count], count);
00176 obstack_grow (mangle_obstack, "6class$E", 8);
00177 obstack_1grow (mangle_obstack, '\0');
00178 return obstack_finish (mangle_obstack);
00179 }