1 /*
2 * util.c -
3 *
4 * Written by Eryk Vershen
5 */
6
7 /*
8 * Copyright 1997,1998 by Apple Computer, Inc.
9 * All Rights Reserved
10 *
11 * Permission to use, copy, modify, and distribute this software and
12 * its documentation for any purpose and without fee is hereby granted,
13 * provided that the above copyright notice appears in all copies and
14 * that both the copyright notice and this permission notice appear in
15 * supporting documentation.
16 *
17 * APPLE COMPUTER DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE
18 * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
19 * FOR A PARTICULAR PURPOSE.
20 *
21 * IN NO EVENT SHALL APPLE COMPUTER BE LIABLE FOR ANY SPECIAL, INDIRECT, OR
22 * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
23 * LOSS OF USE, DATA OR PROFITS, WHETHER IN ACTION OF CONTRACT,
24 * NEGLIGENCE, OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
25 * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
26 */
27
28
29 // for sprintf()
30 #include <stdio.h>
31 // for tolower()
32 #include <ctype.h>
33 #include <stdint.h>
34
35 #include "version.h"
36 #include "util.h"
37
38
39 /*
40 * Defines
41 */
42 #define NumToolboxTraps() ( \
43 (NGetTrapAddress(_InitGraf, ToolTrap) \
44 == NGetTrapAddress(0xAA6E, ToolTrap)) \
45 ? 0x200 : 0x400 \
46 )
47 #define GetTrapType(theTrap) ( \
48 (((theTrap) & 0x800) != 0) ? ToolTrap : OSTrap \
49 )
50
51
52 /*
53 * Types
54 */
55
56
57 /*
58 * Global Constants
59 */
60
61
62 /*
63 * Global Variables
64 */
65 static char dynamic_version[10];
66
67 /*
68 * Forward declarations
69 */
70
71
72 /*
73 * Routines
74 */
75 void
clear_memory(void * dataPtr,uint32_t size)76 clear_memory(void *dataPtr, uint32_t size)
77 {
78 char *ptr;
79
80 ptr = (char *) dataPtr;
81 while (size > 0) {
82 *ptr++ = 0;
83 --size;
84 }
85 }
86
87
88 #if !defined(__linux__) && !defined(__unix__)
89 /* (see Inside Mac VI 3-8) */
90 int
TrapAvailable(short theTrap)91 TrapAvailable(short theTrap)
92 {
93 TrapType trapType;
94
95 trapType = GetTrapType(theTrap);
96
97 if (trapType == ToolTrap) {
98 theTrap &= 0x07FF;
99 if (theTrap >= NumToolboxTraps())
100 theTrap = _Unimplemented;
101 }
102
103 return (
104 NGetTrapAddress(theTrap, trapType)
105 != NGetTrapAddress(_Unimplemented, ToolTrap)
106 );
107 }
108 #endif
109
110
111 /* Ascii case-insensitive string comparison */
112 int
istrncmp(const char * x,const char * y,long len)113 istrncmp(const char *x, const char *y, long len)
114 {
115 const uint8_t *p = (const uint8_t *)x;
116 const uint8_t *q = (const uint8_t *)y;
117
118 while (len > 0) {
119 if (tolower(*p) != tolower(*q)) {
120 return (*p - *q);
121 } else if (*p == 0) {
122 break;
123 }
124 p++;
125 q++;
126 len--;
127 }
128 return (0);
129 }
130
131
132 const char *
get_version_string(void)133 get_version_string(void)
134 {
135 int stage;
136 /* "copy" of stuff from SysTypes.r, since we can't include that*/
137 enum {development = 0x20, alpha = 0x40, beta = 0x60, final = 0x80, /* or */ release = 0x80};
138
139 switch (kVersionStage) {
140 case development: stage = 'd'; break;
141 case alpha: stage = 'a'; break;
142 case beta: stage = 'b'; break;
143 case final: stage = 'f'; break;
144 default: stage = '?'; break;
145 }
146
147 if (kVersionBugFix != 0) {
148 if (kVersionStage == final) {
149 snprintf(dynamic_version, sizeof(dynamic_version), "%d.%d.%d",
150 kVersionMajor, kVersionMinor, kVersionBugFix);
151 } else {
152 snprintf(dynamic_version, sizeof(dynamic_version), "%d.%d.%d%c%d",
153 kVersionMajor, kVersionMinor, kVersionBugFix, stage, kVersionDelta);
154 }
155 } else {
156 if (kVersionStage == final) {
157 snprintf(dynamic_version, sizeof(dynamic_version), "%d.%d",
158 kVersionMajor, kVersionMinor);
159 } else {
160 snprintf(dynamic_version, sizeof(dynamic_version), "%d.%d%c%d",
161 kVersionMajor, kVersionMinor, stage, kVersionDelta);
162 }
163 }
164 return dynamic_version;
165 }
166