Remove sstream dependency.
[libsub.git] / src / util.cc
1 /*
2     Copyright (C) 2012-2015 Carl Hetherington <cth@carlh.net>
3
4     This program is free software; you can redistribute it and/or modify
5     it under the terms of the GNU General Public License as published by
6     the Free Software Foundation; either version 2 of the License, or
7     (at your option) any later version.
8
9     This program is distributed in the hope that it will be useful,
10     but WITHOUT ANY WARRANTY; without even the implied warranty of
11     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12     GNU General Public License for more details.
13
14     You should have received a copy of the GNU General Public License
15     along with this program; if not, write to the Free Software
16     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
17
18 */
19
20 #include "util.h"
21 #include <string>
22 #include <iostream>
23 #include <cstdio>
24
25 using std::string;
26 using std::getline;
27 using boost::optional;
28
29 /** @param s A string.
30  *  @return true if the string contains only space, newline or tab characters, or is empty.
31  */
32 bool
33 sub::empty_or_white_space (string s)
34 {
35         for (size_t i = 0; i < s.length(); ++i) {
36                 if (s[i] != ' ' && s[i] != '\n' && s[i] != '\t') {
37                         return false;
38                 }
39         }
40
41         return true;
42 }
43
44 optional<string>
45 sub::get_line_string (string* s)
46 {
47         if (s->length() == 0) {
48                 return optional<string>();
49         }
50
51         size_t pos = s->find ("\n");
52         if (pos == string::npos) {
53                 string const c = *s;
54                 *s = "";
55                 return c;
56         }
57
58         string const c = s->substr (0, pos);
59         s->erase (0, pos + 1);
60         return c;
61 }
62
63 optional<string>
64 sub::get_line_file (FILE* f)
65 {
66         char buffer[256];
67         char* r = fgets (buffer, sizeof (buffer), f);
68         if (r == 0) {
69                 return optional<string> ();
70         }
71
72         return string (buffer);
73 }
74
75 void
76 sub::remove_unicode_bom (optional<string>& line)
77 {
78         if (
79                 line->length() >= 3 &&
80                 static_cast<unsigned char> (line.get()[0]) == 0xef &&
81                 static_cast<unsigned char> (line.get()[1]) == 0xbb &&
82                 static_cast<unsigned char> (line.get()[2]) == 0xbf
83                 ) {
84
85                 /* Skip Unicode byte order mark */
86                 line = line->substr (3);
87         }
88 }