File: gtstream.cc

package info (click to toggle)
grhino 0.16.1-4
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, bullseye, buster
  • size: 3,680 kB
  • sloc: cpp: 10,637; sh: 3,120; xml: 1,099; makefile: 432; perl: 337; sed: 27
file content (85 lines) | stat: -rw-r--r-- 2,215 bytes parent folder | download | duplicates (6)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
/*
	gtstream.cc	C++ Stream Supporting gettext Usage
	Copyright (c) 2000, 2001, 2002, 2004, 2005 Kriang Lerdsuwanakij
	email:		lerdsuwa@users.sourceforge.net

	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., 675 Mass Ave, Cambridge, MA 02139, USA.
*/

#include "gtstream.h"

gtout::gtout(std::ostream &os_, const std::string &fmt) : os(os_), format(fmt), need_flush(false)
{
}

gtout::gtout(std::ostream &os_, const char *fmt) : os(os_), format(fmt), need_flush(false)
{
}

void gtout::finish()
{
	size_t	cur_idx = 0;
	size_t	size = format.size();
	for (size_t i = 0; i < size; ++i) {
		if (format[i] == '%' && i != size-1) {
			switch (format[i+1]) {
				case '%':		// Found "%%"
					os << '%';
					++i;		// Skip the first '%'
					break;
				case '$':		// Found "%$"
					if (cur_idx < str_vec.size()) {
						os << str_vec[cur_idx];
						str_flag[cur_idx] = true;
					}
					++cur_idx;
					++i;		// Skip the first '%'
					break;
				default:		// Should be in the form  "%n$"
					{
						size_t idx = 0;
						for (++i ; i < size && format[i] >= '0' && format[i] <= '9'; ++i) {
							idx = idx * 10 + format[i] - '0';
						}
						if (i < size && format[i] == '$') {
							if (idx-1 < str_vec.size()) {
								os << str_vec[idx-1];
								str_flag[idx-1] = true;
							}
							++cur_idx;
						}
						else {	// Error
							if (need_flush)
								os.flush();
							return;
						}
					}
			}
		}
		else {
			os << format[i];
		}
	}
	
//	size = str_vec.size();			// Print remaining strings
//	for (size_t i = 0; i < size; ++i) {
//		if (! str_flag[i])
//			os << str_vec[i];
//	}

	if (need_flush)
		os.flush();
}