diff options
Diffstat (limited to 'Build/source/texk/musixtnt/musixtnt-src/msxlint.c')
-rw-r--r-- | Build/source/texk/musixtnt/musixtnt-src/msxlint.c | 422 |
1 files changed, 0 insertions, 422 deletions
diff --git a/Build/source/texk/musixtnt/musixtnt-src/msxlint.c b/Build/source/texk/musixtnt/musixtnt-src/msxlint.c deleted file mode 100644 index 86a5d1f2317..00000000000 --- a/Build/source/texk/musixtnt/musixtnt-src/msxlint.c +++ /dev/null @@ -1,422 +0,0 @@ -char version[12] = "2016-01-30"; - -/* Copyright (C) 2014-16 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. - */ - -/* msxlint - detects incorrectly formatted notes lines - * in a MusiXTeX source file. - * - * Usage: msxlint [-v | --version | -h | --help] - * msxlint [-d | --debug] { infile[.tex] } ... - * - */ - - -# include "utils.h" - -PRIVATE int debug = 0; -PRIVATE char infilename[LINE_LEN]; -PRIVATE char *infilename_n = infilename; - -PRIVATE FILE *infile; - -PRIVATE char line[LINE_LEN]; /* line of input */ -PRIVATE int lineno; /* line number */ -PRIVATE int ninstr; /* number of instruments */ -PRIVATE int staffs[12]; /* staffs[i] is the number of staffs - for instrument i */ -PRIVATE char terminator[8]; /* "\en" or "\enotes" or "" (either) */ -PRIVATE int nerrors; /* number of error messages */ -# define NERRORSMAX 10 - -PRIVATE void -checkc (char *s, char c) -{ if (*s != c) - printf ("Expected %c but found %c in line %d:\n%s\n", c, *s, lineno, line); -} - -PRIVATE void -checkn (char *s) -{ if (strpbrk (s, "0123456789") != s) - printf ("Expected digit but found %c in line %d:\n%s\n", *s, lineno, line); -} - -PRIVATE void -usage (void) -{ - puts ("Usage: msxlint [-v | --version | -h | --help]"); - puts (" msxlint [-d | --debug] ... { infile[.tex] } ..."); -} - -PRIVATE void -analyze_notes ( char **ln) { - int i,j; - int newlines = 0; - char *s; char *t; - s = strpbrk (*ln+1, "|&\\\n"); /* skip initial command */ - while (true) - { /* look for \en */ - t = strstr(s, "\\en"); - if (t != NULL) break; - else - /* replace EOL by a blank and append another line of input */ - { char new_line[LINE_LEN]; - if (debug > 2) printf (" Reading additional line of input:\n"); - if ( fgets (new_line, LINE_LEN, infile) == NULL) - error("Unexpected EOF."); - if ( (t = strchr (s, '\n')) == NULL ) - error("Missing EOL."); - *t = ' '; - t++; - *t = '\0'; - if (append (line, &t, new_line, LINE_LEN) >= LINE_LEN) - error ("Line too Long."); - if (debug > 2) printf (" %s\n", t+1); - newlines++; - } - } - for (i=1; i <= ninstr; i++) - { - for (j=1; j < staffs[i]; j++) - { s = strpbrk (s, "|&"); - if (s == NULL || *s == '&' || s > t) - { - printf ("Too few staffs for instrument %d in notes on line %d:\n%s", i, lineno, line); - nerrors++; - *ln = t+3; - return; - } - checkc (s, '|'); s++; - } - if (i == ninstr) break; - s = strpbrk (s, "&|"); - if (s == NULL || s > t) - { - printf ("Too few instruments in notes on line %d:\n%s", lineno, line); - nerrors++; - *ln = t+3; - return; - } - if (*s == '|') - { - printf ("Too many staffs for instrument %d in notes on line %d:\n%s", i, lineno, line); - nerrors++; - *ln = t+3; - return; - } - checkc (s, '&'); s++; - } - s = strpbrk (s, "|&"); - if (s != NULL && s < t) - { - printf ("Too many fields in notes on line %d:\n%s", lineno, line); - nerrors++; - *ln = t+3; - return; - } - s = t; /* \en */ - if (terminator[0] != '\0') - { if (!prefix (terminator, s) ) - { - printf ("Expected %s at end of notes on line %d:\n%s", terminator, lineno, line); - nerrors++; - t = strchr(s, '\\'); - if (t == NULL) t = *ln + strlen (*ln); - *ln = t; - return; - } - if ( terminator[3] == '\0' && prefix ("otes", s+3) ) - { - printf ("Expected %s at end of notes on line %d:\n%s", terminator, lineno, line); - nerrors++; - t = strchr(s, '\\'); - if (t == NULL) t = *ln + strlen (*ln); - *ln = t; - return; - } - } - lineno = lineno + newlines; - t = strchr(s+1, '\\'); - if (t == NULL) t = *ln + strlen (*ln); - *ln = t; - return; -} - -PRIVATE void -process_command (char **ln) -{ char *s, *t; - if ( prefix("\\instrumentnumber", *ln) ) - { - if (debug > 1) printf ("%s\n", " Processing \\instrumentnumber"); - s = strpbrk (*ln, "123456789"); - if ( s == NULL ) error ("\\instrumentnumber command unreadable."); - ninstr = atoi (s); - t = strpbrk (*ln+1, "\\"); - if (t == NULL) - { *ln = *ln + strlen (*ln); return; } - *ln = t; - } - - if ( prefix("\\def\\nbinstrument", *ln) ) - { - if (debug > 1) printf ("%s\n", " Processing \\def\\nbinstrument"); - s = strpbrk (*ln, "123456789"); - if ( s == NULL ) error ("\\def\\nbinstrument command unreadable."); - ninstr = atoi (s); - t = strpbrk (*ln+1, "\\"); - if (t == NULL) - { *ln = *ln + strlen (*ln); return; } - *ln = t; - } - - else if ( prefix("\\setstaffs", *ln) ) - { - int n, p; - if (debug > 1) printf ("%s\n", " Processing \\setstaffs"); - s = strpbrk (*ln, "123456789"); - if ( s == NULL ) error ("\\setstaffs command unreadable."); - n = (int)(*s) - (int)('0'); /* instrument number */ - s = strpbrk (s+1, "123456789"); - if ( s == NULL ) error ("\\setstaffs command unreadable."); - p = (int)(*s) - (int)('0'); /* number of staffs */ - staffs[n] = p; - t = strpbrk (*ln+1, "\\"); - if (t == NULL) - { *ln = *ln + strlen (*ln); return; } - *ln = t; - } - - else if ( prefix("\\def\\vnotes#1\\elemskip", *ln) ) - { - if (debug > 1) printf ("%s\n", " Processing \\def\\vnotes"); - s = *ln + 22; /* first parameter */ - ninstr = 0; - while (true) - { ninstr++; - staffs[ninstr] = 1; - checkc (s, '#'); s++; - checkn (s); s++; - while (*s == '|') - { staffs[ninstr]++; - checkc (s, '|'); s++; - checkc (s, '#'); s++; - checkn (s); s++; - } - if (*s != '&') break; - checkc (s, '&'); s++; - } - t = &terminator[0]; - while (*s != '{') - { *t = *s; s++; t++; } - *t = '\0'; - *ln = strchr (*ln, '}') ; - (*ln)++; - } - - else if ( prefix("\\TransformNotes", *ln) ) - { - if (debug > 1) printf ("%s\n", " Processing \\TransformNotes"); - s = *ln + 16; /* first parameter */ - ninstr = 0; - while (true) - { ninstr++; - staffs[ninstr] = 1; - checkc (s, '#'); s++; - checkn (s); s++; - while (*s == '|') - { staffs[ninstr]++; - checkc (s, '|'); s++; - checkc (s, '#'); s++; - checkn (s); s++; - } - if (*s != '&') break; - checkc (s, '&'); s++; - } - t = &terminator[0]; - terminator[0] = '\0'; - append ( t, &t, "\\en", sizeof (terminator) ); - do s++; while (*s != '{'); - *ln = strchr (s, '}') ; - if (*ln == NULL) error ("Can't find '}' after \\TransformNotes."); - (*ln)++; - } - - else if ( prefix("\\notes", *ln) || - prefix("\\Notes", *ln) || - prefix("\\NOtes", *ln) || - prefix("\\NOTes", *ln) || - prefix("\\NOTEs", *ln) || - prefix("\\nnotes", *ln) || - prefix("\\vnotes", *ln) || - prefix("\\znotes", *ln) - ) - { - if (debug > 1) printf ("%s\n", " Processing notes"); - analyze_notes (ln); - t = strpbrk (*ln, "\\\n"); - if (t == NULL) - { *ln = *ln + strlen (*ln); return; } - *ln = t; - } - - else if ( prefix("\\def\\atnextbar", *ln)) - { - if (debug > 1) printf ("%s\n", " Processing \\def\\atnextbar"); - s = strstr (*ln, "\\znotes"); - if (s != NULL) - { - *ln = s; - analyze_notes (ln); - } - t = strpbrk (*ln, "\\"); - if (t == NULL) - { *ln = *ln + strlen (*ln); return; } - *ln = t; - } - - else if ( prefix("\\def", *ln) ) - *ln = *ln + strlen (*ln); - - else /* anything else */ - { - if (debug > 1) printf (" Processing "); - t = strpbrk (*ln+1, "\\\n"); - if (t == NULL) t = *ln + strlen (*ln); - if (debug > 1) - { char *s = *ln; do {putchar (*s); s++;} while (s != t); puts ("");} - *ln = t; - } -} - -PRIVATE void -process_line (void) -{ - char *ln; - ln = &line[0]; - while ( *ln != '\0') - { - while (*ln == ' ') { ln++;} - if (*ln == '%' || *ln == '\n') return; - process_command (&ln); - } /* *ln == '\0' */ -} - -PRIVATE void -process_score (void) -/* process .tex file */ -{ - int c; int i; - lineno = 0; - ninstr = 1; - nerrors = 0; - staffs[0] = 0; - for (i = 1; i<12; i++) staffs[i] = 1; - terminator[0] = '\0'; /* either \en or \enotes */ - while ( (c = getc (infile)) != EOF ) - { - ungetc (c, infile); - if (fgets(line, LINE_LEN, infile) == NULL) error("IO error"); - if (strlen (line) == LINE_LEN-1) error("Line too long."); - lineno++; - if (debug > 0) printf ("Processing line %d.\n", lineno); - process_line (); - if (nerrors > NERRORSMAX) { - puts ("\nToo many errors; processing of this file aborted."); - return; - } - } /* c == EOF */ -} - - -int -main (int argc, char *argv[]) -{ - int c; - char today[12]; - time_t mytime; -# define NOPTS 4 - struct option longopts[NOPTS] = - { { "help", 0, NULL, 'h'}, - { "version", 0, NULL, 'v'}, - { "debug", 0, NULL, 'd'}, - { NULL, 0, NULL, 0} - }; - - time (&mytime); - strftime (today, 11, "%Y-%m-%d", localtime (&mytime) ); - printf ("This is msxlint, version %s.\n", version); - c = getopt_long (argc, argv, "hvd", longopts, NULL); - while (c != -1) - { - switch (c) - { - case 'h': - usage (); - puts ( "Please report bugs to rdt@cs.queensu.ca." ); - exit (0); - case 'v': - exit (0); - case 'd': - debug++; - break; - case '?': - exit (EXIT_FAILURE); - default: - fprintf (stderr,"Function getopt returned character code 0%o.\n", - (unsigned int) c); - exit (EXIT_FAILURE); - } - c = getopt_long (argc, argv, "hvd", longopts, NULL); - } - puts ( "Copyright (C) 2014-16 R. D. Tennent" ); - puts ( "School of Computing, Queen's University, rdt@cs.queensu.ca" ); - puts ( "License GNU GPL version 2 or later <http://gnu.org/licences/gpl.html>." ); - puts ( "There is NO WARRANTY, to the extent permitted by law." ); - - if (optind == argc) - { - infile = stdin; - printf ("\nProcessing stdin.\n\n"); - process_score (); - } - else - do - { - infilename[0] = '\0'; - infilename_n = infilename; - append (infilename, &infilename_n, argv[optind], sizeof (infilename)); - if (!suffix (".tex", infilename)) - append (infilename, &infilename_n, ".tex", sizeof (infilename)); - infile = fopen (infilename, "r"); - if (infile == NULL) - { - fprintf (stderr,"Can't open %s\n", infilename); - optind++; - continue; - } - printf ("\nProcessing %s.\n\n", infilename); - process_score (); - optind++; - } - while (optind < argc); - - return 0; -} |