/[gxemul]/upstream/0.4.6/src/misc.c
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Contents of /upstream/0.4.6/src/misc.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 43 - (show annotations)
Mon Oct 8 16:22:43 2007 UTC (16 years, 7 months ago) by dpavlin
File MIME type: text/plain
File size: 4126 byte(s)
0.4.6
1 /*
2 * Copyright (C) 2005-2007 Anders Gavare. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are met:
6 *
7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * 3. The name of the author may not be used to endorse or promote products
13 * derived from this software without specific prior written permission.
14 *
15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25 * SUCH DAMAGE.
26 *
27 *
28 * $Id: misc.c,v 1.9 2007/06/15 17:02:38 debug Exp $
29 *
30 * This file contains things that don't fit anywhere else, and fake/dummy
31 * implementations of libc functions that are missing on some systems.
32 */
33
34 #include <stdio.h>
35 #include <stdlib.h>
36 #include <string.h>
37 #include <fcntl.h>
38
39 #include "cpu.h"
40 #include "misc.h"
41
42
43 /*
44 * mystrtoull():
45 *
46 * This function is used on OSes that don't have strtoull() in libc.
47 */
48 unsigned long long mystrtoull(const char *s, char **endp, int base)
49 {
50 unsigned long long res = 0;
51 int minus_sign = 0;
52
53 if (s == NULL)
54 return 0;
55
56 /* TODO: Implement endp? */
57 if (endp != NULL) {
58 fprintf(stderr, "mystrtoull(): endp isn't implemented\n");
59 exit(1);
60 }
61
62 if (s[0] == '-') {
63 minus_sign = 1;
64 s++;
65 }
66
67 /* Guess base: */
68 if (base == 0) {
69 if (s[0] == '0') {
70 /* Just "0"? :-) */
71 if (!s[1])
72 return 0;
73 if (s[1] == 'x' || s[1] == 'X') {
74 base = 16;
75 s += 2;
76 } else {
77 base = 8;
78 s ++;
79 }
80 } else if (s[0] >= '1' && s[0] <= '9')
81 base = 10;
82 }
83
84 while (s[0]) {
85 int c = s[0];
86 if (c >= '0' && c <= '9')
87 c -= '0';
88 else if (c >= 'a' && c <= 'f')
89 c = c - 'a' + 10;
90 else if (c >= 'A' && c <= 'F')
91 c = c - 'A' + 10;
92 else
93 break;
94 switch (base) {
95 case 8: res = (res << 3) | c;
96 break;
97 case 16:res = (res << 4) | c;
98 break;
99 default:res = (res * base) + c;
100 }
101 s++;
102 }
103
104 if (minus_sign)
105 res = (uint64_t) -(int64_t)res;
106 return res;
107 }
108
109
110 /*
111 * mymkstemp():
112 *
113 * mkstemp() replacement for systems that lack that function. This is NOT
114 * really safe, but should at least allow the emulator to build and run.
115 */
116 int mymkstemp(char *template)
117 {
118 int h = 0;
119 char *p = template;
120
121 while (*p) {
122 if (*p == 'X')
123 *p = 48 + random() % 10;
124 p++;
125 }
126
127 h = open(template, O_RDWR, 0600);
128 return h;
129 }
130
131
132 #ifdef USE_STRLCPY_REPLACEMENTS
133 /*
134 * mystrlcpy():
135 *
136 * Quick hack strlcpy() replacement for systems that lack that function.
137 * NOTE: No length checking is done.
138 */
139 size_t mystrlcpy(char *dst, const char *src, size_t size)
140 {
141 strcpy(dst, src);
142 return strlen(src);
143 }
144
145
146 /*
147 * mystrlcat():
148 *
149 * Quick hack strlcat() replacement for systems that lack that function.
150 * NOTE: No length checking is done.
151 */
152 size_t mystrlcat(char *dst, const char *src, size_t size)
153 {
154 size_t orig_dst_len = strlen(dst);
155 strcat(dst, src);
156 return strlen(src) + orig_dst_len;
157 }
158 #endif
159
160
161 /*
162 * print_separator_line():
163 *
164 * Prints a line of "----------".
165 */
166 void print_separator_line(void)
167 {
168 int i = 79;
169 while (i-- > 0)
170 debug("-");
171 debug("\n");
172 }
173

  ViewVC Help
Powered by ViewVC 1.1.26