xref: /haiku/src/bin/rc/rdef.h (revision 5ffbe7d778424c9c59f00b37a3baff5c4c648790)
1 /**
2  * @file rdef.h
3  *
4  * Public header file for the librdef shared library. Programs that want to
5  * use librdef should include this file, and link to librdef.so.
6  *
7  * @author Copyright (c) 2003 Matthijs Hollemans
8  *
9  * Permission is hereby granted, free of charge, to any person obtaining a
10  * copy of this software and associated documentation files (the "Software"),
11  * to deal in the Software without restriction, including without limitation
12  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
13  * and/or sell copies of the Software, and to permit persons to whom the
14  * Software is furnished to do so, subject to the following conditions:
15  *
16  * The above copyright notice and this permission notice shall be included in
17  * all copies or substantial portions of the Software.
18  *
19  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
22  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
24  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
25  * DEALINGS IN THE SOFTWARE.
26  */
27 
28 #ifndef RDEF_H
29 #define RDEF_H
30 
31 #include <OS.h>
32 
33 #ifdef __cplusplus
34 extern "C" {
35 #endif
36 
37 // bonefish: What was this needed for?
38 //#if __i386__
39 //# ifdef _BUILDING_RDEF
40 //#  define _IMPEXP_RDEF __declspec(dllexport)
41 //# else
42 //#  define _IMPEXP_RDEF __declspec(dllimport)
43 //# endif
44 //#else
45 # define _IMPEXP_RDEF
46 //#endif
47 
48 /**
49  * Whether to overwrite or merge with the output file. With this flag, the
50  * compiler will add the resources to the output file (if it exists). When
51  * something goes wrong, the output file is not deleted (although it may
52  * already contain some of the new resources). The default action is to clobber
53  * the contents of the output file if it already existed, and the file is
54  * deleted in case of an error. Not used for decompiling.
55  */
56 #define RDEF_MERGE_RESOURCES  (1 << 0)
57 
58 /**
59  * Whether to generate resource names from symbolic identifiers, or vice versa.
60  * With this flag, the compiler will use symbolic names in statements such as
61  * "resource(R_Symbol)" to generate the resource name, in this case "R_Symbol".
62  * Otherwise, you must explicitly specify a name, such as "resource(R_Symbol,
63  * "Name") ..." If this option is set when decompiling, the decompiler will put
64  * resource names that are valid C/C++ identifiers in an enum statement in a
65  * new header file.
66  */
67 #define RDEF_AUTO_NAMES  (1 << 1)
68 
69 /** Error codes returned by the librdef functions. */
70 enum {
71 	/** Syntax error or other compiler error. */
72 	RDEF_COMPILE_ERR = B_ERRORS_END + 1,
73 
74 	/** Could not find one of the input files. */
75 	RDEF_FILE_NOT_FOUND,
76 
77 	/** One of the input files has nothing to decompile. */
78 	RDEF_NO_RESOURCES,
79 
80 	/** Could not write the output file. */
81 	RDEF_WRITE_ERR,
82 
83 	/* B_OK */
84 	/* B_ERROR */
85 	/* B_NO_MEMORY */
86 };
87 
88 /**
89  * The result of the most recent (de)compilation. B_OK if the operation
90  * was successful, a negative error code otherwise. This is the same as
91  * the value returned by any of the rdef_xxx functions.
92  */
93 _IMPEXP_RDEF extern status_t rdef_err;
94 
95 /**
96  * The line number where compilation failed. Valid line numbers start
97  * at 1. This is 0 if the error did not happen on a specific line.
98  */
99 _IMPEXP_RDEF extern int32 rdef_err_line;
100 
101 /**
102  * The file where the error occurred. This is an empty string if the
103  * error did not happen in a specific file.
104  */
105 _IMPEXP_RDEF extern char rdef_err_file[];
106 
107 /**
108  * The error message from the compiler. This is an empty string if there
109  * was no additional information to report.
110  */
111 _IMPEXP_RDEF extern char rdef_err_msg[];
112 
113 /**
114  * Returns the version number of the librdef API. You can use this to
115  * check which functions and variables are available.
116  */
117 _IMPEXP_RDEF int32 rdef_get_version();
118 
119 /**
120  * Adds a directory where the compiler will look for include files.
121  * Typically, you want to add the current directory to this list.
122  * Not used for decompilation.
123  */
124 _IMPEXP_RDEF status_t rdef_add_include_dir(const char *dir, bool toEndOfList);
125 
126 /**	Removes an include directory */
127 _IMPEXP_RDEF status_t rdef_remove_include_dir(const char *dir);
128 
129 /**
130  * Frees the list of include directories. If you call rdef_add_include_dir(),
131  * you should always call rdef_free_include_dirs() when the compiler is done.
132  */
133 _IMPEXP_RDEF void rdef_free_include_dirs();
134 
135 /**
136  * Adds an input file for the compiler or decompiler. Input files are not
137  * required to have a specific extension.
138  */
139 _IMPEXP_RDEF status_t rdef_add_input_file(const char* file);
140 
141 /**
142  * Frees the list of input files. If you call rdef_add_input_file(), you
143  * should always call rdef_free_input_files() when the compiler is done.
144  */
145 _IMPEXP_RDEF void rdef_free_input_files();
146 
147 /** Changes the configuration of the compiler or decompiler. */
148 _IMPEXP_RDEF void rdef_set_flags(uint32 flags);
149 
150 /** Resets all the configuration options to their default values. */
151 _IMPEXP_RDEF void rder_clear_flags();
152 
153 /**
154  * Invokes the rdef-to-rsrc compiler. Before you call rdef_compile(), you must
155  * have specified at least one input file with rdef_add_input_file(), and one
156  * include search path with rdef_add_include_dir().
157  */
158 _IMPEXP_RDEF status_t rdef_compile(const char* output_file);
159 
160 /**
161  * Invokes the rsrc-to-rdef decompiler. Just as with rdef_compile(), you must
162  * first add at least one input file with rdef_add_input_file(). Include dirs
163  * are not necessary, because the decompiler does not use them. The decompiler
164  * writes at least an rdef script file. In addition, if the "auto names" option
165  * is enabled it also writes a C/C++ header file. If these files already exist,
166  * they will be overwritten.
167  */
168 _IMPEXP_RDEF status_t rdef_decompile(const char* output_file);
169 
170 #ifdef __cplusplus
171 }
172 #endif
173 
174 #endif /* RDEF_H */
175