void Library::setFilename(char *dir, char *filename) { char *arg = filename; if (!arg || !*arg) { // Generate lib file name from first obj name char *n = (char *)global.params.objfiles->data[0]; n = FileName::name(n); FileName *fn = FileName::forceExt(n, global.lib_ext); arg = fn->toChars(); } if (!FileName::absolute(arg)) arg = FileName::combine(dir, arg); FileName *libfilename = FileName::defaultExt(arg, global.lib_ext); libfile = new File(libfilename); }
void json_generate(Array *modules) { OutBuffer buf; buf.writestring("[\n"); for (int i = 0; i < modules->dim; i++) { Module *m = (Module *)modules->data[i]; if (global.params.verbose) printf("json gen %s\n", m->toChars()); m->toJsonBuffer(&buf); buf.writestring(",\n"); } JsonRemoveComma(&buf); buf.writestring("]\n"); // Write buf to file char *arg = global.params.xfilename; if (!arg || !*arg) { // Generate lib file name from first obj name char *n = (char *)global.params.objfiles->data[0]; n = FileName::name(n); FileName *fn = FileName::forceExt(n, global.json_ext); arg = fn->toChars(); } else if (arg[0] == '-' && arg[1] == 0) { // Write to stdout; assume it succeeds int n = fwrite(buf.data, 1, buf.offset, stdout); assert(n == buf.offset); // keep gcc happy about return values return; } // if (!FileName::absolute(arg)) // arg = FileName::combine(dir, arg); FileName *jsonfilename = FileName::defaultExt(arg, global.json_ext); File *jsonfile = new File(jsonfilename); assert(jsonfile); jsonfile->setbuffer(buf.data, buf.offset); jsonfile->ref = 1; char *pt = FileName::path(jsonfile->toChars()); if (*pt) FileName::ensurePathExists(pt); mem.free(pt); jsonfile->writev(); }
Module::Module(char *filename, Identifier *ident, int doDocComment, int doHdrGen) : Package(ident) { FileName *srcfilename; // printf("Module::Module(filename = '%s', ident = '%s')\n", filename, ident->toChars()); this->arg = filename; md = NULL; errors = 0; numlines = 0; members = NULL; isHtml = 0; isDocFile = 0; needmoduleinfo = 0; #ifdef IN_GCC strictlyneedmoduleinfo = 0; #endif selfimports = 0; insearch = 0; searchCacheIdent = NULL; searchCacheSymbol = NULL; searchCacheFlags = 0; semanticstarted = 0; semanticRun = 0; decldefs = NULL; vmoduleinfo = NULL; #if IN_DMD massert = NULL; munittest = NULL; marray = NULL; sictor = NULL; sctor = NULL; sdtor = NULL; stest = NULL; sfilename = NULL; #endif root = 0; importedFrom = NULL; srcfile = NULL; objfile = NULL; docfile = NULL; hdrfile = NULL; debuglevel = 0; debugids = NULL; debugidsNot = NULL; versionlevel = 0; versionids = NULL; versionidsNot = NULL; macrotable = NULL; escapetable = NULL; safe = FALSE; #if IN_DMD doppelganger = 0; cov = NULL; covb = NULL; #endif srcfilename = FileName::defaultExt(filename, global.mars_ext); if (!srcfilename->equalsExt(global.mars_ext) && !srcfilename->equalsExt(global.hdr_ext) && !srcfilename->equalsExt("dd")) { if (srcfilename->equalsExt("html") || srcfilename->equalsExt("htm") || srcfilename->equalsExt("xhtml")) isHtml = 1; else { error("source file name '%s' must have .%s extension", srcfilename->toChars(), global.mars_ext); fatal(); } } srcfile = new File(srcfilename); #if IN_LLVM // LDC llvmForceLogging = false; moduleInfoVar = NULL; moduleInfoType = llvm::StructType::create(llvm::getGlobalContext()); this->doDocComment = doDocComment; this->doHdrGen = doHdrGen; this->isRoot = false; this->arrayfuncs = 0; #endif }
Module *Module::load(Loc loc, Array *packages, Identifier *ident) { Module *m; char *filename; //printf("Module::load(ident = '%s')\n", ident->toChars()); // Build module filename by turning: // foo.bar.baz // into: // foo\bar\baz filename = ident->toChars(); if (packages && packages->dim) { OutBuffer buf; int i; for (i = 0; i < packages->dim; i++) { Identifier *pid = (Identifier *)packages->data[i]; buf.writestring(pid->toChars()); #if _WIN32 buf.writeByte('\\'); #else buf.writeByte('/'); #endif } buf.writestring(filename); buf.writeByte(0); filename = (char *)buf.extractData(); } m = new Module(filename, ident, 0, 0); m->loc = loc; /* Search along global.path for .di file, then .d file. */ char *result = NULL; FileName *fdi = FileName::forceExt(filename, global.hdr_ext); FileName *fd = FileName::forceExt(filename, global.mars_ext); char *sdi = fdi->toChars(); char *sd = fd->toChars(); if (FileName::exists(sdi)) result = sdi; else if (FileName::exists(sd)) result = sd; else if (FileName::absolute(filename)) ; else if (!global.path) ; else { for (size_t i = 0; i < global.path->dim; i++) { char *p = (char *)global.path->data[i]; char *n = FileName::combine(p, sdi); if (FileName::exists(n)) { result = n; break; } mem.free(n); n = FileName::combine(p, sd); if (FileName::exists(n)) { result = n; break; } mem.free(n); } } if (result) m->srcfile = new File(result); if (global.params.verbose) { printf("import "); if (packages) { for (size_t i = 0; i < packages->dim; i++) { Identifier *pid = (Identifier *)packages->data[i]; printf("%s.", pid->toChars()); } } printf("%s\t(%s)\n", ident->toChars(), m->srcfile->toChars()); } m->read(loc); m->parse(); #ifdef IN_GCC d_gcc_magic_module(m); #endif return m; }
int runLINK() { #if _WIN32 if (global.params.is64bit) { OutBuffer cmdbuf; for (size_t i = 0; i < global.params.objfiles->dim; i++) { if (i) cmdbuf.writeByte(' '); char *p = (*global.params.objfiles)[i]; char *basename = FileName::removeExt(FileName::name(p)); char *ext = FileName::ext(p); if (ext && !strchr(basename, '.')) // Write name sans extension (but not if a double extension) writeFilename(&cmdbuf, p, ext - p - 1); else writeFilename(&cmdbuf, p); mem.free(basename); } if (global.params.resfile) { cmdbuf.writeByte(' '); writeFilename(&cmdbuf, global.params.resfile); } cmdbuf.writeByte(' '); if (global.params.exefile) { cmdbuf.writestring("/OUT:"); writeFilename(&cmdbuf, global.params.exefile); } else { /* Generate exe file name from first obj name. * No need to add it to cmdbuf because the linker will default to it. */ char *n = (*global.params.objfiles)[0]; n = FileName::name(n); FileName *fn = FileName::forceExt(n, "exe"); global.params.exefile = fn->toChars(); } // Make sure path to exe file exists { char *p = FileName::path(global.params.exefile); FileName::ensurePathExists(p); mem.free(p); } cmdbuf.writeByte(' '); if (global.params.mapfile) { cmdbuf.writestring("/MAP:"); writeFilename(&cmdbuf, global.params.mapfile); } else if (global.params.map) { FileName *fn = FileName::forceExt(global.params.exefile, "map"); char *path = FileName::path(global.params.exefile); char *p; if (path[0] == '\0') p = FileName::combine(global.params.objdir, fn->toChars()); else p = fn->toChars(); cmdbuf.writestring("/MAP:"); writeFilename(&cmdbuf, p); } for (size_t i = 0; i < global.params.libfiles->dim; i++) { cmdbuf.writeByte(' '); cmdbuf.writestring("/DEFAULTLIB:"); writeFilename(&cmdbuf, (*global.params.libfiles)[i]); } if (global.params.deffile) { cmdbuf.writeByte(' '); cmdbuf.writestring("/DEF:"); writeFilename(&cmdbuf, global.params.deffile); } if (global.params.symdebug) { cmdbuf.writeByte(' '); cmdbuf.writestring("/DEBUG"); } if (global.params.dll) { cmdbuf.writeByte(' '); cmdbuf.writestring("/DLL"); } cmdbuf.writestring(" /MERGE:.minfobg=.minfodt /MERGE:.minfoen=.minfodt"); cmdbuf.writestring(" /MERGE:._deh_bg=._deh_eh /MERGE:._deh_en=._deh_eh"); for (size_t i = 0; i < global.params.linkswitches->dim; i++) { cmdbuf.writeByte(' '); cmdbuf.writestring((*global.params.linkswitches)[i]); } /* Append the path to the VC lib files, and then the SDK lib files */ const char *vcinstalldir = getenv("VCINSTALLDIR"); if (vcinstalldir) { cmdbuf.writestring(" \"/LIBPATH:"); cmdbuf.writestring(vcinstalldir); cmdbuf.writestring("lib\\amd64\""); } const char *windowssdkdir = getenv("WindowsSdkDir"); if (windowssdkdir) { cmdbuf.writestring(" \"/LIBPATH:"); cmdbuf.writestring(windowssdkdir); cmdbuf.writestring("lib\\x64\""); } char *p = cmdbuf.toChars(); FileName *lnkfilename = NULL; size_t plen = strlen(p); if (plen > 7000) { lnkfilename = FileName::forceExt(global.params.exefile, "lnk"); File flnk(lnkfilename); flnk.setbuffer(p, plen); flnk.ref = 1; if (flnk.write()) error(0, "error writing file %s", lnkfilename); if (lnkfilename->len() < plen) sprintf(p, "@%s", lnkfilename->toChars()); } char *linkcmd = getenv("LINKCMD"); if (!linkcmd) { if (vcinstalldir) { OutBuffer linkcmdbuf; linkcmdbuf.writestring(vcinstalldir); linkcmdbuf.writestring("bin\\amd64\\link"); linkcmd = linkcmdbuf.toChars(); linkcmdbuf.extractData(); } else linkcmd = "link"; } int status = executecmd(linkcmd, p, 1); if (lnkfilename) { remove(lnkfilename->toChars()); delete lnkfilename; } return status; } else { OutBuffer cmdbuf; global.params.libfiles->push("user32"); global.params.libfiles->push("kernel32"); for (size_t i = 0; i < global.params.objfiles->dim; i++) { if (i) cmdbuf.writeByte('+'); char *p = (*global.params.objfiles)[i]; char *basename = FileName::removeExt(FileName::name(p)); char *ext = FileName::ext(p); if (ext && !strchr(basename, '.')) // Write name sans extension (but not if a double extension) writeFilename(&cmdbuf, p, ext - p - 1); else writeFilename(&cmdbuf, p); mem.free(basename); } cmdbuf.writeByte(','); if (global.params.exefile) writeFilename(&cmdbuf, global.params.exefile); else { /* Generate exe file name from first obj name. * No need to add it to cmdbuf because the linker will default to it. */ char *n = (*global.params.objfiles)[0]; n = FileName::name(n); FileName *fn = FileName::forceExt(n, "exe"); global.params.exefile = fn->toChars(); } // Make sure path to exe file exists { char *p = FileName::path(global.params.exefile); FileName::ensurePathExists(p); mem.free(p); } cmdbuf.writeByte(','); if (global.params.mapfile) writeFilename(&cmdbuf, global.params.mapfile); else if (global.params.map) { FileName *fn = FileName::forceExt(global.params.exefile, "map"); char *path = FileName::path(global.params.exefile); char *p; if (path[0] == '\0') p = FileName::combine(global.params.objdir, fn->toChars()); else p = fn->toChars(); writeFilename(&cmdbuf, p); } else cmdbuf.writestring("nul"); cmdbuf.writeByte(','); for (size_t i = 0; i < global.params.libfiles->dim; i++) { if (i) cmdbuf.writeByte('+'); writeFilename(&cmdbuf, (*global.params.libfiles)[i]); } if (global.params.deffile) { cmdbuf.writeByte(','); writeFilename(&cmdbuf, global.params.deffile); } /* Eliminate unnecessary trailing commas */ while (1) { size_t i = cmdbuf.offset; if (!i || cmdbuf.data[i - 1] != ',') break; cmdbuf.offset--; } if (global.params.resfile) { cmdbuf.writestring("/RC:"); writeFilename(&cmdbuf, global.params.resfile); } if (global.params.map || global.params.mapfile) cmdbuf.writestring("/m"); #if 0 if (debuginfo) cmdbuf.writestring("/li"); if (codeview) { cmdbuf.writestring("/co"); if (codeview3) cmdbuf.writestring(":3"); } #else if (global.params.symdebug) cmdbuf.writestring("/co"); #endif cmdbuf.writestring("/noi"); for (size_t i = 0; i < global.params.linkswitches->dim; i++) { cmdbuf.writestring((*global.params.linkswitches)[i]); } cmdbuf.writeByte(';'); char *p = cmdbuf.toChars(); FileName *lnkfilename = NULL; size_t plen = strlen(p); if (plen > 7000) { lnkfilename = FileName::forceExt(global.params.exefile, "lnk"); File flnk(lnkfilename); flnk.setbuffer(p, plen); flnk.ref = 1; if (flnk.write()) error(0, "error writing file %s", lnkfilename); if (lnkfilename->len() < plen) sprintf(p, "@%s", lnkfilename->toChars()); } char *linkcmd = getenv("LINKCMD"); if (!linkcmd) linkcmd = "link"; int status = executecmd(linkcmd, p, 1); if (lnkfilename) { remove(lnkfilename->toChars()); delete lnkfilename; } return status; } #elif linux || __APPLE__ || __FreeBSD__ || __OpenBSD__ || __sun pid_t childpid; int status; // Build argv[] Strings argv; const char *cc = getenv("CC"); if (!cc) cc = "gcc"; argv.push((char *)cc); argv.insert(1, global.params.objfiles); #if __APPLE__ // If we are on Mac OS X and linking a dynamic library, // add the "-dynamiclib" flag if (global.params.dll) argv.push((char *) "-dynamiclib"); #elif linux || __FreeBSD__ || __OpenBSD__ || __sun if (global.params.dll) argv.push((char *) "-shared"); #endif // None of that a.out stuff. Use explicit exe file name, or // generate one from name of first source file. argv.push((char *)"-o"); if (global.params.exefile) { if (global.params.dll) global.params.exefile = FileName::forceExt(global.params.exefile, global.dll_ext)->toChars(); argv.push(global.params.exefile); } else { // Generate exe file name from first obj name char *n = (*global.params.objfiles)[0]; char *e; char *ex; n = FileName::name(n); e = FileName::ext(n); if (e) { e--; // back up over '.' ex = (char *)mem.malloc(e - n + 1); memcpy(ex, n, e - n); ex[e - n] = 0; // If generating dll then force dll extension if (global.params.dll) ex = FileName::forceExt(ex, global.dll_ext)->toChars(); } else ex = (char *)"a.out"; // no extension, so give up argv.push(ex); global.params.exefile = ex; } // Make sure path to exe file exists { char *p = FileName::path(global.params.exefile); FileName::ensurePathExists(p); mem.free(p); } if (global.params.symdebug) argv.push((char *)"-g"); if (global.params.is64bit) argv.push((char *)"-m64"); else argv.push((char *)"-m32"); if (global.params.map || global.params.mapfile) { argv.push((char *)"-Xlinker"); #if __APPLE__ argv.push((char *)"-map"); #else argv.push((char *)"-Map"); #endif if (!global.params.mapfile) { FileName *fn = FileName::forceExt(global.params.exefile, "map"); char *path = FileName::path(global.params.exefile); char *p; if (path[0] == '\0') p = FileName::combine(global.params.objdir, fn->toChars()); else p = fn->toChars(); global.params.mapfile = p; } argv.push((char *)"-Xlinker"); argv.push(global.params.mapfile); } if (0 && global.params.exefile) { /* This switch enables what is known as 'smart linking' * in the Windows world, where unreferenced sections * are removed from the executable. It eliminates unreferenced * functions, essentially making a 'library' out of a module. * Although it is documented to work with ld version 2.13, * in practice it does not, but just seems to be ignored. * Thomas Kuehne has verified that it works with ld 2.16.1. * BUG: disabled because it causes exception handling to fail * because EH sections are "unreferenced" and elided */ argv.push((char *)"-Xlinker"); argv.push((char *)"--gc-sections"); } for (size_t i = 0; i < global.params.linkswitches->dim; i++) { char *p = (*global.params.linkswitches)[i]; if (!p || !p[0] || !(p[0] == '-' && (p[1] == 'l' || p[1] == 'L'))) // Don't need -Xlinker if switch starts with -l or -L. // Eliding -Xlinker is significant for -L since it allows our paths // to take precedence over gcc defaults. argv.push((char *)"-Xlinker"); argv.push(p); } /* Add each library, prefixing it with "-l". * The order of libraries passed is: * 1. any libraries passed with -L command line switch * 2. libraries specified on the command line * 3. libraries specified by pragma(lib), which were appended * to global.params.libfiles. * 4. standard libraries. */ for (size_t i = 0; i < global.params.libfiles->dim; i++) { char *p = (*global.params.libfiles)[i]; size_t plen = strlen(p); if (plen > 2 && p[plen - 2] == '.' && p[plen -1] == 'a') argv.push(p); else { char *s = (char *)mem.malloc(plen + 3); s[0] = '-'; s[1] = 'l'; memcpy(s + 2, p, plen + 1); argv.push(s); } } /* Standard libraries must go after user specified libraries * passed with -l. */ const char *libname = (global.params.symdebug) ? global.params.debuglibname : global.params.defaultlibname; size_t slen = strlen(libname); if (slen) { char *buf = (char *)malloc(2 + slen + 1); strcpy(buf, "-l"); strcpy(buf + 2, libname); argv.push(buf); // turns into /usr/lib/libphobos2.a } #ifdef __sun argv.push((char *)"-mt"); #endif // argv.push((void *)"-ldruntime"); argv.push((char *)"-lpthread"); argv.push((char *)"-lm"); #if linux && DMDV2 // Changes in ld for Ubuntu 11.10 require this to appear after phobos2 argv.push((char *)"-lrt"); #endif if (!global.params.quiet || global.params.verbose) { // Print it for (size_t i = 0; i < argv.dim; i++) printf("%s ", argv[i]); printf("\n"); fflush(stdout); } argv.push(NULL); #if HAS_POSIX_SPAWN int spawn_err = posix_spawnp(&childpid, argv[0], NULL, NULL, argv.tdata(), environ); if (spawn_err != 0) { perror(argv[0]); return -1; } #else childpid = fork(); if (childpid == 0) { execvp(argv[0], argv.tdata()); perror(argv[0]); // failed to execute return -1; } else if (childpid == -1) { perror("Unable to fork"); return -1; } #endif waitpid(childpid, &status, 0); if (WIFEXITED(status)) { status = WEXITSTATUS(status); if (status) printf("--- errorlevel %d\n", status); } else if (WIFSIGNALED(status)) { printf("--- killed by signal %d\n", WTERMSIG(status)); status = 1; } return status; #else printf ("Linking is not yet supported for this version of DMD.\n"); return -1; #endif }
int runLINK() { #if _WIN32 char *p; int i; int status; OutBuffer cmdbuf; global.params.libfiles->push((void *) "user32"); global.params.libfiles->push((void *) "kernel32"); for (i = 0; i < global.params.objfiles->dim; i++) { if (i) cmdbuf.writeByte('+'); p = (char *)global.params.objfiles->data[i]; char *ext = FileName::ext(p); if (ext) cmdbuf.write(p, ext - p - 1); else cmdbuf.writestring(p); } cmdbuf.writeByte(','); if (global.params.exefile) cmdbuf.writestring(global.params.exefile); else { // Generate exe file name from first obj name char *n = (char *)global.params.objfiles->data[0]; char *ex; n = FileName::name(n); FileName *fn = FileName::forceExt(n, "exe"); global.params.exefile = fn->toChars(); } cmdbuf.writeByte(','); if (global.params.run) cmdbuf.writestring("nul"); // if (mapfile) // cmdbuf.writestring(output); cmdbuf.writeByte(','); for (i = 0; i < global.params.libfiles->dim; i++) { if (i) cmdbuf.writeByte('+'); cmdbuf.writestring((char *) global.params.libfiles->data[i]); } if (global.params.deffile) { cmdbuf.writeByte(','); cmdbuf.writestring(global.params.deffile); } /* Eliminate unnecessary trailing commas */ while (1) { i = cmdbuf.offset; if (!i || cmdbuf.data[i - 1] != ',') break; cmdbuf.offset--; } if (global.params.resfile) { cmdbuf.writestring("/RC:"); cmdbuf.writestring(global.params.resfile); } #if 0 if (mapfile) cmdbuf.writestring("/m"); if (debuginfo) cmdbuf.writestring("/li"); if (codeview) { cmdbuf.writestring("/co"); if (codeview3) cmdbuf.writestring(":3"); } #else if (global.params.symdebug) cmdbuf.writestring("/co"); #endif cmdbuf.writestring("/noi"); for (i = 0; i < global.params.linkswitches->dim; i++) { cmdbuf.writestring((char *) global.params.linkswitches->data[i]); } cmdbuf.writeByte(';'); p = cmdbuf.toChars(); char *linkcmd = getenv("LINKCMD"); if (!linkcmd) linkcmd = "link"; status = executecmd(linkcmd, p, 1); return status; #elif linux pid_t childpid; int i; int status; // Build argv[] Array argv; char *cc = getenv("CC"); if (!cc) cc = "gcc"; argv.push((void *)cc); argv.insert(1, global.params.objfiles); // None of that a.out stuff. Use explicit exe file name, or // generate one from name of first source file. argv.push((void *)"-o"); if (global.params.exefile) { argv.push(global.params.exefile); } else { // Generate exe file name from first obj name char *n = (char *)global.params.objfiles->data[0]; char *e; char *ex; n = FileName::name(n); e = FileName::ext(n); if (e) { e--; // back up over '.' ex = (char *)mem.malloc(e - n + 1); memcpy(ex, n, e - n); ex[e - n] = 0; } else ex = (char *)"a.out"; // no extension, so give up argv.push(ex); global.params.exefile = ex; } argv.insert(argv.dim, global.params.libfiles); if (global.params.symdebug) argv.push((void *)"-g"); argv.push((void *)"-m32"); argv.push((void *)"-lphobos"); // turns into /usr/lib/libphobos.a argv.push((void *)"-lpthread"); argv.push((void *)"-lm"); if (0 && global.params.exefile) { /* This switch enables what is known as 'smart linking' * in the Windows world, where unreferenced sections * are removed from the executable. It eliminates unreferenced * functions, essentially making a 'library' out of a module. * Although it is documented to work with ld version 2.13, * in practice it does not, but just seems to be ignored. * Thomas Kuehne has verified that it works with ld 2.16.1. * BUG: disabled because it causes exception handling to fail */ argv.push((void *)"-Xlinker"); argv.push((void *)"--gc-sections"); } for (i = 0; i < global.params.linkswitches->dim; i++) { argv.push((void *)"-Xlinker"); argv.push((void *) global.params.linkswitches->data[i]); } if (!global.params.quiet) { // Print it for (i = 0; i < argv.dim; i++) printf("%s ", (char *)argv.data[i]); printf("\n"); fflush(stdout); } argv.push(NULL); childpid = fork(); if (childpid == 0) { execvp((char *)argv.data[0], (char **)argv.data); perror((char *)argv.data[0]); // failed to execute return -1; } waitpid(childpid, &status, 0); status=WEXITSTATUS(status); if (status) printf("--- errorlevel %d\n", status); return status; #else printf ("Linking is not yet supported for this version of DMD.\n"); return -1; #endif }
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()); this->arg = filename; md = NULL; errors = 0; numlines = 0; members = NULL; isHtml = 0; isDocFile = 0; needmoduleinfo = 0; #ifdef IN_GCC strictlyneedmoduleinfo = 0; #endif selfimports = 0; insearch = 0; searchCacheIdent = NULL; searchCacheSymbol = NULL; searchCacheFlags = 0; semanticstarted = 0; semanticRun = 0; decldefs = NULL; vmoduleinfo = NULL; massert = NULL; munittest = NULL; marray = NULL; sictor = NULL; sctor = NULL; sdtor = NULL; ssharedctor = NULL; sshareddtor = NULL; stest = NULL; sfilename = NULL; root = 0; importedFrom = NULL; srcfile = NULL; docfile = NULL; debuglevel = 0; debugids = NULL; debugidsNot = NULL; versionlevel = 0; versionids = NULL; versionidsNot = NULL; macrotable = NULL; escapetable = NULL; safe = FALSE; doppelganger = 0; cov = NULL; covb = NULL; nameoffset = 0; namelen = 0; srcfilename = FileName::defaultExt(filename, global.mars_ext); if (!srcfilename->equalsExt(global.mars_ext) && !srcfilename->equalsExt(global.hdr_ext) && !srcfilename->equalsExt("dd")) { if (srcfilename->equalsExt("html") || srcfilename->equalsExt("htm") || srcfilename->equalsExt("xhtml")) { if (!global.params.useDeprecated) error("html source files is deprecated %s", srcfilename->toChars()); isHtml = 1; } else { error("source file name '%s' must have .%s extension", srcfilename->toChars(), global.mars_ext); fatal(); } } 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, 0); else objfilename = FileName::forceExt(argobj, global.obj_ext); symfilename = FileName::forceExt(filename, global.sym_ext); srcfile = new File(srcfilename); if (doDocComment) { setDocfile(); } if (doHdrGen) { setHdrfile(); } objfile = new File(objfilename); symfile = new File(symfilename); }