summaryrefslogtreecommitdiff
path: root/Build/source/texk/gregorio/gregorio-src/src/dump/dump.c
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/texk/gregorio/gregorio-src/src/dump/dump.c')
-rw-r--r--Build/source/texk/gregorio/gregorio-src/src/dump/dump.c546
1 files changed, 546 insertions, 0 deletions
diff --git a/Build/source/texk/gregorio/gregorio-src/src/dump/dump.c b/Build/source/texk/gregorio/gregorio-src/src/dump/dump.c
new file mode 100644
index 00000000000..5f604b9ba3d
--- /dev/null
+++ b/Build/source/texk/gregorio/gregorio-src/src/dump/dump.c
@@ -0,0 +1,546 @@
+/*
+ * Gregorio is a program that translates gabc files to GregorioTeX.
+ * This file provides functions to dump out Gregorio structures.
+ *
+ * Copyright (C) 2007-2019 The Gregorio Project (see CONTRIBUTORS.md)
+ *
+ * This file is part of Gregorio.
+ *
+ * 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 3 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, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "config.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include "bool.h"
+#include "struct.h"
+#include "unicode.h"
+#include "messages.h"
+#include "plugins.h"
+#include "support.h"
+
+static const char *dump_style_to_string(grestyle_style style)
+{
+ static char buf[50];
+
+ gregorio_snprintf(buf, sizeof buf, "%16s", grestyle_style_to_string(style));
+ return buf;
+}
+
+void dump_write_characters(FILE *const f,
+ const gregorio_character * current_character)
+{
+ while (current_character) {
+ fprintf(f,
+ "---------------------------------------------------------------------\n");
+ if (current_character->is_character) {
+ fprintf(f, " character ");
+ gregorio_print_unichar(f, current_character->cos.character);
+ fprintf(f, "\n");
+ } else {
+ switch (current_character->cos.s.type) {
+ case ST_T_BEGIN:
+ fprintf(f, " beginning of style %s\n",
+ dump_style_to_string(current_character->cos.s.style));
+ break;
+ case ST_T_END:
+ fprintf(f, " end of style %s\n",
+ dump_style_to_string(current_character->cos.s.style));
+ break;
+ default:
+ /* not reachable unless there's a programming error */
+ /* LCOV_EXCL_START */
+ fprintf(f, " !! IMPROPER STYLE !! %s\n",
+ dump_style_to_string(current_character->cos.s.style));
+ break;
+ /* LCOV_EXCL_STOP */
+ }
+ }
+ current_character = current_character->next_character;
+ }
+}
+
+static const char *dump_bool(bool value) {
+ return value? "true" : "false";
+}
+
+static const char *dump_pitch(const char height, const char highest_pitch) {
+ static char buf[20];
+ if (height >= LOWEST_PITCH && height <= highest_pitch) {
+ char pitch = height + 'a' - LOWEST_PITCH;
+ if (pitch == 'o') {
+ pitch = 'p';
+ }
+ gregorio_snprintf(buf, 20, "%c", pitch);
+ } else {
+ /* not reachable unless there's a programming error */
+ gregorio_snprintf(buf, 20, "?%d", height); /* LCOV_EXCL_LINE */
+ }
+ return buf;
+}
+
+static void dump_hepisema_adjustment(FILE *const f, const gregorio_note *note,
+ const gregorio_sign_orientation orientation, const char *const which) {
+ unsigned short index = note->he_adjustment_index[orientation];
+ if (index) {
+ gregorio_hepisema_adjustment *adj = gregorio_get_hepisema_adjustment(
+ index);
+ fprintf(f, " %s hepisema group %d\n", which, index);
+ fprintf(f, " %s hep. vbasepos %d (%s)\n", which,
+ adj->vbasepos,
+ gregorio_hepisema_vbasepos_to_string(adj->vbasepos));
+ if (adj->nudge) {
+ fprintf(f, " %s hepisema nudge %s\n", which, adj->nudge);
+ }
+ }
+}
+
+void dump_write_score(FILE *f, gregorio_score *score)
+{
+ gregorio_voice_info *voice_info = score->first_voice_info;
+ int i;
+ int annotation_num;
+ gregorio_syllable *syllable;
+ gregorio_header *header;
+
+ gregorio_assert(f, dump_write_score, "call with NULL file", return);
+
+ fprintf(f,
+ "=====================================================================\n"
+ " SCORE INFOS\n"
+ "=====================================================================\n");
+ if (score->number_of_voices) {
+ fprintf(f, " number_of_voices %d\n",
+ score->number_of_voices);
+ }
+ if (score->name) {
+ fprintf(f, " name %s\n", score->name);
+ }
+ if (score->gabc_copyright) {
+ fprintf(f, " gabc_copyright %s\n", score->gabc_copyright);
+ }
+ if (score->score_copyright) {
+ fprintf(f, " score_copyright %s\n", score->score_copyright);
+ }
+ if (score->author) {
+ fprintf(f, " author %s\n", score->author);
+ }
+ if (score->mode) {
+ fprintf(f, " mode %s\n", score->mode);
+ }
+ if (score->mode_modifier) {
+ fprintf(f, " mode_modifier %s\n", score->mode_modifier);
+ }
+ if (score->mode_differentia) {
+ fprintf(f, " mode_differentia %s\n", score->mode_differentia);
+ }
+ if (score->staff_lines != 4) {
+ fprintf(f, " staff_lines %d\n", (int)score->staff_lines);
+ }
+ if (score->nabc_lines) {
+ fprintf(f, " nabc_lines %d\n", (int)score->nabc_lines);
+ }
+ if (score->legacy_oriscus_orientation) {
+ fprintf(f, " oriscus-orientation legacy\n");
+ }
+ fprintf(f, "\n\n"
+ "=====================================================================\n"
+ " HEADERS\n"
+ "=====================================================================\n");
+ for (header = score->headers; header; header = header->next) {
+ fprintf(f, " %-25s %s\n", header->name, header->value);
+ }
+ fprintf(f, "\n\n"
+ "=====================================================================\n"
+ " VOICES INFOS\n"
+ "=====================================================================\n");
+ for (i = 0; i < score->number_of_voices; i++) {
+ fprintf(f, " Voice %d\n", i + 1);
+ if (voice_info->initial_clef.line) {
+ fprintf(f, " initial_key %d (%c%d)\n",
+ gregorio_calculate_new_key(voice_info->initial_clef),
+ gregorio_clef_to_char(voice_info->initial_clef.clef),
+ voice_info->initial_clef.line);
+ if (voice_info->initial_clef.flatted) {
+ fprintf(f, " flatted_key true\n");
+ }
+ if (voice_info->initial_clef.secondary_line) {
+ fprintf(f, " secondary_clef %c%d\n",
+ gregorio_clef_to_char(
+ voice_info->initial_clef.secondary_clef),
+ voice_info->initial_clef.secondary_line);
+ if (voice_info->initial_clef.secondary_flatted) {
+ fprintf(f, " secondary_flatted_key true\n");
+ }
+ }
+ }
+ for (annotation_num = 0; annotation_num < MAX_ANNOTATIONS;
+ ++annotation_num) {
+ if (score->annotation[annotation_num]) {
+ fprintf(f, " annotation %s\n",
+ score->annotation[annotation_num]);
+ }
+ }
+ voice_info = voice_info->next_voice_info;
+ }
+ fprintf(f, "\n\n"
+ "=====================================================================\n"
+ " SCORE\n"
+ "=====================================================================\n");
+ for (syllable = score->first_syllable; syllable;
+ syllable = syllable->next_syllable) {
+ gregorio_element *element;
+ fprintf(f, " type 0 (GRE_SYLLABLE)\n");
+ if (syllable->position) {
+ fprintf(f, " position %d (%s)\n",
+ syllable->position,
+ gregorio_word_position_to_string(syllable->position));
+ }
+ if (syllable->no_linebreak_area != NLBA_NORMAL) {
+ fprintf(f, " no line break area %s\n",
+ gregorio_nlba_to_string(syllable->no_linebreak_area));
+ }
+ if (syllable->euouae != EUOUAE_NORMAL) {
+ fprintf(f, " euouae %s\n",
+ gregorio_euouae_to_string(syllable->euouae));
+ }
+ if (syllable->clear) {
+ fprintf(f, " clear true\n");
+ }
+ if (syllable->text) {
+ if (syllable->translation) {
+ fprintf(f, "\n Text\n");
+ }
+ dump_write_characters(f, syllable->text);
+ }
+ if ((syllable->translation
+ && syllable->translation_type != TR_WITH_CENTER_END)
+ || syllable->translation_type == TR_WITH_CENTER_END) {
+ fprintf(f, "\n Translation type %s",
+ gregorio_tr_centering_to_string
+ (syllable->translation_type));
+ if (syllable->translation_type == TR_WITH_CENTER_END) {
+ fprintf(f, "\n");
+ }
+ }
+ if (syllable->translation) {
+ fprintf(f, "\n Translation\n");
+ dump_write_characters(f, syllable->translation);
+ }
+ if (syllable->abovelinestext) {
+ fprintf(f, "\n Abovelinestext\n %s", syllable->abovelinestext);
+ }
+ for (element = *syllable->elements; element; element = element->next) {
+ gregorio_glyph *glyph;
+ fprintf(f, "---------------------------------------------------------------------\n");
+ if (element->type) {
+ fprintf(f, " type %d (%s)\n",
+ element->type, gregorio_type_to_string(element->type));
+ }
+ switch (element->type) {
+ case GRE_CUSTOS:
+ if (element->u.misc.pitched.pitch) {
+ fprintf(f, " pitch %s\n",
+ dump_pitch(element->u.misc.pitched.pitch,
+ score->highest_pitch));
+ }
+ if (element->u.misc.pitched.force_pitch) {
+ fprintf(f, " force_pitch true\n");
+ }
+ break;
+ case GRE_SUPPRESS_CUSTOS:
+ /* not handling this would generate an error below */
+ break;
+ case GRE_SPACE:
+ if (element->u.misc.unpitched.info.space) {
+ char *factor = element->u.misc.unpitched.info.
+ ad_hoc_space_factor;
+ fprintf(f, " space %d (%s)%s%s\n",
+ element->u.misc.unpitched.info.space,
+ gregorio_space_to_string(
+ element->u.misc.unpitched.info.space),
+ factor? " x " : "", factor? factor : "");
+ }
+ break;
+ case GRE_TEXVERB_ELEMENT:
+ fprintf(f, " TeX string \"%s\"\n",
+ gregorio_texverb(element->texverb));
+ break;
+ case GRE_NLBA:
+ fprintf(f, " nlba %d (%s)\n",
+ element->u.misc.unpitched.info.nlba,
+ gregorio_nlba_to_string(element->u.misc.unpitched.info.
+ nlba));
+ break;
+ case GRE_ALT:
+ fprintf(f, " Above lines text \"%s\"\n",
+ gregorio_texverb(element->texverb));
+ break;
+ case GRE_BAR:
+ if (element->u.misc.unpitched.info.bar) {
+ fprintf(f, " bar %d (%s)\n",
+ element->u.misc.unpitched.info.bar,
+ gregorio_bar_to_string(element->u.misc.unpitched.
+ info.bar));
+ if (element->u.misc.unpitched.special_sign) {
+ fprintf(f, " special sign %d (%s)\n",
+ element->u.misc.unpitched.special_sign,
+ gregorio_sign_to_string(element->
+ u.misc.unpitched.special_sign));
+ }
+ }
+ break;
+ case GRE_CLEF:
+ if (element->u.misc.clef.line) {
+ fprintf(f, " clef %d (%c%d)\n",
+ gregorio_calculate_new_key(element->u.misc.clef),
+ gregorio_clef_to_char(element->u.misc.clef.clef),
+ element->u.misc.clef.line);
+ if (element->u.misc.clef.flatted) {
+ fprintf(f, " flatted_key true\n");
+ }
+ if (element->u.misc.clef.secondary_line) {
+ fprintf(f, " secondary_clef %c%d\n",
+ gregorio_clef_to_char(
+ element->u.misc.clef.secondary_clef),
+ element->u.misc.clef.secondary_line);
+ if (element->u.misc.clef.secondary_flatted) {
+ fprintf(f, " secondary_flatted_key true\n");
+ }
+ }
+ }
+ break;
+ case GRE_END_OF_LINE:
+ if (element->u.misc.unpitched.info.eol_ragged) {
+ fprintf(f, " ragged true\n");
+ }
+ if (element->u.misc.unpitched.info.eol_forces_custos) {
+ fprintf(f, " forces custos %s\n",
+ dump_bool(element
+ ->u.misc.unpitched.info.eol_forces_custos_on));
+ }
+ break;
+ case GRE_ELEMENT:
+ for (glyph = element->u.first_glyph; glyph;
+ glyph = glyph->next) {
+ gregorio_note *note;
+ fprintf(f, "- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n");
+ if (glyph->type) {
+ fprintf(f, " type %d (%s)\n",
+ glyph->type, gregorio_type_to_string(glyph->
+ type));
+ }
+ switch (glyph->type) {
+ case GRE_TEXVERB_GLYPH:
+ fprintf(f, " TeX string \"%s\"\n",
+ gregorio_texverb(glyph->texverb));
+ break;
+
+ case GRE_SPACE:
+ fprintf(f, " space %d (%s)\n",
+ glyph->u.misc.unpitched.info.space,
+ gregorio_space_to_string(glyph->u.misc.
+ unpitched.info.space));
+ break;
+
+ case GRE_GLYPH:
+ fprintf(f, " glyph_type %d (%s)\n",
+ glyph->u.notes.glyph_type,
+ gregorio_glyph_type_to_string(glyph->u.notes.
+ glyph_type));
+ if (glyph->u.notes.is_cavum) {
+ fprintf(f, " is_cavum true\n");
+ }
+ if (glyph->u.notes.liquescentia) {
+ fprintf(f, " liquescentia %d (%s)\n",
+ glyph->u.notes.liquescentia,
+ gregorio_liquescentia_to_string(
+ glyph->u.notes.liquescentia));
+ }
+ break;
+
+ default:
+ /* not reachable unless there's a programming error */
+ /* LCOV_EXCL_START */
+ fprintf(f, " !!! NOT ALLOWED !!! %s\n",
+ gregorio_type_to_string(glyph->type));
+ break;
+ /* LCOV_EXCL_STOP */
+ }
+ if (glyph->type == GRE_GLYPH) {
+ for (note = glyph->u.notes.first_note; note;
+ note = note->next) {
+ fprintf(f, "- - - - - - - - - - - - - - - - - - - - - - - \n");
+ if (note->type) {
+ fprintf(f, " type %d (%s)\n",
+ note->type,
+ gregorio_type_to_string(note->type));
+ }
+ switch (note->type) {
+ case GRE_NOTE:
+ if (note->u.note.pitch) {
+ fprintf(f, " pitch %s\n",
+ dump_pitch(note->u.note.pitch,
+ score->highest_pitch));
+ }
+ if (note->u.note.shape) {
+ fprintf(f, " shape %d (%s)\n",
+ note->u.note.shape,
+ gregorio_shape_to_string(
+ note->u.note.shape));
+ }
+ if (note->u.note.is_cavum) {
+ fprintf(f, " is_cavum true\n");
+ }
+ if (note->u.note.liquescentia) {
+ fprintf(f, " liquescentia %d (%s)\n",
+ note->u.note.liquescentia,
+ gregorio_liquescentia_to_string(
+ note->u.note.liquescentia));
+ }
+ break;
+
+ default:
+ /* not reachable unless there's a programming error */
+ /* LCOV_EXCL_START */
+ fprintf(f, " !!! NOT ALLOWED !!! %s\n",
+ gregorio_type_to_string(note->type));
+ break;
+ /* LCOV_EXCL_STOP */
+ }
+ if (note->texverb) {
+ fprintf(f, " TeX string \"%s\"\n",
+ gregorio_texverb(note->texverb));
+ }
+ if (note->choral_sign) {
+ fprintf(f, " Choral Sign \"%s\"\n",
+ note->choral_sign);
+ }
+ if (note->signs) {
+ fprintf(f, " signs %d (%s)\n",
+ note->signs,
+ gregorio_sign_to_string(note->signs));
+ }
+ if (note->signs & _V_EPISEMA && note->v_episema_height) {
+ if (note->v_episema_height < note->u.note.pitch) {
+ fprintf(f, " v episema forced BELOW\n");
+ }
+ else {
+ fprintf(f, " v episema forced ABOVE\n");
+ }
+ }
+ if ((note->signs == _PUNCTUM_MORA
+ || note->signs == _V_EPISEMA_PUNCTUM_MORA)
+ && note->mora_vposition) {
+ fprintf(f, " mora vposition %s\n",
+ gregorio_vposition_to_string(note->
+ mora_vposition));
+ }
+ if (note->special_sign) {
+ fprintf(f, " special sign %d (%s)\n",
+ note->special_sign,
+ gregorio_sign_to_string(
+ note->special_sign));
+ }
+ if (note->h_episema_above == HEPISEMA_AUTO
+ && note->h_episema_below == HEPISEMA_AUTO) {
+ fprintf(f, " auto hepisema size %d (%s)\n",
+ note->h_episema_above_size,
+ grehepisema_size_to_string(note->
+ h_episema_above_size));
+ fprintf(f, " auto hepisema bridge %s\n",
+ dump_bool(note->h_episema_above_connect));
+ }
+ else {
+ if (note->h_episema_above == HEPISEMA_FORCED) {
+ fprintf(f, " above hepisema size %d (%s)\n",
+ note->h_episema_above_size,
+ grehepisema_size_to_string(note->
+ h_episema_above_size));
+ fprintf(f, " above hepisema bridge %s\n",
+ dump_bool(note->h_episema_above_connect));
+ }
+ if (note->h_episema_below == HEPISEMA_FORCED) {
+ fprintf(f, " below hepisema size %d (%s)\n",
+ note->h_episema_below_size,
+ grehepisema_size_to_string(note->
+ h_episema_below_size));
+ fprintf(f, " below hepisema bridge %s\n",
+ dump_bool(note->h_episema_below_connect));
+ }
+ }
+ dump_hepisema_adjustment(f, note, SO_OVER, "above");
+ dump_hepisema_adjustment(f, note, SO_UNDER,
+ "below");
+ switch (note->high_ledger_specificity) {
+ case LEDGER_SUPPOSED:
+ break;
+ case LEDGER_EXPLICIT:
+ fprintf(f, " explicit high line %s\n",
+ dump_bool(note->high_ledger_line));
+ break;
+ case LEDGER_DRAWN:
+ fprintf(f, " drawn high line %s\n",
+ dump_bool(note->high_ledger_line));
+ break;
+ case LEDGER_EXPLICITLY_DRAWN:
+ fprintf(f, " forced drawn high line %s\n",
+ dump_bool(note->high_ledger_line));
+ break;
+ }
+ switch (note->low_ledger_specificity) {
+ case LEDGER_SUPPOSED:
+ break;
+ case LEDGER_EXPLICIT:
+ fprintf(f, " explicit low line %s\n",
+ dump_bool(note->low_ledger_line));
+ break;
+ case LEDGER_DRAWN:
+ fprintf(f, " drawn low line %s\n",
+ dump_bool(note->low_ledger_line));
+ break;
+ case LEDGER_EXPLICITLY_DRAWN:
+ fprintf(f, " forced drawn low line %s\n",
+ dump_bool(note->low_ledger_line));
+ break;
+ }
+ }
+ }
+ }
+ break;
+
+ default:
+ /* not reachable unless there's a programming error */
+ /* LCOV_EXCL_START */
+ fprintf(f, " !!! NOT ALLOWED !!! %s\n",
+ gregorio_type_to_string(element->type));
+ break;
+ /* LCOV_EXCL_STOP */
+ }
+ if (element->nabc_lines) {
+ fprintf(f, " nabc_lines %d\n",
+ (int)element->nabc_lines);
+ }
+ if (element->nabc_lines && element->nabc) {
+ for (i = 0; i < (int)element->nabc_lines; i++) {
+ if (element->nabc[i]) {
+ fprintf(f, " nabc_line %d \"%s\"\n",
+ (int)(i+1), element->nabc[i]);
+ }
+ }
+ }
+ }
+ fprintf(f, "=====================================================================\n");
+ }
+}