/* Compiler implementation of the D programming language * Copyright (C) 1999-2019 by The D Language Foundation, All Rights Reserved * written by Walter Bright * http://www.digitalmars.com * Distributed under the Boost Software License, Version 1.0. * http://www.boost.org/LICENSE_1_0.txt */ #include "root/dsystem.h" #include "mars.h" #include "globals.h" #include "root/file.h" #include "root/filename.h" #include "root/outbuffer.h" #include "root/rmem.h" /** * Normalize path by turning forward slashes into backslashes * * Params: * src = Source path, using unix-style ('/') path separators * * Returns: * A newly-allocated string with '/' turned into backslashes */ const char * toWinPath(const char *src) { if (src == NULL) return NULL; char *result = mem.xstrdup(src); char *p = result; while (*p != '\0') { if (*p == '/') *p = '\\'; p++; } return result; } /** * Reads a file, terminate the program on error * * Params: * loc = The line number information from where the call originates * f = a `ddmd.root.file.File` handle to read */ void readFile(Loc loc, File *f) { if (f->read()) { error(loc, "Error reading file '%s'", f->name->toChars()); fatal(); } } /** * Writes a file, terminate the program on error * * Params: * loc = The line number information from where the call originates * f = a `ddmd.root.file.File` handle to write */ void writeFile(Loc loc, File *f) { if (f->write()) { error(loc, "Error writing file '%s'", f->name->toChars()); fatal(); } } /** * Ensure the root path (the path minus the name) of the provided path * exists, and terminate the process if it doesn't. * * Params: * loc = The line number information from where the call originates * name = a path to check (the name is stripped) */ void ensurePathToNameExists(Loc loc, const char *name) { const char *pt = FileName::path(name); if (*pt) { if (FileName::ensurePathExists(pt)) { error(loc, "cannot create directory %s", pt); fatal(); } } FileName::free(pt); } /** * Takes a path, and escapes '(', ')' and backslashes * * Params: * buf = Buffer to write the escaped path to * fname = Path to escape */ void escapePath(OutBuffer *buf, const char *fname) { while (1) { switch (*fname) { case 0: return; case '(': case ')': case '\\': buf->writeByte('\\'); /* fall through */ default: buf->writeByte(*fname); break; } fname++; } }