diff options
Diffstat (limited to 'Build/source/texk/gregorio/gregorio-src/src/gabc/gabc.h')
-rw-r--r-- | Build/source/texk/gregorio/gregorio-src/src/gabc/gabc.h | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/Build/source/texk/gregorio/gregorio-src/src/gabc/gabc.h b/Build/source/texk/gregorio/gregorio-src/src/gabc/gabc.h new file mode 100644 index 00000000000..73c7f64f60a --- /dev/null +++ b/Build/source/texk/gregorio/gregorio-src/src/gabc/gabc.h @@ -0,0 +1,87 @@ +/* + * Gregorio is a program that translates gabc files to GregorioTeX + * This header prototypes gabc-format handling data structures and entry points. + * + * Copyright (C) 2006-2015 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/>. + */ + +#ifndef GABC_H +#define GABC_H + +#define GABC_CURRENT_VERSION "0.9.3" + +#include "struct.h" + +/* functions to read gabc */ +gregorio_note *gabc_det_notes_from_string(char *str, char *macros[10], + gregorio_scanner_location *loc); +gregorio_element *gabc_det_elements_from_string(char *str, int *current_key, + char *macros[10], gregorio_scanner_location *loc); +gregorio_glyph *gabc_det_glyphs_from_notes(gregorio_note *current_note, + int *current_key); +void gabc_digest(const void *buf, size_t size); +int gabc_score_determination_lex_destroy(void); +int gabc_notes_determination_lex_destroy(void); + +/* see comments on gregorio_add_note_to_a_glyph for meaning of these + * variables */ +typedef enum gabc_determination { + DET_NO_END, + DET_END_OF_CURRENT, + DET_END_OF_PREVIOUS, + DET_END_OF_BOTH +} gabc_determination; + +/* defines the maximal interval between two notes of the same glyph */ +#define MAX_INTERVAL 5 + +static __inline void gabc_update_location(gregorio_scanner_location *const loc, + const char *const bytes, const size_t length) +{ + size_t i; + + /* to be compatible with LilyPond, this algorithm is based on Lilypond's + * Source_file::get_counts */ + + /* possible future enhancement: make the tabstop size configurable */ + + loc->first_line = loc->last_line; + loc->first_column = loc->last_column; + loc->first_offset = loc->last_offset; + + for (i = 0; i < length; ++i) { + if (bytes[i] == '\n') { + ++loc->last_line; + loc->last_column = 0; + loc->last_offset = 0; + } else if (((unsigned char)bytes[i] & 0xc0u) != 0x80u) { + /* if two highest bits are 1 and 0, it's a continuation byte, + * so count everything else, which is either a single-byte + * character or the first byte of a multi-byte sequence */ + + if (bytes[i] == '\t') { + loc->last_column = (loc->last_column / 8 + 1) * 8; + } else { + ++loc->last_column; + } + ++loc->last_offset; + } + } +} + +#endif |