diff --git a/src/module.c b/src/module.c index 9abcf5547ab8..86ca01212656 100644 --- a/src/module.c +++ b/src/module.c @@ -59,7 +59,6 @@ Module::Module(char *filename, Identifier *ident, int doDocComment, int doHdrGen : Package(ident) { FileName *srcfilename; - FileName *objfilename; FileName *symfilename; // printf("Module::Module(filename = '%s', ident = '%s')\n", filename, ident->toChars()); @@ -122,110 +121,70 @@ Module::Module(char *filename, Identifier *ident, int doDocComment, int doHdrGen error("source file name '%s' must have .%s extension", srcfilename->toChars(), global.mars_ext); fatal(); } + srcfile = new File(srcfilename); - char *argobj; - if (global.params.objname) - argobj = global.params.objname; -#if 0 - else if (global.params.preservePaths) - argobj = filename; - else - argobj = FileName::name(filename); - if (!FileName::absolute(argobj)) - { - argobj = FileName::combine(global.params.objdir, argobj); - } -#else // Bugzilla 3547 - else - { - if (global.params.preservePaths) - argobj = filename; - else - argobj = FileName::name(filename); - if (!FileName::absolute(argobj)) - { - argobj = FileName::combine(global.params.objdir, argobj); - } - } -#endif - - if (global.params.objname) - objfilename = new FileName(argobj); - else - objfilename = FileName::forceExt(argobj, global.obj_ext); + objfile = setOutfile(global.params.objname, global.params.objdir, filename, global.obj_ext); symfilename = FileName::forceExt(filename, global.sym_ext); - srcfile = new File(srcfilename); - if (doDocComment) - { setDocfile(); - } if (doHdrGen) - { - setHdrfile(); - } + hdrfile = setOutfile(global.params.hdrname, global.params.hdrdir, arg, global.hdr_ext); - objfile = new File(objfilename); + //objfile = new File(objfilename); symfile = new File(symfilename); } void Module::setDocfile() { - FileName *docfilename; - char *argdoc; - - if (global.params.docname) - argdoc = global.params.docname; - else if (global.params.preservePaths) - argdoc = (char *)arg; - else - argdoc = FileName::name((char *)arg); - if (!FileName::absolute(argdoc)) - { //FileName::ensurePathExists(global.params.docdir); - argdoc = FileName::combine(global.params.docdir, argdoc); - } - if (global.params.docname) - docfilename = new FileName(argdoc); - else - docfilename = FileName::forceExt(argdoc, global.doc_ext); - - if (docfilename->equals(srcfile->name)) - { error("Source file and documentation file have same name '%s'", srcfile->name->str); - fatal(); - } - - docfile = new File(docfilename); + docfile = setOutfile(global.params.docname, global.params.docdir, arg, global.doc_ext); } -void Module::setHdrfile() -{ - FileName *hdrfilename; - char *arghdr; +/********************************************* + * Combines things into output file name for .html and .di files. + * Input: + * name Command line name given for the file, NULL if none + * dir Command line directory given for the file, NULL if none + * arg Name of the source file + * ext File name extension to use if 'name' is NULL + * global.params.preservePaths get output path from arg + * srcfile Input file - output file name must not match input file + */ - if (global.params.hdrname) - arghdr = global.params.hdrname; - else if (global.params.preservePaths) - arghdr = (char *)arg; +File *Module::setOutfile(const char *name, const char *dir, const char *arg, const char *ext) +{ + const char *argdoc; + if (name) + argdoc = name; else - arghdr = FileName::name((char *)arg); - if (!FileName::absolute(arghdr)) - { //FileName::ensurePathExists(global.params.hdrdir); - arghdr = FileName::combine(global.params.hdrdir, arghdr); + { + if (global.params.preservePaths) + argdoc = (char *)arg; + else + argdoc = FileName::name((char *)arg); + + // If argdoc doesn't have an absolute path, make it relative to dir + if (!FileName::absolute(argdoc)) + { //FileName::ensurePathExists(dir); + argdoc = FileName::combine(dir, argdoc); + } } - if (global.params.hdrname) - hdrfilename = new FileName(arghdr); + + FileName *docfilename; + if (name) + docfilename = new FileName((char *)argdoc); else - hdrfilename = FileName::forceExt(arghdr, global.hdr_ext); + // 'name' not provided, so force the correct extension + docfilename = FileName::forceExt(argdoc, ext); - if (hdrfilename->equals(srcfile->name)) - { error("Source file and 'header' file have same name '%s'", srcfile->name->str); + if (docfilename->equals(srcfile->name)) + { error("Source file and output file have same name '%s'", srcfile->name->str); fatal(); } - hdrfile = new File(hdrfilename); + return new File(docfilename); } void Module::deleteObjFile() diff --git a/src/module.h b/src/module.h index 0c1b395cf76b..930de1a75c0f 100644 --- a/src/module.h +++ b/src/module.h @@ -118,7 +118,8 @@ struct Module : Package void toCBuffer(OutBuffer *buf, HdrGenState *hgs); void toJsonBuffer(OutBuffer *buf); const char *kind(); - void setDocfile(); // set docfile member + File *setOutfile(const char *name, const char *dir, const char *arg, const char *ext); + void setDocfile(); bool read(Loc loc); // read file, returns 'true' if succeed, 'false' otherwise. void parse(); // syntactic parse void importAll(Scope *sc); @@ -126,7 +127,6 @@ struct Module : Package void semantic2(); // pass 2 semantic analysis void semantic3(); // pass 3 semantic analysis void inlineScan(); // scan for functions to inline - void setHdrfile(); // set hdrfile member void genhdrfile(); // generate D import file void genobjfile(int multiobj); void gensymfile();