summaryrefslogtreecommitdiff
path: root/Build/source/texk/musixtnt/musixtnt-2015-02-09/utils.c
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/texk/musixtnt/musixtnt-2015-02-09/utils.c')
-rw-r--r--Build/source/texk/musixtnt/musixtnt-2015-02-09/utils.c103
1 files changed, 103 insertions, 0 deletions
diff --git a/Build/source/texk/musixtnt/musixtnt-2015-02-09/utils.c b/Build/source/texk/musixtnt/musixtnt-2015-02-09/utils.c
new file mode 100644
index 00000000000..808f43ac3a8
--- /dev/null
+++ b/Build/source/texk/musixtnt/musixtnt-2015-02-09/utils.c
@@ -0,0 +1,103 @@
+/* Copyright (C) 2014-15 R. D. Tennent School of Computing,
+ * Queen's University, rdt@cs.queensu.ca
+ *
+ * This program is free software; you can redistribute it
+ * and/or modify it under the terms of the GNU General
+ * Public License as published by the Free Software
+ * Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will
+ * be useful, but WITHOUT ANY WARRANTY; without even the
+ * implied warranty of MERCHANTABILITY or FITNESS FOR A
+ * PARTICULAR PURPOSE. See the GNU General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU General
+ * Public License along with this program; if not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street,
+ * Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* utils.c - utilities for fixmsxpart.c and msxlint.c
+ */
+
+# include "utils.h"
+
+void
+warning (const char msg[]) /* output warning message msg to stderr */
+{
+ fprintf (stderr, "Warning: %s\n", msg);
+ return;
+}
+
+void
+error (const char msg[]) /* abort with stderr message msg */
+{
+ fprintf (stderr, "Error: %s\n", msg);
+ exit (EXIT_FAILURE);
+}
+
+bool
+prefix (const char *cs, const char *ct)
+/*
+ is string cs[] a prefix of ct[]?
+*/
+{
+ const char *pcs = cs;
+ const char *pct = ct;
+ while (*pcs != '\0')
+ {
+ if (*pcs != *pct) return false;
+ pcs++; pct++;
+ }
+ return true;
+}
+
+bool
+suffix (const char *cs, const char *ct)
+/* is string cs[] a suffix of ct[]? */
+{
+ const char *pcs = cs;
+ const char *pct = ct + strlen (ct) - strlen (cs);
+ while (*pcs != '\0')
+ {
+ if (*pct != *pcs) return false;
+ pcs++; pct++;
+ }
+ return true;
+}
+
+size_t
+append (char *dst, char **offset, const char *src, size_t n)
+/* Copies src to *offset and updates *offset accordingly (if possible).
+ * Assumes *offset is dst if offset == NULL.
+ * Execution aborts if **offset != '\0'. The src string must be null-terminated.
+ * Returns (original offset - dst) + strlen(src); if >= n, the string was truncated.
+ */
+{
+ const char *s = src;
+ char *d;
+ char *off_orig = ( offset != NULL ? *offset : dst );
+ d = off_orig;
+ if (*d != '\0')
+ {
+ char msg[LINE_LEN + 24] = {'\0'};
+ char *msg_n = msg;
+ append (msg, &msg_n, "\nNull character expected at offset specified for string ", sizeof (msg));
+ append (msg, &msg_n, src, sizeof (msg));
+ error (msg);
+ }
+ n = n - 1 - (off_orig - dst); /* number of available slots (leaving room for \0) */
+ while (n > 0 && *s != '\0')
+ {
+ *d = *s; /* copy non-null character */
+ d++; s++; n--;
+ }
+ *d = '\0'; /* null-terminate */
+ if (offset != NULL)
+ *offset = d; /* update *offset (if possible) */
+ while (*s != '\0') /* traverse rest of src */
+ s++;
+ return (off_orig - dst) + (s - src); /* length of the untruncated string */
+}