1 #ifndef __MISC_H_
2 #define __MISC_H_
3 #include <cstdint>
4 #include <cstdio>
5 #include <string>
6 #include <algorithm>
7 #include <cctype>
8 #include <locale>
9 
10 enum Directions
11 {
12   RIGHT  = 0,
13   LEFT   = 1,
14   UP     = 2,
15   DOWN   = 3,
16   CENTER = 5
17 };
18 
19 uint16_t fgeti(FILE *fp);
20 uint32_t fgetl(FILE *fp);
21 void fputi(uint16_t word, FILE *fp);
22 void fputl(uint32_t word, FILE *fp);
23 double fgetfloat(FILE *fp);
24 void fputfloat(double q, FILE *fp);
25 void freadstring(FILE *fp, char *buf, int max);
26 void fputstring(const char *buf, FILE *fp);
27 void fputstringnonull(const char *buf, FILE *fp);
28 bool fverifystring(FILE *fp, const char *str);
29 void fgetcsv(FILE *fp, char *str, int maxlen);
30 int fgeticsv(FILE *fp);
31 double fgetfcsv(FILE *fp);
32 void fgetline(FILE *fp, char *str, int maxlen);
33 int filesize(FILE *fp);
34 bool file_exists(const char *fname);
35 char *stprintf(const char *fmt, ...);
36 int random(int min, int max);
37 uint32_t getrand();
38 void seedrand(uint32_t newseed);
39 bool strbegin(const char *bigstr, const char *smallstr);
40 bool strcasebegin(const char *bigstr, const char *smallstr);
41 int count_string_list(const char *list[]);
42 char *GetStaticStr(void);
43 void maxcpy(char *dst, const char *src, int maxlen);
44 void fresetboolean(void);
45 char fbooleanread(FILE *fp);
46 void fbooleanwrite(char bit, FILE *fp);
47 void fbooleanflush(FILE *fp);
48 
49 int CVTDir(int csdir);
50 
51 void crtoslashn(char *in, char *out);
52 bool contains_non_cr(const std::string &str);
53 
54 #if defined(_WIN32)
55 std::wstring widen(const std::string &str);
56 std::string narrow(const std::wstring &str);
57 #define myfopen _wfopen
58 #else
59 std::string widen(const std::string &str);
60 std::string narrow(const std::string &str);
61 #define myfopen fopen
62 #endif
63 
64 // trim from start (in place)
ltrim(std::string & s)65 static inline void ltrim(std::string &s) {
66     s.erase(s.begin(), std::find_if(s.begin(), s.end(), [](unsigned char ch) {
67         return !std::isspace(ch);
68     }));
69 }
70 
71 // trim from end (in place)
rtrim(std::string & s)72 static inline void rtrim(std::string &s) {
73     s.erase(std::find_if(s.rbegin(), s.rend(), [](unsigned char ch) {
74         return !std::isspace(ch);
75     }).base(), s.end());
76 }
77 
78 // trim from both ends (in place)
trim(std::string & s)79 static inline void trim(std::string &s) {
80     ltrim(s);
81     rtrim(s);
82 }
83 
84 // trim from start (copying)
ltrim_copy(std::string s)85 static inline std::string ltrim_copy(std::string s) {
86     ltrim(s);
87     return s;
88 }
89 
90 // trim from end (copying)
rtrim_copy(std::string s)91 static inline std::string rtrim_copy(std::string s) {
92     rtrim(s);
93     return s;
94 }
95 
96 // trim from both ends (copying)
trim_copy(std::string s)97 static inline std::string trim_copy(std::string s) {
98     trim(s);
99     return s;
100 }
101 
102 #endif