}
struct gen_class *
-jvm_create_class(char * full_name)
+jvm_create_class(const char * dir, char * full_name)
{
struct gen_class * class = GC_MALLOC(sizeof *class);
memset(class, 0, sizeof *class);
- char * fname = new_string("%s.j", full_name);
+ char * fname = new_string("%s/%s.j", dir, full_name);
class -> full_name = new_string(full_name);
class -> fp = fopen(fname, "w");
- assert(class -> fp);
+ class -> dir = new_string(dir);
+
+ if(class -> fp == NULL)
+ {
+ gen_error("unable to create file %s", fname);
+ }
return class;
}
memset(gen_context, 0, sizeof *gen_context);
ctx -> gen_context = gen_context;
+ gen_context -> dir = ".";
}
void
}
static void
-oberon_generate_procedure_class(oberon_type_t * proc)
+oberon_generate_procedure_class(const char * dir, oberon_type_t * proc)
{
FILE * fp;
char * cname;
struct gen_class * class;
cname = jvm_get_class_full_name(proc);
- class = jvm_create_class(cname);
+ class = jvm_create_class(dir, cname);
fp = class -> fp;
fprintf(fp, ".source SYSTEM\n");
}
static void
-oberon_generate_procedure_pointer_class(oberon_object_t * proc)
+oberon_generate_procedure_pointer_class(const char * dir, oberon_object_t * proc)
{
FILE * fp;
char * cname;
struct gen_class * class;
cname = jvm_get_field_full_name_safe(proc);
- class = jvm_create_class(cname);
+ class = jvm_create_class(dir, cname);
abscname = jvm_get_class_full_name(proc -> type);
absdesc = jvm_get_descriptor(proc -> type);
fp = class -> fp;
}
static void
-oberon_generate_record_class(gen_module_t * m, oberon_type_t * rec)
+oberon_generate_record_class(const char * dir, gen_module_t * m, oberon_type_t * rec)
{
char * cname;
struct gen_class * class;
m -> rec_id += 1;
cname = jvm_get_class_full_name(rec);
- class = jvm_create_class(cname);
+ class = jvm_create_class(dir, cname);
fprintf(class -> fp, ".source %s\n", rec -> module -> name);
fprintf(class -> fp, ".class public %s\n", cname);
memset(t, 0, sizeof *t);
type -> gen_type = t;
+ gen_context_t * c;
+ c = ctx -> gen_context;
+
gen_module_t * m;
switch(type -> class)
{
break;
case OBERON_TYPE_RECORD:
m = type -> module -> gen_mod;
- oberon_generate_record_class(m, type);
+ oberon_generate_record_class(c -> dir, m, type);
break;
case OBERON_TYPE_PROCEDURE:
- oberon_generate_procedure_class(type);
+ oberon_generate_procedure_class(c -> dir, type);
break;
default:
gen_error("oberon_generator_init_type: unk calss %i", type -> class);
memset(m, 0, sizeof *m);
mod -> gen_mod = m;
+ gen_context_t * c;
+ c = ctx -> gen_context;
+
struct gen_class * class;
- class = jvm_create_class(mod -> name);
+ class = jvm_create_class(c -> dir, mod -> name);
fprintf(class -> fp, ".source %s\n", mod -> name);
fprintf(class -> fp, ".class %s\n", mod -> name);
m -> class = class;
- ctx -> gen_context -> current_m = m;
+ c -> current_m = m;
}
void
}
else
{
- oberon_generate_procedure_pointer_class(proc);
+ oberon_generate_procedure_pointer_class(p -> class -> dir, proc);
signature = jvm_get_procedure_signature(proc -> type);
}
jvm_generate(p, 2, 0, "invokestatic SYSTEM/HALT(J)V");
}
+void
+oberon_set_out_directory(oberon_context_t * ctx, const char * path)
+{
+ gen_context_t * c;
+
+ c = ctx -> gen_context;
+
+ c -> dir = new_string(path);
+}
static oberon_context_t * ctx;
static oberon_module_t * mod;
+static const char * module;
+static const char * out_path;
static const char *
import_module(const char * name)
return source;
}
+static void
+init(int argc, char ** argv)
+{
+ int i = 1;
+ out_path = ".";
+
+ if(argc > 2 && strcmp(argv[i], "-d") == 0)
+ {
+ out_path = argv[i + 1];
+ argc -= 2;
+ i += 2;
+ }
+
+ if(argc != 2 || argv[i][0] == '-')
+ {
+ printf("usage: obn [-d out_dir] module\n");
+ exit(1);
+ }
+
+ module = argv[i];
+}
+
int
main(int argc, char ** argv)
{
const char * code;
- if(argc != 2)
- {
- printf("use: %s <module>\n", argv[0]);
- return 1;
- }
+ init(argc, argv);
- code = import_module(argv[1]);
+ code = import_module(module);
ctx = oberon_create_context(import_module);
+ oberon_set_out_directory(ctx, out_path);
+
mod = oberon_compile_module(ctx, code);
oberon_destroy_context(ctx);
+
return 0;
}