summaryrefslogtreecommitdiffstats
path: root/tools/voicefont.c
diff options
context:
space:
mode:
Diffstat (limited to 'tools/voicefont.c')
-rw-r--r--tools/voicefont.c29
1 files changed, 21 insertions, 8 deletions
diff --git a/tools/voicefont.c b/tools/voicefont.c
index b732f49c07..82ab537b73 100644
--- a/tools/voicefont.c
+++ b/tools/voicefont.c
@@ -29,8 +29,9 @@
#include <stdio.h>
#include <string.h>
-#define HEADER_SIZE 20
-
+#define HEADER_SIZE (20)
+#define MAX_NAME_LEN (80)
+#define MAX_VOICE_ENTRIES (2048)
/* endian conversion macros */
#if defined(__BIG_ENDIAN__)
#define UINT_TO_BE(x) (x)
@@ -47,11 +48,11 @@ int voicefont(FILE* voicefontids,int targetnum,char* filedir, FILE* output, unsi
int i,j;
/* two tables, one for normal strings, one for voice-only (>0x8000) */
- static char names[1000][80]; /* worst-case space */
- char name[80]; /* one string ID */
- static int pos[1000]; /* position of sample */
- static int size[1000]; /* length of clip */
- int voiceonly[1000]; /* flag if this is voice only */
+ static char names[MAX_VOICE_ENTRIES][MAX_NAME_LEN]; /* worst-case space */
+ char name[MAX_NAME_LEN]; /* one string ID */
+ static int pos[MAX_VOICE_ENTRIES]; /* position of sample */
+ static int size[MAX_VOICE_ENTRIES]; /* length of clip */
+ int voiceonly[MAX_VOICE_ENTRIES]; /* flag if this is voice only */
int count = 0;
int count_voiceonly = 0;
unsigned int value; /* value to be written to file */
@@ -86,6 +87,11 @@ int voicefont(FILE* voicefontids,int targetnum,char* filedir, FILE* output, unsi
}
fclose(voicefontids);
+ if (count > MAX_VOICE_ENTRIES)
+ {
+ return -1;
+ }
+
fseek(output, HEADER_SIZE + count*8, SEEK_SET); /* space for header */
for (i=0; i<count; i++)
@@ -161,6 +167,9 @@ int voicefont(FILE* voicefontids,int targetnum,char* filedir, FILE* output, unsi
fwrite(&value, sizeof(value), 1,output);
value = UINT_TO_BE(size[i]); /* size */
fwrite(&value, sizeof(value), 1, output);
+ printf(": [%d]%s : %s {%x, %x}\n", i,
+ (voiceonly[i] ==1 ? "[V]":""), names[i],
+ UINT_TO_BE(pos[i]), UINT_TO_BE(size[i])); /* debug */
} /* for i */
} /* for j */
@@ -199,7 +208,11 @@ int main (int argc, char** argv)
return -2;
}
- voicefont(ids, atoi(argv[2]),argv[3],output, 400);
+ if (voicefont(ids, atoi(argv[2]),argv[3],output, 400) < 0)
+ {
+ printf("Error too many voicefont entries!\n");
+ return -3;
+ }
return 0;
}
#endif