clang-format all pdfium code.
[pdfium.git] / core / src / fxcrt / fx_basic_gcc.cpp
1 // Copyright 2014 PDFium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6
7 #include <limits>
8
9 #include "../../include/fxcrt/fx_ext.h"
10 #include "../../include/fxcrt/fx_string.h"
11
12 template <class T, class STR_T>
13 T FXSYS_StrToInt(STR_T str) {
14   FX_BOOL neg = FALSE;
15   if (str == NULL) {
16     return 0;
17   }
18   if (*str == '-') {
19     neg = TRUE;
20     str++;
21   }
22   T num = 0;
23   while (*str) {
24     if ((*str) < '0' || (*str) > '9') {
25       break;
26     }
27     if (num > (std::numeric_limits<T>::max() - 9) / 10) {
28       break;
29     }
30     num = num * 10 + (*str) - '0';
31     str++;
32   }
33   return neg ? -num : num;
34 }
35 template <typename T, typename STR_T>
36 STR_T FXSYS_IntToStr(T value, STR_T string, int radix) {
37   int i = 0;
38   if (value < 0) {
39     string[i++] = '-';
40     value = -value;
41   } else if (value == 0) {
42     string[0] = '0';
43     string[1] = 0;
44     return string;
45   }
46   int digits = 1;
47   T order = value / 10;
48   while (order > 0) {
49     digits++;
50     order = order / 10;
51   }
52   for (int d = digits - 1; d > -1; d--) {
53     string[d + i] = "0123456789abcdef"[value % 10];
54     value /= 10;
55   }
56   string[digits + i] = 0;
57   return string;
58 }
59 #ifdef __cplusplus
60 extern "C" {
61 #endif
62 int32_t FXSYS_atoi(const FX_CHAR* str) {
63   return FXSYS_StrToInt<int32_t, const FX_CHAR*>(str);
64 }
65 int32_t FXSYS_wtoi(const FX_WCHAR* str) {
66   return FXSYS_StrToInt<int32_t, const FX_WCHAR*>(str);
67 }
68 int64_t FXSYS_atoi64(const FX_CHAR* str) {
69   return FXSYS_StrToInt<int64_t, const FX_CHAR*>(str);
70 }
71 int64_t FXSYS_wtoi64(const FX_WCHAR* str) {
72   return FXSYS_StrToInt<int64_t, const FX_WCHAR*>(str);
73 }
74 const FX_CHAR* FXSYS_i64toa(int64_t value, FX_CHAR* str, int radix) {
75   return FXSYS_IntToStr<int64_t, FX_CHAR*>(value, str, radix);
76 }
77 const FX_WCHAR* FXSYS_i64tow(int64_t value, FX_WCHAR* str, int radix) {
78   return FXSYS_IntToStr<int64_t, FX_WCHAR*>(value, str, radix);
79 }
80 #ifdef __cplusplus
81 }
82 #endif
83 #if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_
84 #ifdef __cplusplus
85 extern "C" {
86 #endif
87 int FXSYS_GetACP() {
88   return 0;
89 }
90 FX_DWORD FXSYS_GetFullPathName(const FX_CHAR* filename,
91                                FX_DWORD buflen,
92                                FX_CHAR* buf,
93                                FX_CHAR** filepart) {
94   int srclen = FXSYS_strlen(filename);
95   if (buf == NULL || (int)buflen < srclen + 1) {
96     return srclen + 1;
97   }
98   FXSYS_strcpy(buf, filename);
99   return srclen;
100 }
101 FX_DWORD FXSYS_GetModuleFileName(void* hModule, char* buf, FX_DWORD bufsize) {
102   return (FX_DWORD)-1;
103 }
104 #ifdef __cplusplus
105 }
106 #endif
107 #endif
108 #if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_
109 #ifdef __cplusplus
110 extern "C" {
111 #endif
112 FXSYS_FILE* FXSYS_wfopen(const FX_WCHAR* filename, const FX_WCHAR* mode) {
113   return FXSYS_fopen(CFX_ByteString::FromUnicode(filename),
114                      CFX_ByteString::FromUnicode(mode));
115 }
116 char* FXSYS_strlwr(char* str) {
117   if (str == NULL) {
118     return NULL;
119   }
120   char* s = str;
121   while (*str) {
122     *str = FXSYS_tolower(*str);
123     str++;
124   }
125   return s;
126 }
127 char* FXSYS_strupr(char* str) {
128   if (str == NULL) {
129     return NULL;
130   }
131   char* s = str;
132   while (*str) {
133     *str = FXSYS_toupper(*str);
134     str++;
135   }
136   return s;
137 }
138 FX_WCHAR* FXSYS_wcslwr(FX_WCHAR* str) {
139   if (str == NULL) {
140     return NULL;
141   }
142   FX_WCHAR* s = str;
143   while (*str) {
144     *str = FXSYS_tolower(*str);
145     str++;
146   }
147   return s;
148 }
149 FX_WCHAR* FXSYS_wcsupr(FX_WCHAR* str) {
150   if (str == NULL) {
151     return NULL;
152   }
153   FX_WCHAR* s = str;
154   while (*str) {
155     *str = FXSYS_toupper(*str);
156     str++;
157   }
158   return s;
159 }
160 int FXSYS_stricmp(const char* dst, const char* src) {
161   int f, l;
162   do {
163     if (((f = (unsigned char)(*(dst++))) >= 'A') && (f <= 'Z')) {
164       f -= ('A' - 'a');
165     }
166     if (((l = (unsigned char)(*(src++))) >= 'A') && (l <= 'Z')) {
167       l -= ('A' - 'a');
168     }
169   } while (f && (f == l));
170   return (f - l);
171 }
172 int FXSYS_wcsicmp(const FX_WCHAR* dst, const FX_WCHAR* src) {
173   FX_WCHAR f, l;
174   do {
175     if (((f = (FX_WCHAR)(*(dst++))) >= 'A') && (f <= 'Z')) {
176       f -= ('A' - 'a');
177     }
178     if (((l = (FX_WCHAR)(*(src++))) >= 'A') && (l <= 'Z')) {
179       l -= ('A' - 'a');
180     }
181   } while (f && (f == l));
182   return (f - l);
183 }
184 char* FXSYS_itoa(int value, char* string, int radix) {
185   return FXSYS_IntToStr<int32_t, FX_CHAR*>(value, string, radix);
186 }
187 #ifdef __cplusplus
188 }
189 #endif
190 #endif
191 #if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_
192 #ifdef __cplusplus
193 extern "C" {
194 #endif
195 int FXSYS_WideCharToMultiByte(FX_DWORD codepage,
196                               FX_DWORD dwFlags,
197                               const FX_WCHAR* wstr,
198                               int wlen,
199                               FX_CHAR* buf,
200                               int buflen,
201                               const FX_CHAR* default_str,
202                               int* pUseDefault) {
203   int len = 0;
204   for (int i = 0; i < wlen; i++) {
205     if (wstr[i] < 0x100) {
206       if (buf && len < buflen) {
207         buf[len] = (FX_CHAR)wstr[i];
208       }
209       len++;
210     }
211   }
212   return len;
213 }
214 int FXSYS_MultiByteToWideChar(FX_DWORD codepage,
215                               FX_DWORD dwFlags,
216                               const FX_CHAR* bstr,
217                               int blen,
218                               FX_WCHAR* buf,
219                               int buflen) {
220   int wlen = 0;
221   for (int i = 0; i < blen; i++) {
222     if (buf && wlen < buflen) {
223       buf[wlen] = bstr[i];
224     }
225     wlen++;
226   }
227   return wlen;
228 }
229 #ifdef __cplusplus
230 }
231 #endif
232 #endif