Changeset 526 in kBuild
- Timestamp:
- Sep 16, 2006 2:37:51 PM (19 years ago)
- Location:
- trunk/src/gmake
- Files:
-
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/gmake/config.h.W32
r503 r526 228 228 229 229 /* Define to 1 if you have the `strdup' function. */ 230 /* #define HAVE_STRDUP 1*/230 #define HAVE_STRDUP 1 /* bird */ 231 231 232 232 /* Define to 1 if you have the `strerror' function. */ … … 488 488 #undef BATCH_MODE_ONLY_SHELL 489 489 #endif 490 491 /* bird hacks */ 492 #include <sys/stat.h> 493 extern int my_stat(const char *, struct stat *); 494 #define stat(_path, _st) my_stat(_path, _st) -
trunk/src/gmake/expand.c
r503 r526 158 158 /* Expand a simple reference to variable NAME, which is LENGTH chars long. */ 159 159 160 #if def __GNUC__160 #if defined(__GNUC__) || defined(_MSC_VER) /* bird added MSC */ 161 161 __inline 162 162 #endif -
trunk/src/gmake/function.c
r520 r526 32 32 # include "pathstuff.h" 33 33 #endif 34 #include <assert.h> /* bird */ 34 35 35 36 … … 261 262 262 263 264 /* The maximum length of a function, once reached there is 265 it can't be function and we can skip the hash lookup drop out. */ 266 267 #define MAX_FUNCTION_LENGTH 10 /* bird */ 268 263 269 /* Look up a function by name. */ 264 270 #if defined(__GNUC__) || defined(_MSC_VER) 271 __inline 272 #endif 265 273 static const struct function_table_entry * 266 274 lookup_function (const char *s) 267 275 { 268 276 const char *e = s; 269 277 #ifdef MAX_FUNCTION_LENGTH 278 int left = MAX_FUNCTION_LENGTH; 279 int ch; 280 while (((ch = *e) >= 'a' && ch <='z') || ch == '-') 281 { 282 if (!left--) 283 return 0; 284 e++; 285 } 286 #else 270 287 while (*e && ( (*e >= 'a' && *e <= 'z') || *e == '-')) 271 288 e++; 289 #endif 272 290 if (*e == '\0' || isblank ((unsigned char) *e)) 273 291 { … … 2198 2216 *STRINGP past the reference and returning nonzero. If not, return zero. */ 2199 2217 2200 int 2201 handle_function (char **op, char **stringp) 2202 { 2203 const struct function_table_entry *entry_p; 2218 static int 2219 handle_function2 (const struct function_table_entry *entry_p, char **op, char **stringp) /* bird split it up. */ 2220 { 2204 2221 char openparen = (*stringp)[0]; 2205 2222 char closeparen = openparen == '(' ? ')' : '}'; … … 2213 2230 beg = *stringp + 1; 2214 2231 2215 entry_p = lookup_function (beg);2216 2217 if (!entry_p)2218 return 0;2219 2220 2232 /* We found a builtin function. Find the beginning of its arguments (skip 2221 2233 whitespace after the name). */ … … 2298 2310 2299 2311 return 1; 2312 } 2313 2314 int 2315 handle_function (char **op, char **stringp) /* bird split it up */ 2316 { 2317 const struct function_table_entry *entry_p = lookup_function (*stringp + 1); 2318 if (!entry_p) 2319 return 0; 2320 return handle_function2 (entry_p, op, stringp); 2300 2321 } 2301 2322 … … 2416 2437 hash_load (&function_table, function_table_init, 2417 2438 FUNCTION_TABLE_ENTRIES, sizeof (struct function_table_entry)); 2418 } 2439 #ifdef MAX_FUNCTION_LENGTH /* bird */ 2440 { 2441 unsigned i; 2442 for (i = 0; i < FUNCTION_TABLE_ENTRIES; i++) 2443 assert(function_table_init[i].len <= MAX_FUNCTION_LENGTH); 2444 } 2445 #endif 2446 } -
trunk/src/gmake/kmkbuiltin/mscfakes.h
r370 r526 120 120 #if _MSC_VER < 1400 121 121 int snprintf(char *buf, size_t size, const char *fmt, ...); 122 #else 123 #define snprintf _snprintf 122 124 #endif 123 125 size_t strlcpy(char *, const char *, size_t); -
trunk/src/gmake/variable.c
r520 r526 110 110 typedef signed short int int16_t; 111 111 # endif 112 static inline unsigned long variable_hash_b(register const unsigned char *var, register int length) 113 { 114 register unsigned long hash = 0; 115 for (;;) 116 { 117 switch (length) 118 { 119 default: 120 case 16: hash = *var++ + (hash << 6) + (hash << 16) - hash; 121 case 15: hash = *var++ + (hash << 6) + (hash << 16) - hash; 122 case 14: hash = *var++ + (hash << 6) + (hash << 16) - hash; 123 case 13: hash = *var++ + (hash << 6) + (hash << 16) - hash; 124 case 12: hash = *var++ + (hash << 6) + (hash << 16) - hash; 125 case 11: hash = *var++ + (hash << 6) + (hash << 16) - hash; 126 case 10: hash = *var++ + (hash << 6) + (hash << 16) - hash; 127 case 9: hash = *var++ + (hash << 6) + (hash << 16) - hash; 128 case 8: hash = *var++ + (hash << 6) + (hash << 16) - hash; 129 case 7: hash = *var++ + (hash << 6) + (hash << 16) - hash; 130 case 6: hash = *var++ + (hash << 6) + (hash << 16) - hash; 131 case 5: hash = *var++ + (hash << 6) + (hash << 16) - hash; 132 case 4: hash = *var++ + (hash << 6) + (hash << 16) - hash; 133 case 3: hash = *var++ + (hash << 6) + (hash << 16) - hash; 134 case 2: hash = *var++ + (hash << 6) + (hash << 16) - hash; 135 case 1: hash = *var++ + (hash << 6) + (hash << 16) - hash; 136 case 0: 137 break; 138 } 139 if (length <= 16) 112 static inline unsigned long variable_hash_2i(register const unsigned char *var, register int length) 113 { 114 register unsigned int hash = 0; 115 var += length; 116 switch (length) 117 { 118 default: 119 case 16: hash = *--var + (hash << 6) + (hash << 16) - hash; 120 case 15: hash = *--var + (hash << 6) + (hash << 16) - hash; 121 case 14: hash = *--var + (hash << 6) + (hash << 16) - hash; 122 case 13: hash = *--var + (hash << 6) + (hash << 16) - hash; 123 case 12: hash = *--var + (hash << 6) + (hash << 16) - hash; 124 case 11: hash = *--var + (hash << 6) + (hash << 16) - hash; 125 case 10: hash = *--var + (hash << 6) + (hash << 16) - hash; 126 case 9: hash = *--var + (hash << 6) + (hash << 16) - hash; 127 case 8: hash = *--var + (hash << 6) + (hash << 16) - hash; 128 case 7: hash = *--var + (hash << 6) + (hash << 16) - hash; 129 case 6: hash = *--var + (hash << 6) + (hash << 16) - hash; 130 case 5: hash = *--var + (hash << 6) + (hash << 16) - hash; 131 case 4: hash = *--var + (hash << 6) + (hash << 16) - hash; 132 case 3: hash = *--var + (hash << 6) + (hash << 16) - hash; 133 case 2: hash = *--var + (hash << 6) + (hash << 16) - hash; 134 case 1: hash = *--var + (hash << 6) + (hash << 16) - hash; 135 case 0: 140 136 break; 141 length -= 16;142 137 } 143 138 return hash; 144 139 } 145 140 146 static inline unsigned long variable_hash_ a(register const unsigned char *var, register int length)147 { 148 register unsigned longhash = ((5381 << 5) + 5381) + *var;141 static inline unsigned long variable_hash_1i(register const unsigned char *var, register int length) 142 { 143 register unsigned int hash = ((5381 << 5) + 5381) + *var; 149 144 switch (length) 150 145 { … … 169 164 #ifdef VARIABLE_HASH /* bird */ 170 165 # ifdef VARIABLE_HASH_STRICT 171 if (key->hash1 != variable_hash_ a(key->name, key->length))166 if (key->hash1 != variable_hash_1i (key->name, key->length)) 172 167 __asm__("int3"); 173 if (key->hash2 && key->hash2 != variable_hash_ b(key->name, key->length))168 if (key->hash2 && key->hash2 != variable_hash_2i (key->name, key->length)) 174 169 __asm__("int3"); 175 170 # endif … … 177 172 #else 178 173 # ifdef KMK 179 return variable_hash_ a(key->name, key->length);174 return variable_hash_1i (key->name, key->length); 180 175 # else 181 176 return_STRING_N_HASH_1 (key->name, key->length); … … 190 185 struct variable *key = (struct variable *) keyv; 191 186 if (!key->hash2) 192 key->hash2 = variable_hash_ b(key->name, key->length);187 key->hash2 = variable_hash_2i (key->name, key->length); 193 188 return key->hash2; 194 189 #else 195 190 struct variable const *key = (struct variable const *) keyv; 196 191 # ifdef KMK 197 return variable_hash_ b(key->name, key->length);192 return variable_hash_2i (key->name, key->length); 198 193 # else 199 194 return_STRING_N_HASH_2 (key->name, key->length); … … 210 205 if (result) 211 206 return result; 207 #ifdef VARIABLE_HASH_STRICT /* bird */ 208 if (x->hash1 != variable_hash_1i (x->name, x->length)) 209 __asm__("int3"); 210 if (x->hash2 && x->hash2 != variable_hash_2i (x->name, x->length)) 211 __asm__("int3"); 212 if (y->hash1 != variable_hash_1i (y->name, y->length)) 213 __asm__("int3"); 214 if (y->hash2 && y->hash2 != variable_hash_2i (y->name, y->length)) 215 __asm__("int3"); 216 #endif 217 #ifdef VARIABLE_HASH 218 /* hash 1 */ 219 result = x->hash1 - y->hash1; 220 if (result) 221 return result; 222 #endif 212 223 #ifdef KMK /* bird: speed */ 213 224 { … … 249 260 } 250 261 #endif /* KMK */ 251 #ifdef VARIABLE_HASH_STRICT /* bird */252 if (x->hash1 != variable_hash_a (x->name, x->length))253 __asm__("int3");254 if (x->hash2 && x->hash2 != variable_hash_b (x->name, x->length))255 __asm__("int3");256 if (y->hash1 != variable_hash_a (y->name, y->length))257 __asm__("int3");258 if (y->hash2 && y->hash2 != variable_hash_b (y->name, y->length))259 __asm__("int3");260 #endif261 262 #ifdef VARIABLE_HASH 262 263 /* hash 1 */ 264 result = (int)x->hash1 - (int)y->hash1; 263 /* hash 2 */ 264 if (!x->hash2) 265 ((struct variable *)x)->hash2 = variable_hash_2i (x->name, x->length); 266 if (!y->hash2) 267 ((struct variable *)y)->hash2 = variable_hash_2i (y->name, y->length); 268 result = x->hash2 - y->hash2; 265 269 if (result) 266 270 return result; 267 268 /* hash 2 */269 if (x->hash2 && y->hash2)270 {271 result = (int)x->hash2 - (int)y->hash2;272 if (result)273 return result;274 }275 271 #endif 276 272 #ifdef KMK … … 304 300 hash_init (&global_variable_set.table, 305 301 #ifdef KMK 306 1638 3,302 16384, 307 303 #else 308 304 VARIABLE_BUCKETS, … … 334 330 var_key.length = length; 335 331 #ifdef VARIABLE_HASH /* bird */ 336 var_key.hash1 = variable_hash_ a(name, length);332 var_key.hash1 = variable_hash_1i (name, length); 337 333 var_key.hash2 = 0; 338 334 #endif … … 374 370 v->length = length; 375 371 #ifdef VARIABLE_HASH /* bird */ 376 v->hash1 = variable_hash_ a(name, length);372 v->hash1 = variable_hash_1i (name, length); 377 373 v->hash2 = 0; 378 374 #endif … … 515 511 var_key.length = length; 516 512 #ifdef VARIABLE_HASH /* bird */ 517 var_key.hash1 = variable_hash_ a(name, length);513 var_key.hash1 = variable_hash_1i (name, length); 518 514 var_key.hash2 = 0; 519 515 #endif … … 522 518 setlist != 0; setlist = setlist->next) 523 519 { 520 #ifdef VARIABLE_HASH /* bird: speed */ 521 struct hash_table *ht = &setlist->set->table; 522 unsigned int hash_1 = var_key.hash1; 523 struct variable *v; 524 525 ht->ht_lookups++; 526 for (;;) 527 { 528 hash_1 &= (ht->ht_size - 1); 529 v = (struct variable *)ht->ht_vec[hash_1]; 530 531 if (v == 0) 532 break; 533 if ((void *)v != hash_deleted_item) 534 { 535 if (variable_hash_cmp(&var_key, v) == 0) 536 { 537 # ifdef VARIABLE_HASH_STRICT /* bird */ 538 struct variable *v2 = (struct variable *) hash_find_item ((struct hash_table *) &setlist->set->table, &var_key); 539 assert(v2 == v); 540 # endif 541 return v->special ? handle_special_var (v) : v; 542 } 543 ht->ht_collisions++; 544 } 545 if (!var_key.hash2) 546 var_key.hash2 = variable_hash_2i(name, length); 547 hash_1 += (var_key.hash2 | 1); 548 } 549 550 #else /* !VARIABLE_HASH */ 524 551 const struct variable_set *set = setlist->set; 525 552 struct variable *v; … … 528 555 if (v) 529 556 return v->special ? handle_special_var (v) : v; 557 #endif /* !VARIABLE_HASH */ 530 558 } 531 559 … … 604 632 var_key.length = length; 605 633 #ifdef VARIABLE_HASH /* bird */ 606 var_key.hash1 = variable_hash_ a(name, length);634 var_key.hash1 = variable_hash_1i (name, length); 607 635 var_key.hash2 = 0; 608 636 #endif … … 1138 1166 makelevel_key.length = MAKELEVEL_LENGTH; 1139 1167 #ifdef VARIABLE_HASH /* bird */ 1140 makelevel_key.hash1 = variable_hash_ a(MAKELEVEL_NAME, MAKELEVEL_LENGTH);1168 makelevel_key.hash1 = variable_hash_1i (MAKELEVEL_NAME, MAKELEVEL_LENGTH); 1141 1169 makelevel_key.hash2 = 0; 1142 1170 #endif … … 1200 1228 int append = 0; 1201 1229 int conditional = 0; 1230 const size_t varname_len = strlen (varname); /* bird */ 1202 1231 1203 1232 /* Calculate the variable's new value in VALUE. */ … … 1219 1248 /* A conditional variable definition "var ?= value". 1220 1249 The value is set IFF the variable is not defined yet. */ 1221 v = lookup_variable (varname, strlen (varname));1250 v = lookup_variable (varname, varname_len); 1222 1251 if (v) 1223 1252 return v; … … 1238 1267 { 1239 1268 append = 1; 1240 v = lookup_variable_in_set (varname, strlen (varname),1269 v = lookup_variable_in_set (varname, varname_len, 1241 1270 current_variable_set_list->set); 1242 1271 … … 1247 1276 } 1248 1277 else 1249 v = lookup_variable (varname, strlen (varname));1278 v = lookup_variable (varname, varname_len); 1250 1279 1251 1280 if (v == 0) … … 1316 1345 *p = '/'; 1317 1346 } 1318 v = define_variable_loc (varname, strlen (varname),1347 v = define_variable_loc (varname, varname_len, 1319 1348 shellpath, origin, flavor == f_recursive, 1320 1349 flocp); … … 1357 1386 *p = '/'; 1358 1387 } 1359 v = define_variable_loc (varname, strlen (varname),1388 v = define_variable_loc (varname, varname_len, 1360 1389 shellpath, origin, 1361 1390 flavor == f_recursive, flocp); 1362 1391 } 1363 1392 else 1364 v = lookup_variable (varname, strlen (varname));1393 v = lookup_variable (varname, varname_len); 1365 1394 1366 1395 free (path_string); … … 1370 1399 #endif /* __MSDOS__ */ 1371 1400 #ifdef WINDOWS32 1372 if ((origin == o_file || origin == o_override || origin == o_command) 1401 if ( varname_len == sizeof("SHELL") - 1 /* bird */ 1402 && (origin == o_file || origin == o_override || origin == o_command) 1373 1403 && streq (varname, "SHELL")) 1374 1404 { … … 1381 1411 if (find_and_set_default_shell (p)) 1382 1412 { 1383 v = define_variable_in_set (varname, strlen (varname), default_shell,1413 v = define_variable_in_set (varname, varname_len, default_shell, 1384 1414 origin, flavor == f_recursive, 1385 1415 (target_var … … 1390 1420 } 1391 1421 else 1392 v = lookup_variable (varname, strlen (varname));1422 v = lookup_variable (varname, varname_len); 1393 1423 } 1394 1424 else … … 1401 1431 make sure we define this variable in the global set. */ 1402 1432 1403 v = define_variable_in_set (varname, strlen (varname), p,1433 v = define_variable_in_set (varname, varname_len, p, 1404 1434 origin, flavor == f_recursive, 1405 1435 (target_var -
trunk/src/gmake/variable.h
r520 r526 54 54 int length; /* strlen (name) */ 55 55 #ifdef VARIABLE_HASH /* bird */ 56 long hash1;/* the primary hash */57 long hash2;/* the secondary hash */56 int hash1; /* the primary hash */ 57 int hash2; /* the secondary hash */ 58 58 #endif 59 59 char *value; /* Variable value. */ -
trunk/src/gmake/w32/pathstuff.c
r520 r526 234 234 } 235 235 236 #undef stat 236 237 /* 237 238 * Workaround for directory names with trailing slashes. … … 239 240 */ 240 241 int 241 stat(const char *path, struct stat *st)242 { 243 int rc = _stat(path, (struct _stat *)st);242 my_stat(const char *path, struct stat *st) 243 { 244 int rc = stat(path, st); 244 245 if ( rc != 0 245 246 && errno == ENOENT … … 255 256 tmp[len_path + 1] = '\0'; 256 257 errno = 0; 257 rc = _stat(tmp, (struct _stat *)st);258 rc = stat(tmp, st); 258 259 if ( rc == 0 259 260 && !S_ISDIR(st->st_mode))
Note:
See TracChangeset
for help on using the changeset viewer.