diff options
Diffstat (limited to 'Build/source/utils/m-tx/mtx-src/globals.c')
-rw-r--r-- | Build/source/utils/m-tx/mtx-src/globals.c | 329 |
1 files changed, 329 insertions, 0 deletions
diff --git a/Build/source/utils/m-tx/mtx-src/globals.c b/Build/source/utils/m-tx/mtx-src/globals.c new file mode 100644 index 00000000000..1e5a27d93c6 --- /dev/null +++ b/Build/source/utils/m-tx/mtx-src/globals.c @@ -0,0 +1,329 @@ +/* Output from p2c 1.21alpha-07.Dec.93, the Pascal-to-C translator */ +/* From input file "globals.pas" */ + + + +#include "p2c.h" + +#define GLOBALS_G +#include "globals.h" + + +Char double_comment[3] = "%%"; +Char durations[ndurs + 1] = "90248136"; +Char terminators[256] = ".x"; +Char has_duration[9] = "abcdefgr"; +Char solfa_names[8] = "drmfslt"; +Char choice = ' '; +boolean outfile_open = false; +Char texdir[256] = ""; +Char old_meter_word[256] = ""; +short outlen = 0; +boolean ignore_input = false; + +#ifndef STRINGS_H +#include "strings.h" +#endif + +#ifndef CONTROL_H +#include "control.h" +#endif + +#ifndef UTILITY_H +#include "utility.h" +#endif + + +boolean isNoteOrRest(Char *w) +{ + return (pos1(w[0], has_duration) > 0); +} + + +boolean isPause(Char *note) +{ + return (startsWith(note, pause)); +} + + +void cancel(short *num, short *denom, short lowest) +{ + while (((*num) & 1) == 0 && *denom > lowest) { + *num /= 2; + *denom /= 2; + } +} + + +Char *meterWord(Char *Result, short num, short denom, short pnum, + short pdenom) +{ + Char STR1[256], STR2[256], STR4[256], STR5[256]; + + sprintf(Result, "m%s/%s/%s/%s", + toString(STR1, num), toString(STR2, denom), toString(STR4, pnum), + toString(STR5, pdenom)); + return Result; +} + + +Char *meterChange(Char *Result, short n1, short n2, boolean blind) +{ + short f = 64; + short l; + + if (!blind) + return (meterWord(Result, n1, PMXmeterdenom(n2), 0, 0)); + /* CMO: process denominator value with function PMXmeterdenom */ + l = n1 * (64 / n2); + cancel(&l, &f, meterdenom); + /* CMO: process denominator value with function PMXmeterdenom */ + meterWord(Result, l, PMXmeterdenom(f), 0, 0); + if (meternum > 0) + printf("Blind meter change to %d/%d on line %d\n", l, f, line_no); + return Result; +} + + +void setSpace(Char *line_) +{ + Char line[256]; + short i = 0; + Char word[256]; + + strcpy(line, line_); + while (i < ninstr) { + GetNextWord(word, line, blank, dummy); + if (*word == '\0') + return; + i++; + getNum(word, &nspace[i-1]); + } +} + + +Static void onumber(Char *s, short *j, short *n1) +{ + if (s[*j - 1] == 'o') + *n1 = 1; + else if (s[*j - 1] == '1') { + *n1 = digit(s[*j]) + 10; + (*j)++; + } else + *n1 = digit(s[*j - 1]); + (*j)++; +} + + +Static void extractNumber(Char *s, short *k) +{ + Char w[256]; + + GetNextWord(w, s, '/', dummy); + getNum(w, k); +} + + +Static void readMeter(Char *meter_, short *meternum, short *meterdenom, + short *pmnum, short *pmdenom) +{ + Char meter[256]; + short j; + + strcpy(meter, meter_); + if (meter[0] == 'm') { + if (pos1('/', meter) == 0) { + j = 2; + onumber(meter, &j, meternum); + onumber(meter, &j, meterdenom); + onumber(meter, &j, pmnum); + onumber(meter, &j, pmdenom); + return; + } + predelete(meter, 1); + extractNumber(meter, meternum); + extractNumber(meter, meterdenom); + extractNumber(meter, pmnum); + extractNumber(meter, pmdenom); + return; + } + getTwoNums(meter, meternum, meterdenom); + *pmnum = *meternum; + *pmdenom = *meterdenom; +} + + +void getMeter(Char *line_, short *meternum, short *meterdenom, short *pmnum, + short *pmdenom) +{ + Char line[256]; + Char meter[256]; + Char STR1[256]; + + strcpy(line, line_); + GetNextWord(meter, line, blank, dummy); + if (!strcmp(meter, "C/") || !strcmp(meter, "mC/")) { + *meternum = 2; + *meterdenom = 2; + *pmdenom = 5; + *pmnum = 0; + } else if (!strcmp(meter, "C") || !strcmp(meter, "mC")) { + *meternum = 4; + *meterdenom = 4; + *pmdenom = 6; + *pmnum = 0; + } else + readMeter(meter, meternum, meterdenom, pmnum, pmdenom); + if (*meterdenom == 0) { + sprintf(STR1, "%s: Meter denominator must be nonzero", meter); + error(STR1, print); + } + /* CMO: Convert PMX syntax meter denominator '0' to '1' to be used for + prepmx duration checks */ + /* if meterdenom=0 then meterdenom:=1; */ +} + + +Static short whereInParagraph(short l) +{ + short Result = 0; + short j, FORLIM; + + FORLIM = para_len; + for (j = 1; j <= FORLIM; j++) { + if (orig_line_no[j-1] == l) + return j; + } + return Result; +} + + +void fatalerror(Char *message) +{ + setFeature("ignoreErrors", false); + error(message, !print); +} + + +void error(Char *message, boolean printLine) +{ + short j; + + j = whereInParagraph(line_no); + if (j > 0 && printLine) + puts(orig_P[j-1]); + printf("%s: ERROR on line %d\n", message, line_no); + if (j > 0 && printLine) { + printf("The line has been modified internally to:\n"); + puts(P[j-1]); + } + if (ignoreErrors()) + return; + if (outfile_open) { + if (outfile != NULL) + fclose(outfile); + outfile = NULL; + outfile = fopen(outfile_NAME, "wb"); + if (outfile == NULL) + _EscIO2(FileNotFound, outfile_NAME); + fclose(outfile); + outfile = NULL; + } + if (line_no == 0) + line_no = 10000; + _Escape(line_no); +} + + +void warning(Char *message, boolean printLine) +{ + short j; + + if (line_no <= 0) { + printf("%s: WARNING in preamble\n", message); + return; + } + printf("%s: WARNING on line %d\n", message, line_no); + if (!printLine) + return; + j = whereInParagraph(line_no); + if (j > 0) + puts(P[j-1]); +} + + +short PMXinstr(short stave) +{ + return (ninstr - instr[stave-1] + 1); +} + + +void setDefaultDuration(short meterdenom) +{ + switch (meterdenom) { + + case 1: + default_duration = '0'; + break; + + case 2: + default_duration = '2'; + break; + + case 4: + default_duration = '4'; + break; + + case 8: + default_duration = '8'; + break; + + case 16: + default_duration = '1'; + break; + + case 32: + default_duration = '3'; + break; + + case 64: + default_duration = '6'; + break; + } +} + + +short PMXmeterdenom(short denom) +{ + short Result; + + /* CMO: Convert M-Tx meter denominators to PMX syntax */ + switch (denom) { + + case 1: + Result = 0; + break; + + case 16: + Result = 1; + break; + + case 32: + Result = 3; + break; + + case 64: + Result = 6; + break; + + default: + Result = denom; + break; + } + return Result; +} + + + + +/* End. */ |