|
|
@@ -23,6 +23,7 @@ |
|
|
|
#include <string.h> |
|
|
|
#include <ctype.h> |
|
|
|
#include <stdlib.h> |
|
|
|
#include <stdarg.h> |
|
|
|
#include <time.h> |
|
|
|
#if HAVE_STDINT_H |
|
|
|
#include <stdint.h> |
|
|
@@ -801,14 +802,17 @@ static void CompileReport(void) |
|
|
|
fclose(f_report); |
|
|
|
} |
|
|
|
|
|
|
|
static void error(const char *format, const char *string) |
|
|
|
static void error(const char *format, ...) |
|
|
|
{ |
|
|
|
if (string == NULL) |
|
|
|
string = ""; |
|
|
|
va_list args; |
|
|
|
va_start(args, format); |
|
|
|
|
|
|
|
fprintf(f_errors, "%s(%d): ", current_fname, linenum-1); |
|
|
|
fprintf(f_errors, format, string); |
|
|
|
vfprintf(f_errors, format, args); |
|
|
|
fprintf(f_errors, "\n"); |
|
|
|
error_count++; |
|
|
|
|
|
|
|
va_end(args); |
|
|
|
} |
|
|
|
|
|
|
|
static void Error(const char *string) |
|
|
@@ -1057,9 +1061,9 @@ static int NextItem(int type) |
|
|
|
} |
|
|
|
if (!isdigit(*p)) { |
|
|
|
if ((type == tNUMBER) && (*p == '-')) |
|
|
|
error("Expected an unsigned number", NULL); |
|
|
|
error("Expected an unsigned number"); |
|
|
|
else |
|
|
|
error("Expected a number", NULL); |
|
|
|
error("Expected a number"); |
|
|
|
} |
|
|
|
while (isdigit(*p)) { |
|
|
|
acc *= 10; |
|
|
@@ -1090,12 +1094,10 @@ static int NextItemMax(int max) |
|
|
|
{ |
|
|
|
// Get a number, but restrict value to max |
|
|
|
int value; |
|
|
|
char msg[80]; |
|
|
|
|
|
|
|
value = NextItem(tNUMBER); |
|
|
|
if (value > max) { |
|
|
|
sprintf(msg, "Value %d is greater than maximum %d", value, max); |
|
|
|
error(msg, NULL); |
|
|
|
error("Value %d is greater than maximum %d", value, max); |
|
|
|
value = max; |
|
|
|
} |
|
|
|
return value; |
|
|
@@ -1111,7 +1113,7 @@ static int NextItemBrackets(int type, int control) |
|
|
|
|
|
|
|
if ((control & 1) == 0) { |
|
|
|
if (!NextItem(tOPENBRACKET)) |
|
|
|
error("Expected '('", NULL); |
|
|
|
error("Expected '('"); |
|
|
|
} |
|
|
|
|
|
|
|
value = NextItem(type); |
|
|
@@ -1119,7 +1121,7 @@ static int NextItemBrackets(int type, int control) |
|
|
|
return value; |
|
|
|
|
|
|
|
if (item_terminator != ')') |
|
|
|
error("Expected ')'", NULL); |
|
|
|
error("Expected ')'"); |
|
|
|
return value; |
|
|
|
} |
|
|
|
|
|
|
@@ -1483,10 +1485,9 @@ static int LoadWavefile(FILE *f, const char *fname) |
|
|
|
error("Resample command failed: %s", command); |
|
|
|
resample_fails++; |
|
|
|
|
|
|
|
if (sr1 != samplerate_native) { |
|
|
|
sprintf(msg, "Can't resample (%d to %d): %s", sr1, samplerate_native, fname); |
|
|
|
error("%s", msg); |
|
|
|
} else |
|
|
|
if (sr1 != samplerate_native) |
|
|
|
error("Can't resample (%d to %d): %s", sr1, samplerate_native, fname); |
|
|
|
else |
|
|
|
error("WAV file is not mono: %s", fname); |
|
|
|
remove(fname_temp); |
|
|
|
return 0; |
|
|
@@ -1811,17 +1812,17 @@ int CompileSound(int keyword, int isvowel) |
|
|
|
value = NextItemBrackets(tSIGNEDNUMBER, 1); |
|
|
|
if (value > 127) { |
|
|
|
value = 127; |
|
|
|
error("Parameter > 127", NULL); |
|
|
|
error("Parameter > 127"); |
|
|
|
} |
|
|
|
if (value < -128) { |
|
|
|
value = -128; |
|
|
|
error("Parameter < -128", NULL); |
|
|
|
error("Parameter < -128"); |
|
|
|
} |
|
|
|
} else { |
|
|
|
value = NextItemBrackets(tNUMBER, 1); |
|
|
|
if (value > 255) { |
|
|
|
value = 255; |
|
|
|
error("Parameter > 255", NULL); |
|
|
|
error("Parameter > 255"); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
@@ -1863,7 +1864,7 @@ int CompileIf(int elif) |
|
|
|
not_flag = 0; |
|
|
|
word2 = 0; |
|
|
|
if (prog_out >= prog_out_max) { |
|
|
|
error("Phoneme program too large", NULL); |
|
|
|
error("Phoneme program too large"); |
|
|
|
return 0; |
|
|
|
} |
|
|
|
|
|
|
@@ -1899,7 +1900,7 @@ int CompileIf(int elif) |
|
|
|
do { |
|
|
|
data = NextItemBrackets(tNUMBER, brackets); |
|
|
|
if (data > 7) |
|
|
|
error("Expected list of stress levels", NULL); |
|
|
|
error("Expected list of stress levels"); |
|
|
|
bitmap |= (1 << data); |
|
|
|
|
|
|
|
brackets = 3; |
|
|
@@ -1936,7 +1937,7 @@ int CompileIf(int elif) |
|
|
|
finish = 1; |
|
|
|
break; |
|
|
|
default: |
|
|
|
error("Expected AND, OR, THEN", NULL); |
|
|
|
error("Expected AND, OR, THEN"); |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
@@ -1972,7 +1973,7 @@ void FillThen(int add) |
|
|
|
prog_out--; |
|
|
|
} else { |
|
|
|
if (offset > MAX_JUMP) |
|
|
|
error("IF block is too long", NULL); |
|
|
|
error("IF block is too long"); |
|
|
|
*p = i_JUMP_FALSE + offset; |
|
|
|
} |
|
|
|
if_stack[if_level].p_then = NULL; |
|
|
@@ -1987,7 +1988,7 @@ int CompileElse(void) |
|
|
|
USHORT *p; |
|
|
|
|
|
|
|
if (if_level < 1) { |
|
|
|
error("ELSE not expected", NULL); |
|
|
|
error("ELSE not expected"); |
|
|
|
return 0; |
|
|
|
} |
|
|
|
|
|
|
@@ -2011,7 +2012,7 @@ int CompileElse(void) |
|
|
|
int CompileElif(void) |
|
|
|
{ |
|
|
|
if (if_level < 1) { |
|
|
|
error("ELIF not expected", NULL); |
|
|
|
error("ELIF not expected"); |
|
|
|
return 0; |
|
|
|
} |
|
|
|
|
|
|
@@ -2027,7 +2028,7 @@ int CompileEndif(void) |
|
|
|
int offset; |
|
|
|
|
|
|
|
if (if_level < 1) { |
|
|
|
error("ENDIF not expected", NULL); |
|
|
|
error("ENDIF not expected"); |
|
|
|
return 0; |
|
|
|
} |
|
|
|
|
|
|
@@ -2039,7 +2040,7 @@ int CompileEndif(void) |
|
|
|
|
|
|
|
offset = prog_out - p; |
|
|
|
if (offset > MAX_JUMP) |
|
|
|
error("IF block is too long", NULL); |
|
|
|
error("IF block is too long"); |
|
|
|
*p = i_JUMP + offset; |
|
|
|
|
|
|
|
p -= chain; |
|
|
@@ -2216,7 +2217,7 @@ int CompilePhoneme(int compile_phoneme) |
|
|
|
} else { |
|
|
|
// declare a procedure |
|
|
|
if (n_procs >= N_PROCS) { |
|
|
|
error("Too many procedures", NULL); |
|
|
|
error("Too many procedures"); |
|
|
|
return 0; |
|
|
|
} |
|
|
|
strcpy(proc_names[n_procs], item_string); |
|
|
@@ -2236,7 +2237,7 @@ int CompilePhoneme(int compile_phoneme) |
|
|
|
while (!endphoneme && !feof(f_in)) { |
|
|
|
if ((keyword = NextItem(tKEYWORD)) < 0) { |
|
|
|
if (keyword == -2) { |
|
|
|
error("Missing 'endphoneme' before end-of-file", NULL); // end of file |
|
|
|
error("Missing 'endphoneme' before end-of-file"); // end of file |
|
|
|
break; |
|
|
|
} |
|
|
|
error("Bad keyword in phoneme definition '%s'", item_string); |
|
|
@@ -2380,7 +2381,7 @@ int CompilePhoneme(int compile_phoneme) |
|
|
|
if (phoneme_out->type == phVOWEL) |
|
|
|
phoneme_out->end_type = phcode; |
|
|
|
else if (phcode != phoneme_out->start_type) |
|
|
|
error("endtype must equal starttype for consonants", NULL); |
|
|
|
error("endtype must equal starttype for consonants"); |
|
|
|
break; |
|
|
|
case kVOICINGSWITCH: |
|
|
|
phcode = NextItem(tPHONEMEMNEM); |
|
|
@@ -2392,7 +2393,7 @@ int CompilePhoneme(int compile_phoneme) |
|
|
|
value = NextItem(tNUMBER); |
|
|
|
phoneme_out->std_length = value; |
|
|
|
if (prog_out > prog_buf) { |
|
|
|
error("stress phonemes can't contain program instructions", NULL); |
|
|
|
error("stress phonemes can't contain program instructions"); |
|
|
|
prog_out = prog_buf; |
|
|
|
} |
|
|
|
break; |
|
|
@@ -2466,7 +2467,7 @@ int CompilePhoneme(int compile_phoneme) |
|
|
|
case kENDPROCEDURE: |
|
|
|
endphoneme = 1; |
|
|
|
if (if_level > 0) |
|
|
|
error("Missing ENDIF", NULL); |
|
|
|
error("Missing ENDIF"); |
|
|
|
if ((prog_out > prog_buf) && (if_stack[0].returned == 0)) |
|
|
|
*prog_out++ = i_RETURN; |
|
|
|
break; |
|
|
@@ -2476,11 +2477,11 @@ int CompilePhoneme(int compile_phoneme) |
|
|
|
} |
|
|
|
|
|
|
|
if (endphoneme != 1) |
|
|
|
error("'endphoneme' not expected here", NULL); |
|
|
|
error("'endphoneme' not expected here"); |
|
|
|
|
|
|
|
if (compile_phoneme) { |
|
|
|
if (phoneme_out->type == phINVALID) { |
|
|
|
error("Phoneme type is missing", NULL); |
|
|
|
error("Phoneme type is missing"); |
|
|
|
phoneme_out->type = 0; |
|
|
|
} |
|
|
|
phoneme_out->phflags = place_articulation << 16; |
|
|
@@ -2589,8 +2590,8 @@ static void EndPhonemeTable() |
|
|
|
// check that all referenced phonemes have been declared |
|
|
|
for (ix = 0; ix < n_phcodes; ix++) { |
|
|
|
if (phoneme_tab2[ix].type == phINVALID) { |
|
|
|
fprintf(f_errors, "%3d: Phoneme [%s] not declared, referenced at line %d\n", linenum, |
|
|
|
WordToString(phoneme_tab2[ix].mnemonic), (int)(phoneme_tab2[ix].program)); |
|
|
|
error("Phoneme [%s] not declared, referenced at line %d", |
|
|
|
WordToString(phoneme_tab2[ix].mnemonic), (int)(phoneme_tab2[ix].program)); |
|
|
|
error_count++; |
|
|
|
phoneme_tab2[ix].type = 0; // prevent the error message repeating |
|
|
|
} |
|
|
@@ -2719,7 +2720,7 @@ static void CompileEquivalents() |
|
|
|
} |
|
|
|
|
|
|
|
if (p_equivalence > &equivalence_buf[sizeof(equivalence_buf) - 16]) { |
|
|
|
error("'equivalents' tables are too large", NULL); |
|
|
|
error("'equivalents' tables are too large"); |
|
|
|
break; |
|
|
|
} |
|
|
|
|