source: trunk/ORBit2-2.14.0/src/idl-compiler/orbit-idl-c-backend.c

Last change on this file was 92, checked in by cinc, 19 years ago

Orbit2 modified for use with NOM

File size: 3.9 KB
Line 
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
13static FILE *out_for_pass(const char *input_filename, int pass,
14 OIDL_Run_Info *rinfo);
15
16gboolean
17orbit_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
75char *
76orbit_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
120static FILE *
121out_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}
Note: See TracBrowser for help on using the repository browser.