free bugs [fixed]
[coupserv.git] / utils.c
blobdb0df784e6beda60fc40afaf1d195407cbbcc585
1 // My string-related utils library for now
2 //
3 // Written by: Test_User <hax@andrewyu.org>
4 //
5 // This is free and unencumbered software released into the public
6 // domain.
7 //
8 // Anyone is free to copy, modify, publish, use, compile, sell, or
9 // distribute this software, either in source code form or as a compiled
10 // binary, for any purpose, commercial or non-commercial, and by any
11 // means.
13 // In jurisdictions that recognize copyright laws, the author or authors
14 // of this software dedicate any and all copyright interest in the
15 // software to the public domain. We make this dedication for the benefit
16 // of the public at large and to the detriment of our heirs and
17 // successors. We intend this dedication to be an overt act of
18 // relinquishment in perpetuity of all present and future rights to this
19 // software under copyright law.
21 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
22 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
23 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
24 // IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
25 // OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
26 // ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
27 // OTHER DEALINGS IN THE SOFTWARE.
29 #include <stdint.h>
31 #include "types.h"
33 uint64_t str_to_unsigned(struct string str, char *err) {
34 if (str.len == 0) {
35 *err = 1;
36 return 0;
39 uint64_t val = 0;
40 while (str.len > 0) {
41 switch(str.data[0]) {
42 case '0':
43 case '1':
44 case '2':
45 case '3':
46 case '4':
47 case '5':
48 case '6':
49 case '7':
50 case '8':
51 case '9':
52 if (val > ((uint64_t)-1)/10) {
53 *err = 1;
54 return 0;
56 val *= 10;
57 if (val > (-((uint64_t)((uint8_t)str.data[0] - 0x30) + 1))) {
58 *err = 1;
59 return 0;
61 val += (uint8_t)str.data[0] - 0x30;
62 break;
63 default:
64 *err = 1;
65 return 0;
68 str.data++;
69 str.len--;
72 *err = 0;
73 return val;