summaryrefslogtreecommitdiff
path: root/src/strtab.c
diff options
context:
space:
mode:
authorPepper <pepper@scannerjammer.com>2015-01-16 15:38:48 -0500
committerPepper <pepper@scannerjammer.com>2015-01-16 15:38:48 -0500
commit131832f418372c0654aa4169c4283f863cb96226 (patch)
treec86492441c3de3d13ebe2c2e2d9bc5dcf04aeaf0 /src/strtab.c
first commit
Diffstat (limited to 'src/strtab.c')
-rw-r--r--src/strtab.c109
1 files changed, 109 insertions, 0 deletions
diff --git a/src/strtab.c b/src/strtab.c
new file mode 100644
index 0000000..24ebfc7
--- /dev/null
+++ b/src/strtab.c
@@ -0,0 +1,109 @@
+/*
+ TiMidity++ -- MIDI to WAVE converter and player
+ Copyright (C) 1999-2002 Masanao Izumo <mo@goice.co.jp>
+ Copyright (C) 1995 Tuukka Toivonen <tt@cgs.fi>
+
+ 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+*/
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif /* HAVE_CONFIG_H */
+#include <stdio.h>
+#include <stdlib.h>
+#ifndef NO_STRING_H
+#include <string.h>
+#else
+#include <strings.h>
+#endif
+#include "timidity.h"
+#include "common.h"
+#include "mblock.h"
+#include "strtab.h"
+
+void init_string_table(StringTable *stab)
+{
+ memset(stab, 0, sizeof(StringTable));
+}
+
+StringTableNode *put_string_table(StringTable *stab, char *str, int len)
+{
+ StringTableNode *p;
+
+ p = new_segment(&stab->pool, sizeof(StringTableNode) + len + 1);
+ if(p == NULL)
+ return NULL;
+ p->next = NULL;
+ if(str != NULL)
+ {
+ memcpy(p->string, str, len);
+ p->string[len] = '\0';
+ }
+
+ if(stab->head == NULL)
+ {
+ stab->head = stab->tail = p;
+ stab->nstring = 1;
+ }
+ else
+ {
+ stab->nstring++;
+ stab->tail = stab->tail->next = p;
+ }
+ return p;
+}
+
+char **make_string_array(StringTable *stab)
+{
+ char **table, *u;
+ int i, n, s;
+ StringTableNode *p;
+
+ n = stab->nstring;
+ if(n == 0)
+ return NULL;
+ if((table = (char **)safe_malloc((n + 1) * sizeof(char *))) == NULL)
+ return NULL;
+
+ s = 0;
+ for(p = stab->head; p; p = p->next)
+ s += strlen(p->string) + 1;
+
+ if((u = (char *)safe_malloc(s)) == NULL)
+ {
+ free(table);
+ return NULL;
+ }
+
+ for(i = 0, p = stab->head; p; i++, p = p->next)
+ {
+ int len;
+
+ len = strlen(p->string) + 1;
+ table[i] = u;
+ memcpy(u, p->string, len);
+ u += len;
+ }
+ table[i] = NULL;
+ delete_string_table(stab);
+ return table;
+}
+
+void delete_string_table(StringTable *stab)
+{
+ reuse_mblock(&stab->pool);
+ init_string_table(stab);
+}