| 1 | #include "config.h"
|
|---|
| 2 |
|
|---|
| 3 | #include "orbit-idl-c-backend.h"
|
|---|
| 4 | #include <stdio.h>
|
|---|
| 5 | #include <string.h>
|
|---|
| 6 | #include <ctype.h>
|
|---|
| 7 | #include <errno.h>
|
|---|
| 8 | #include <sys/stat.h>
|
|---|
| 9 | #include <sys/types.h>
|
|---|
| 10 |
|
|---|
| 11 | #include <glib/gstdio.h>
|
|---|
| 12 |
|
|---|
| 13 | static FILE *out_for_pass(const char *input_filename, int pass,
|
|---|
| 14 | OIDL_Run_Info *rinfo);
|
|---|
| 15 |
|
|---|
| 16 | gboolean
|
|---|
| 17 | orbit_idl_output_c (IDL_tree tree,
|
|---|
| 18 | OIDL_Run_Info *rinfo)
|
|---|
| 19 | {
|
|---|
| 20 | int i;
|
|---|
| 21 | char *ctmp;
|
|---|
| 22 | OIDL_C_Info ci;
|
|---|
| 23 |
|
|---|
| 24 | ci.base_name = g_path_get_basename(rinfo->input_filename);
|
|---|
| 25 | ctmp = strrchr(ci.base_name, '.');
|
|---|
| 26 | g_assert(ctmp);
|
|---|
| 27 | *ctmp = '\0';
|
|---|
| 28 |
|
|---|
| 29 | ci.c_base_name = g_strdup(ci.base_name);
|
|---|
| 30 | if(!isalpha((guchar)ci.c_base_name[0]))
|
|---|
| 31 | ci.c_base_name[0] = '_';
|
|---|
| 32 | for(i = 0; ci.c_base_name[i]; i++) {
|
|---|
| 33 | if(!isalnum((guchar)ci.c_base_name[i])) ci.c_base_name[i] = '_';
|
|---|
| 34 | }
|
|---|
| 35 |
|
|---|
| 36 | ci.ext_dcls = g_string_new(NULL);
|
|---|
| 37 |
|
|---|
| 38 | ci.do_impl_hack = 1;
|
|---|
| 39 | ci.do_skel_defs = rinfo->do_skel_defs;
|
|---|
| 40 | for(i = 0; i < OUTPUT_NUM_PASSES; i++) {
|
|---|
| 41 | if( (1 << i) & rinfo->enabled_passes) {
|
|---|
| 42 | ci.fh = out_for_pass(rinfo->input_filename, 1 << i, rinfo);
|
|---|
| 43 |
|
|---|
| 44 | switch(1 << i) {
|
|---|
| 45 | case OUTPUT_STUBS:
|
|---|
| 46 | orbit_idl_output_c_stubs(tree, rinfo, &ci);
|
|---|
| 47 | break;
|
|---|
| 48 | case OUTPUT_SKELS:
|
|---|
| 49 | orbit_idl_output_c_skeletons(tree, rinfo, &ci);
|
|---|
| 50 | break;
|
|---|
| 51 | case OUTPUT_COMMON:
|
|---|
| 52 | orbit_idl_output_c_common(tree, rinfo, &ci);
|
|---|
| 53 | break;
|
|---|
| 54 | case OUTPUT_HEADERS:
|
|---|
| 55 | orbit_idl_output_c_headers(tree, rinfo, &ci);
|
|---|
| 56 | break;
|
|---|
| 57 | case OUTPUT_SKELIMPL:
|
|---|
| 58 | orbit_idl_output_c_skelimpl(tree, rinfo, &ci);
|
|---|
| 59 | break;
|
|---|
| 60 | case OUTPUT_IMODULE:
|
|---|
| 61 | orbit_idl_output_c_imodule(tree, rinfo, &ci);
|
|---|
| 62 | break;
|
|---|
| 63 | case OUTPUT_DEPS:
|
|---|
| 64 | orbit_idl_output_c_deps(tree, rinfo, &ci);
|
|---|
| 65 | break;
|
|---|
| 66 | }
|
|---|
| 67 | fclose(ci.fh);
|
|---|
| 68 | }
|
|---|
| 69 | }
|
|---|
| 70 | g_string_free(ci.ext_dcls,TRUE);
|
|---|
| 71 |
|
|---|
| 72 | return TRUE;
|
|---|
| 73 | }
|
|---|
| 74 |
|
|---|
| 75 | char *
|
|---|
| 76 | orbit_idl_c_filename_for_pass (const char *input_filename,
|
|---|
| 77 | int pass)
|
|---|
| 78 | {
|
|---|
| 79 | char *filename;
|
|---|
| 80 | char *basename;
|
|---|
| 81 | char *dot;
|
|---|
| 82 | const char *tack_on = NULL;
|
|---|
| 83 |
|
|---|
| 84 | basename = g_path_get_basename (input_filename);
|
|---|
| 85 | dot = strrchr (basename, '.');
|
|---|
| 86 | if (dot != NULL)
|
|---|
| 87 | *dot = '\0';
|
|---|
| 88 |
|
|---|
| 89 | switch (pass) {
|
|---|
| 90 | case OUTPUT_STUBS:
|
|---|
| 91 | tack_on = "-template.c";
|
|---|
| 92 | break;
|
|---|
| 93 | case OUTPUT_SKELS:
|
|---|
| 94 | tack_on = "-skels.c";
|
|---|
| 95 | break;
|
|---|
| 96 | case OUTPUT_COMMON:
|
|---|
| 97 | tack_on = "-common.c";
|
|---|
| 98 | break;
|
|---|
| 99 | case OUTPUT_HEADERS:
|
|---|
| 100 | tack_on = ".h";
|
|---|
| 101 | break;
|
|---|
| 102 | case OUTPUT_SKELIMPL:
|
|---|
| 103 | // tack_on = "-skelimpl-ih-c.c";
|
|---|
| 104 | tack_on = ".ih";
|
|---|
| 105 | break;
|
|---|
| 106 | case OUTPUT_IMODULE:
|
|---|
| 107 | tack_on = "-imodule.c";
|
|---|
| 108 | break;
|
|---|
| 109 | default:
|
|---|
| 110 | g_error("Unknown output pass");
|
|---|
| 111 | break;
|
|---|
| 112 | }
|
|---|
| 113 |
|
|---|
| 114 | filename = g_strconcat (basename, tack_on, NULL);
|
|---|
| 115 | g_free (basename);
|
|---|
| 116 |
|
|---|
| 117 | return filename;
|
|---|
| 118 | }
|
|---|
| 119 |
|
|---|
| 120 | static FILE *
|
|---|
| 121 | out_for_pass (const char *input_filename,
|
|---|
| 122 | int pass,
|
|---|
| 123 | OIDL_Run_Info *rinfo)
|
|---|
| 124 | {
|
|---|
| 125 | FILE *fp;
|
|---|
| 126 | char *output_filename;
|
|---|
| 127 | gchar *output_full_path = NULL;
|
|---|
| 128 |
|
|---|
| 129 |
|
|---|
| 130 | if ((strlen(rinfo->output_directory)) && (!g_file_test (rinfo->output_directory, G_FILE_TEST_IS_DIR))) {
|
|---|
| 131 | g_error ("ouput directory '%s' does not exist",
|
|---|
| 132 | rinfo->output_directory);
|
|---|
| 133 | return NULL;
|
|---|
| 134 | }
|
|---|
| 135 |
|
|---|
| 136 | if (pass == OUTPUT_DEPS) {
|
|---|
| 137 | if (!g_file_test (".deps", G_FILE_TEST_IS_DIR)) {
|
|---|
| 138 | if (g_mkdir (".deps", 0775) < 0) {
|
|---|
| 139 | g_warning ("failed to create '.deps' directory '%s'",
|
|---|
| 140 | g_strerror (errno));
|
|---|
| 141 | return NULL;
|
|---|
| 142 | }
|
|---|
| 143 | }
|
|---|
| 144 |
|
|---|
| 145 | if (rinfo->deps_file)
|
|---|
| 146 | fp = g_fopen (rinfo->deps_file, "w");
|
|---|
| 147 | else
|
|---|
| 148 | fp = NULL;
|
|---|
| 149 |
|
|---|
| 150 | if (fp == NULL)
|
|---|
| 151 | g_warning ("failed to open '%s': %s\n",
|
|---|
| 152 | rinfo->deps_file, g_strerror (errno));
|
|---|
| 153 |
|
|---|
| 154 | } else {
|
|---|
| 155 | output_filename = orbit_idl_c_filename_for_pass (input_filename, pass);
|
|---|
| 156 | output_full_path = g_build_path (G_DIR_SEPARATOR_S, rinfo->output_directory, output_filename, NULL);
|
|---|
| 157 | g_free (output_filename);
|
|---|
| 158 |
|
|---|
| 159 | fp = g_fopen (output_full_path, "w+");
|
|---|
| 160 | if (fp == NULL)
|
|---|
| 161 | g_error ("failed to fopen '%s': %s\n", output_full_path, g_strerror(errno));
|
|---|
| 162 |
|
|---|
| 163 | g_free (output_full_path);
|
|---|
| 164 | }
|
|---|
| 165 |
|
|---|
| 166 | return fp;
|
|---|
| 167 | }
|
|---|