1 /* melder_info.cpp
2  *
3  * Copyright (C) 1992-2007,2011-2018,2020 Paul Boersma
4  *
5  * This code is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation; either version 2 of the License, or (at
8  * your option) any later version.
9  *
10  * This code is distributed in the hope that it will be useful, but
11  * WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
13  * See the GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this work. If not, see <http://www.gnu.org/licenses/>.
17  */
18 
19 #include "melder.h"
20 
_defaultProc(conststring32 message)21 void MelderInfo::_defaultProc (conststring32 message) {
22 	MelderConsole::write (message, false);
23 }
24 
25 MelderInfo::Proc MelderInfo::_p_currentProc = & MelderInfo::_defaultProc;
26 
Melder_setInformationProc(MelderInfo::Proc proc)27 void Melder_setInformationProc (MelderInfo::Proc proc) {
28 	MelderInfo::_p_currentProc = ( proc ? proc : MelderInfo::_defaultProc );
29 }
30 
31 MelderString MelderInfo::_foregroundBuffer;
32 MelderString *MelderInfo::_p_currentBuffer = & MelderInfo::_foregroundBuffer;
33 
MelderInfo_open()34 void MelderInfo_open () {
35 	MelderString_empty (MelderInfo::_p_currentBuffer);
36 }
37 
MelderInfo_close()38 void MelderInfo_close () {
39 	if (MelderInfo::_p_currentBuffer == & MelderInfo::_foregroundBuffer) {
40 		/*
41 			When writing to the Info window or the console, we must add a newline symbol,
42 			because a subsequent MelderInfo_write call has to start on the next line.
43 			When writing to a diverted string, we must *not* add a newline symbol,
44 			because scripts expect returned strings without appended newlines!
45 		*/
46 		if (MelderInfo::_p_currentBuffer -> length == 0 ||
47 		    MelderInfo::_p_currentBuffer -> string [MelderInfo::_p_currentBuffer -> length - 1] != U'\n')   // only if no newline there yet
48 		{
49 			MelderString_appendCharacter (MelderInfo::_p_currentBuffer, U'\n');
50 			if (MelderInfo::_p_currentProc == MelderInfo::_defaultProc)
51 				MelderConsole::write (U"\n", false);
52 		}
53 		if (MelderInfo::_p_currentProc != & MelderInfo::_defaultProc)
54 			MelderInfo::_p_currentProc (MelderInfo::_p_currentBuffer -> string ? MelderInfo::_p_currentBuffer -> string : U"");
55 	}
56 }
57 
MelderInfo_drain()58 void MelderInfo_drain () {
59 	if (MelderInfo::_p_currentBuffer == & MelderInfo::_foregroundBuffer) {
60 		if (MelderInfo::_p_currentProc != & MelderInfo::_defaultProc)
61 			MelderInfo::_p_currentProc (MelderInfo::_p_currentBuffer -> string ? MelderInfo::_p_currentBuffer -> string : U"");
62 	}
63 }
64 
Melder_informationReal(double value,conststring32 units)65 void Melder_informationReal (double value, conststring32 units) {
66 	MelderInfo_open ();
67 	if (! units) {
68 		MelderInfo_write (value);
69 	} else {
70 		MelderInfo_write (value, U" ", units);
71 	}
72 	MelderInfo_close ();
73 }
74 
Melder_divertInfo(MelderString * p_buffer)75 void Melder_divertInfo (MelderString *p_buffer) {
76 	MelderInfo::_p_currentBuffer = ( p_buffer ? p_buffer : & MelderInfo::_foregroundBuffer );
77 }
78 
Melder_clearInfo()79 void Melder_clearInfo () {
80 	if (MelderInfo::_p_currentBuffer == & MelderInfo::_foregroundBuffer) {
81 		MelderString_empty (MelderInfo::_p_currentBuffer);
82 		if (MelderInfo::_p_currentProc != & MelderInfo::_defaultProc)
83 			MelderInfo::_p_currentProc (U"");
84 	}
85 }
86 
Melder_getInfo()87 conststring32 Melder_getInfo () {
88 	return MelderInfo::_p_currentBuffer -> string ? MelderInfo::_p_currentBuffer -> string : U"";
89 }
90 
91 /* End of file melder_info.cpp */
92