summaryrefslogtreecommitdiff
path: root/nasmlib
diff options
context:
space:
mode:
authorH. Peter Anvin <hpa@zytor.com>2017-04-23 23:52:32 -0700
committerH. Peter Anvin <hpa@zytor.com>2017-04-23 23:52:32 -0700
commite0172d58706ccbe740bd153c38da42d18f306ade (patch)
tree44c64d97aff1e1a3f7871443f058e1c37068347e /nasmlib
parent28b588b91e8afc7d31e6d7c2560e214f049801a3 (diff)
parent4b177bfb0373e7c8309be5841d9a13664b643d22 (diff)
downloadnasm-e0172d58706ccbe740bd153c38da42d18f306ade.tar.gz
Merge branch 'master' into elf
Diffstat (limited to 'nasmlib')
-rw-r--r--nasmlib/path.c171
-rw-r--r--nasmlib/saa.c15
2 files changed, 185 insertions, 1 deletions
diff --git a/nasmlib/path.c b/nasmlib/path.c
new file mode 100644
index 00000000..fd7ea132
--- /dev/null
+++ b/nasmlib/path.c
@@ -0,0 +1,171 @@
+/* ----------------------------------------------------------------------- *
+ *
+ * Copyright 2017 The NASM Authors - All Rights Reserved
+ * See the file AUTHORS included with the NASM distribution for
+ * the specific copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+ * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+ * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * ----------------------------------------------------------------------- */
+
+/*
+ * path.c - host operating system specific pathname manipulation functions
+ */
+
+#include "compiler.h"
+#include "nasmlib.h"
+#include "error.h"
+
+#if defined(unix) || defined(__unix) || defined(__unix__)
+# define separators "/"
+# define cleandirend "/"
+# define catsep '/'
+# define leaveonclean 1
+# define curdir "."
+#elif defined(__MSDOS__) || defined(__WINDOWS__) || \
+ defined(__OS2__) || defined(_WIN16) || defined(_WIN32)
+# define separators "/\\:"
+# define cleandirend "/\\"
+# define catsep '\\'
+# define leaveonclean 2 /* Leave \\ at the start alone */
+# define curdir "."
+#elif defined(Macintosh) /* MacOS classic? */
+# define separators ":"
+# define curdir ":"
+# define catsep ':'
+# define cleandirend ":"
+# define leaveonclean 0
+# define leave_leading 1
+#elif defined(__VMS)
+/*
+ * VMS filenames may have ;version at the end. Assume we should count that
+ * as part of the filename anyway.
+ */
+# define separators ":]"
+# define curdir "[]"
+#else
+/* No idea what to do here, do nothing. Feel free to add new ones. */
+# define curdir ""
+#endif
+
+/*
+ * This is an inline, because most compilers can greatly simplify this
+ * for a fixed string, like we have here.
+ */
+static inline bool ismatch(const char *charset, char ch)
+{
+ const char *p;
+
+ for (p = charset; *p; p++) {
+ if (ch == *p)
+ return true;
+ }
+
+ return false;
+}
+
+static const char *first_filename_char(const char *path)
+{
+#ifdef separators
+ const char *p = path + strlen(path);
+
+ while (p > path) {
+ if (!ismatch(separators, p[-1]))
+ return p;
+ p--;
+ }
+
+ return p;
+#else
+ return path;
+#endif
+}
+
+/* Return the filename portion of a PATH as a new string */
+char *nasm_basename(const char *path)
+{
+ return nasm_strdup(first_filename_char(path));
+}
+
+/* Return the directory name portion of a PATH as a new string */
+char *nasm_dirname(const char *path)
+{
+ const char *p = first_filename_char(path);
+ const char *p0 = p;
+ (void)p0; /* Don't warn if unused */
+
+ if (p == path)
+ return nasm_strdup(curdir);
+
+#ifdef cleandirend
+ while (p > path+leaveonclean) {
+ if (ismatch(cleandirend, p[-1]))
+ break;
+ p--;
+ }
+#endif
+
+#ifdef leave_leading
+ /* If the directory contained ONLY separators, leave as-is */
+ if (p == path+leaveonclean)
+ p = p0;
+#endif
+
+ return nasm_strndup(path, p-path);
+}
+
+/*
+ * Concatenate a directory path and a filename. Note that this function
+ * currently does NOT handle the case where file itself contains
+ * directory components (except on Unix platforms, because it is trivial.)
+ */
+char *nasm_catfile(const char *dir, const char *file)
+{
+#ifndef catsep
+ return nasm_strcat(dir, file);
+#else
+ size_t dl = strlen(dir);
+ size_t fl = strlen(file);
+ char *p;
+ bool dosep = true;
+
+ if (!dl || ismatch(separators, dir[dl-1])) {
+ /* No separator necessary */
+ dosep = false;
+ }
+
+ p = nasm_malloc(dl + fl + dosep + 1);
+
+ memcpy(p, dir, dl);
+ p += dl;
+ if (dosep)
+ *p++ = catsep;
+
+ memcpy(p, file, fl+1);
+
+ return p;
+#endif
+}
diff --git a/nasmlib/saa.c b/nasmlib/saa.c
index a0350c10..c4af5aa0 100644
--- a/nasmlib/saa.c
+++ b/nasmlib/saa.c
@@ -1,6 +1,6 @@
/* ----------------------------------------------------------------------- *
*
- * Copyright 1996-2009 The NASM Authors - All Rights Reserved
+ * Copyright 1996-2017 The NASM Authors - All Rights Reserved
* See the file AUTHORS included with the NASM distribution for
* the specific copyright holders.
*
@@ -149,6 +149,19 @@ void saa_wbytes(struct SAA *s, const void *data, size_t len)
}
}
+/*
+ * Writes a string, *including* the final null, to the specified SAA,
+ * and return the number of bytes written.
+ */
+size_t saa_wcstring(struct SAA *s, const char *str)
+{
+ size_t bytes = strlen(str) + 1;
+
+ saa_wbytes(s, str, bytes);
+
+ return bytes;
+}
+
void saa_rewind(struct SAA *s)
{
s->rblk = s->blk_ptrs;