Fix typelib only option.

Make -t and -h options inclusive.
This commit is contained in:
Huw Davies 2005-01-26 19:40:47 +00:00 committed by Alexandre Julliard
parent 54c67dd1b1
commit 0e53bb3f7b
7 changed files with 49 additions and 41 deletions

View File

@ -391,7 +391,7 @@ int do_import(char *fname)
int ptr = import_stack_ptr;
int ret;
if (!parse_only) {
if (!parse_only && do_header) {
hname = dup_basename(fname, ".idl");
p = hname + strlen(hname) - 2;
if (p <= hname || strcmp( p, ".h" )) strcat(hname, ".h");

View File

@ -249,17 +249,17 @@ int_statements: { $$ = NULL; }
;
statement: ';' {}
| constdef ';' { if (!parse_only) { write_constdef($1); } }
| constdef ';' { if (!parse_only && do_header) { write_constdef($1); } }
| cppquote {}
| enumdef ';' { if (!parse_only) { write_type(header, $1, NULL, NULL); fprintf(header, ";\n\n"); } }
| externdef ';' { if (!parse_only) { write_externdef($1); } }
| enumdef ';' { if (!parse_only && do_header) { write_type(header, $1, NULL, NULL); fprintf(header, ";\n\n"); } }
| externdef ';' { if (!parse_only && do_header) { write_externdef($1); } }
| import {}
| structdef ';' { if (!parse_only) { write_type(header, $1, NULL, NULL); fprintf(header, ";\n\n"); } }
| structdef ';' { if (!parse_only && do_header) { write_type(header, $1, NULL, NULL); fprintf(header, ";\n\n"); } }
| typedef ';' {}
| uniondef ';' { if (!parse_only) { write_type(header, $1, NULL, NULL); fprintf(header, ";\n\n"); } }
| uniondef ';' { if (!parse_only && do_header) { write_type(header, $1, NULL, NULL); fprintf(header, ";\n\n"); } }
;
cppquote: tCPPQUOTE '(' aSTRING ')' { if (!parse_only) fprintf(header, "%s\n", $3); }
cppquote: tCPPQUOTE '(' aSTRING ')' { if (!parse_only && do_header) fprintf(header, "%s\n", $3); }
;
import_start: tIMPORT aSTRING ';' { assert(yychar == YYEMPTY);
if (!do_import($2)) yychar = aEOF; }
@ -580,7 +580,7 @@ coclass: tCOCLASS aIDENTIFIER { $$ = make_class($2); }
coclasshdr: attributes coclass { $$ = $2;
$$->attrs = $1;
if (!parse_only) write_coclass($$);
if (!parse_only && do_header) write_coclass($$);
}
;
@ -609,7 +609,7 @@ dispinterfacehdr: attributes dispinterface { $$ = $2;
$$->ref = find_type("IDispatch", 0);
if (!$$->ref) yyerror("IDispatch is undefined\n");
$$->defined = TRUE;
if (!parse_only) write_forward($$);
if (!parse_only && do_header) write_forward($$);
}
;
@ -627,11 +627,11 @@ dispinterfacedef: dispinterfacehdr '{'
'}' { $$ = $1;
$$->fields = $3;
$$->funcs = $4;
if (!parse_only) write_dispinterface($$);
if (!parse_only && do_header) write_dispinterface($$);
}
/* FIXME: not sure how to handle this yet
| dispinterfacehdr '{' interface '}' { $$ = $1;
if (!parse_only) write_interface($$);
if (!parse_only && do_header) write_interface($$);
}
*/
;
@ -648,7 +648,7 @@ interfacehdr: attributes interface { $$ = $2;
if ($$->defined) yyerror("multiple definition error\n");
$$->attrs = $1;
$$->defined = TRUE;
if (!parse_only) write_forward($$);
if (!parse_only && do_header) write_forward($$);
}
;
@ -656,7 +656,7 @@ interfacedef: interfacehdr inherit
'{' int_statements '}' { $$ = $1;
$$->ref = $2;
$$->funcs = $4;
if (!parse_only) write_interface($$);
if (!parse_only && do_header) write_interface($$);
}
/* MIDL is able to import the definition of a base class from inside the
* definition of a derived class, I'll try to support it with this rule */
@ -665,14 +665,14 @@ interfacedef: interfacehdr inherit
$$->ref = find_type2($3, 0);
if (!$$->ref) yyerror("base class %s not found in import\n", $3);
$$->funcs = $6;
if (!parse_only) write_interface($$);
if (!parse_only && do_header) write_interface($$);
}
| dispinterfacedef { $$ = $1; }
;
interfacedec:
interface ';' { $$ = $1; if (!parse_only) write_forward($$); }
| dispinterface ';' { $$ = $1; if (!parse_only) write_forward($$); }
interface ';' { $$ = $1; if (!parse_only && do_header) write_forward($$); }
| dispinterface ';' { $$ = $1; if (!parse_only && do_header) write_forward($$); }
;
module: tMODULE aIDENTIFIER { $$ = make_type(0, NULL); $$->name = $2; }
@ -686,7 +686,7 @@ modulehdr: attributes module { $$ = $2;
moduledef: modulehdr '{' int_statements '}' { $$ = $1;
$$->funcs = $3;
/* FIXME: if (!parse_only) write_module($$); */
/* FIXME: if (!parse_only && do_header) write_module($$); */
}
;
@ -736,7 +736,7 @@ typedef: tTYPEDEF m_attributes type pident_list { typeref_t *tref = uniq_tref($3
tref->name = NULL;
$$ = type_ref(tref);
$$->attrs = $2;
if (!parse_only) write_typedef($$, $4);
if (!parse_only && do_header) write_typedef($$, $4);
reg_types($$, $4, 0);
}
;

View File

@ -952,7 +952,7 @@ void write_proxies(ifref_t *ifaces)
char *file_id = proxy_token;
int c;
if (!do_everything) return;
if (!do_proxies) return;
if (!lcur) return;
END_OF_LIST(lcur);

View File

@ -170,7 +170,7 @@ unsigned short get_var_vt(var_t *v)
void start_typelib(char *name, attr_t *attrs)
{
in_typelib++;
if (!do_everything && !typelib_only) return;
if (!do_typelib) return;
typelib = xmalloc(sizeof(*typelib));
typelib->name = xstrdup(name);

View File

@ -59,11 +59,11 @@ static char usage[] =
" -d n Set debug level to 'n'\n"
" -D id[=val] Define preprocessor identifier id=val\n"
" -E Preprocess only\n"
" -h Generate headers only\n"
" -h Generate headers\n"
" -H file Name of header file (default is infile.h)\n"
" -I path Set include search dir to path (multiple -I allowed)\n"
" -N Do not preprocess input\n"
" -t Generate typelib only\n"
" -t Generate typelib\n"
" -T file Name of typelib file (default is infile.tlb)\n"
" -V Print version and exit\n"
" -W Enable pedantic warnings\n"
@ -83,10 +83,11 @@ int win32 = 1;
int debuglevel = DEBUGLEVEL_NONE;
int pedantic = 0;
int do_everything = 1;
static int do_everything = 1;
int preprocess_only = 0;
int header_only = 0;
int typelib_only = 0;
int do_header = 0;
int do_typelib = 0;
int do_proxies = 0;
int no_preprocess = 0;
char *input_name;
@ -150,7 +151,7 @@ int main(int argc,char *argv[])
break;
case 'h':
do_everything = 0;
header_only = 1;
do_header = 1;
break;
case 'H':
header_name = strdup(optarg);
@ -163,7 +164,7 @@ int main(int argc,char *argv[])
break;
case 't':
do_everything = 0;
typelib_only = 1;
do_typelib = 1;
break;
case 'T':
typelib_name = strdup(optarg);
@ -180,6 +181,9 @@ int main(int argc,char *argv[])
}
}
if(do_everything) {
do_header = do_typelib = do_proxies = 1;
}
if(optind < argc) {
input_name = xstrdup(argv[optind]);
}
@ -201,17 +205,17 @@ int main(int argc,char *argv[])
(debuglevel & DEBUGLEVEL_PPTRACE) != 0,
(debuglevel & DEBUGLEVEL_PPMSG) != 0 );
if (!header_name && (do_everything || header_only)) {
if (!header_name && do_header) {
header_name = dup_basename(input_name, ".idl");
strcat(header_name, ".h");
}
if (!typelib_name && (do_everything || typelib_only)) {
if (!typelib_name && do_typelib) {
typelib_name = dup_basename(input_name, ".idl");
strcat(typelib_name, ".tlb");
}
if (!proxy_name && do_everything) {
if (!proxy_name && do_proxies) {
proxy_name = dup_basename(input_name, ".idl");
proxy_token = xstrdup(proxy_name);
strcat(proxy_name, "_p.c");
@ -247,7 +251,7 @@ int main(int argc,char *argv[])
}
}
if(do_everything || header_only) {
if(do_header) {
header_token = make_token(header_name);
if(!(header = fopen(header_name, "w"))) {
@ -262,9 +266,11 @@ int main(int argc,char *argv[])
fprintf(header, "#ifdef __cplusplus\n");
fprintf(header, "extern \"C\" {\n");
fprintf(header, "#endif\n");
}
ret = yyparse();
ret = yyparse();
if(do_header) {
fprintf(header, "#ifdef __cplusplus\n");
fprintf(header, "}\n");
fprintf(header, "#endif\n");

View File

@ -38,9 +38,9 @@ extern int debuglevel;
extern int win32;
extern int pedantic;
extern int do_everything;
extern int header_only;
extern int typelib_only;
extern int do_header;
extern int do_typelib;
extern int do_proxies;
extern char *input_name;
extern char *header_name;

View File

@ -14,21 +14,23 @@ No options are used.
The program prints the help info and then exits.
.PP
.B General options:
.IP \fB-t\fR
Only generate a type library.
.IP "\fB-T \fIfile\fR"
Define the name of the type library to be generated.
The default filename is infile.tlb.
.IP \fB-V\fR
Print version number and exits from the program.
.PP
.B Header options:
.IP \fB-h\fR
Only generate header files.
Generate header files.
.IP "\fB-H \fIfile\fR"
Name of header file to generate. The default header
filename is infile.h.
.PP
.B Type library options:
.IP \fB-t\fR
Generate a type library.
.IP "\fB-T \fIfile\fR"
Define the name of the type library to be generated.
The default filename is infile.tlb.
.PP
.B Preprocessor options:
.IP "\fB-I \fIpath\fR"
Add a header search dir to path. Multiple search