Advanced Strategic Command
misc.cpp
Go to the documentation of this file.
1 /*
2  This file is part of Advanced Strategic Command; http://www.asc-hq.de
3  Copyright (C) 1994-2010 Martin Bickel and Marc Schellenberger
4 
5  This program is free software; you can redistribute it and/or modify
6  it under the terms of the GNU General Public License as published by
7  the Free Software Foundation; either version 2 of the License, or
8  (at your option) any later version.
9 
10  This program is distributed in the hope that it will be useful,
11  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  GNU General Public License for more details.
14 
15  You should have received a copy of the GNU General Public License
16  along with this program; see the file COPYING. If not, write to the
17  Free Software Foundation, Inc., 59 Temple Place, Suite 330,
18  Boston, MA 02111-1307 USA
19 */
20 
21 #include <stdio.h>
22 #include <stdlib.h>
23 #include <cstring>
24 #include <ctype.h>
25 #include <stdarg.h>
26 #include <iostream>
27 #include <SDL.h>
28 
29 #ifdef _WIN32_
30 #include <windows.h>
31 #endif
32 
33 #include "global.h"
34 #include "misc.h"
35 #include "ascstring.h"
36 
37 const char* digit[] = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" };
38 const char* letter[] = { "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M",
39  "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z" };
40 
41 
42 char strstring[1000];
43 
44 
45 int getFirstBit(int zahl)
46 {
47  #ifdef __GNUC__ // GCC-intrinsic (TODO: Visual C++ intrinsics, can't test is right now).
48  // the return value for __builtin_ctz(0) is undefined; it does set the zero flag, but we
49  // cant' read it from C/C++ :(
50  return (zahl != 0 ) ? __builtin_ctz(zahl) : 0;
51  #else
52  if (zahl != 0) {
53  int log = 0;
54  while ( !(zahl & 1)) {
55  zahl>>=1;
56  log++;
57  }
58  return log;
59  } else
60  return 0;
61  #endif
62 }
63 
64 
65 
66 char* strrr ( int a ) {
67  itoa ( a, strstring, 10 );
68  return strstring;
69 }
70 
71 char* strrr ( Uint32 a ) {
72  sprintf(strstring, "%d", a);
73  return strstring;
74 }
75 
76 char* strrr ( double f ) {
77  sprintf(strstring,"%f",f);
78  return strstring;
79 }
80 
81 
82 typedef unsigned int UNS_32_BITS;
83 
84 
85 static UNS_32_BITS crc_32_tab[] = { /* CRC polynomial 0xedb88320 */
86 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f,
87 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
88 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2,
89 0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
90 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,
91 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
92 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c,
93 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
94 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423,
95 0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
96 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106,
97 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
98 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d,
99 0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
100 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
101 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
102 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7,
103 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,
104 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa,
105 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
106 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81,
107 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,
108 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84,
109 0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
110 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
111 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
112 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e,
113 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
114 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55,
115 0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
116 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28,
117 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
118 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f,
119 0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,
120 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
121 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
122 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69,
123 0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,
124 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc,
125 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
126 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693,
127 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
128 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d
129 };
130 
131 
132 #define UPDC32(octet,crc) (crc_32_tab[((crc) ^ (octet)) & 0xff] ^ ((crc) >> 8))
133 
134 
135 int crc32buf(const void *vbuf, int len)
136 {
137  const char* buf = (const char*) vbuf;
138 
139  unsigned int oldcrc32;
140 
141  oldcrc32 = 0xFFFFFFFF;
142 
143  for ( ; len; --len, ++buf)
144  {
145  oldcrc32 = UPDC32(*buf, oldcrc32);
146  }
147 
148  return ~oldcrc32;
149 }
150 
151 
152 int atoi ( const std::string& s )
153 {
154  return atoi ( s.c_str() );
155 }
156 
157 double atof ( const std::string& s )
158 {
159  return atof ( s.c_str() );
160 }
161 
162 
163 #ifndef HAVE_STRICMP
164 char *strupr (const char *a)
165 {
166  int i;
167  int j;
168  char *b;
169 
170  j = strlen (a);
171  b = (char *) malloc (j+1);
172  for (i = 0; i < j; i++) b[i] = toupper (a[i]);
173  b[j] = '\0';
174  return (b);
175 }
176 #endif
177 
178 #ifndef HAVE_ITOA
179 char* itoa ( int a, char* b, int c)
180 {
181  sprintf(b, "%d", a );
182  return b;
183 }
184 #endif
int crc32buf(const void *vbuf, int len)
Definition: misc.cpp:135
miscellaneous functions which are used by ASC and all its tools
double atof(const std::string &s)
Definition: misc.cpp:157
int getFirstBit(int zahl)
Count the number of zero bits on the LSB side of "zahl".
Definition: misc.cpp:45
#define UPDC32(octet, crc)
Definition: misc.cpp:132
char strstring[1000]
Definition: misc.cpp:42
char * strupr(const char *a)
Definition: misc.cpp:164
Global platform dependant definitions. This file just branches to the platform specific files in thei...
const char * letter[]
Definition: misc.cpp:38
unsigned int UNS_32_BITS
Definition: misc.cpp:82
char * malloc(int)
const char * digit[]
Definition: misc.cpp:37
char * strrr(int a)
converts a to a string.
Definition: misc.cpp:66
void log(const Vehicle *attacker, const Vehicle *attackee)
Definition: attack.cpp:417
char * itoa(int a, char *b, int c)
Definition: misc.cpp:179
int atoi(const std::string &s)
Definition: misc.cpp:152
static UNS_32_BITS crc_32_tab[]
Definition: misc.cpp:85