25 const char *p = s.
name;
27 for (i=0; i<s.
len; i++) {
28 h = (h << 5) - h + *p++;
32 #define sym_hash_equal(mrb,a, b) (a.len == b.len && memcmp(a.name, b.name, a.len) == 0)
40 khash_t(n2s) *h = mrb->name2sym;
56 sname.
name = (
const char*)p;
87 return mrb_symbol_value(
kh_value(h, k));
89 return mrb_nil_value();
194 return mrb_bool_value(equal_p);
247 # define SIGN_EXTEND_CHAR(c) ((signed char)(c))
250 # define SIGN_EXTEND_CHAR(c) ((((unsigned char)(c)) ^ 128) - 128)
252 #define is_identchar(c) (SIGN_EXTEND_CHAR(c)!=-1&&(ISALNUM(c) || (c) == '_'))
255 is_special_global_name(
const char* m)
258 case '~':
case '*':
case '$':
case '?':
case '!':
case '@':
259 case '/':
case '\\':
case ';':
case ',':
case '.':
case '=':
260 case ':':
case '<':
case '>':
case '\"':
261 case '&':
case '`':
case '\'':
case '+':
278 symname_p(
const char *name)
280 const char *m = name;
283 if (!m)
return FALSE;
289 if (is_special_global_name(++m))
return TRUE;
293 if (*++m ==
'@') ++m;
298 case '<': ++m;
break;
299 case '=':
if (*++m ==
'>') ++m;
break;
306 case '>':
case '=': ++m;
break;
313 case '~': ++m;
break;
314 case '=':
if (*++m ==
'=') ++m;
break;
315 default:
return FALSE;
320 if (*++m ==
'*') ++m;
323 if (*++m ==
'=') ++m;
326 if (*++m ==
'@') ++m;
329 if (*++m ==
'|') ++m;
332 if (*++m ==
'&') ++m;
335 case '^':
case '/':
case '%':
case '~':
case '`':
340 if (*++m !=
']')
return FALSE;
341 if (*++m ==
'=') ++m;
351 case '!':
case '?':
case '=': ++m;
371 memcpy(
RSTRING(str)->ptr+1, name, len);
372 if (!symname_p(name) || strlen(name) != len) {
374 memcpy(
RSTRING(str)->ptr,
":\"", 2);
386 if (!name)
return mrb_undef_value();
388 if (symname_p(name) && strlen(name) == len) {
400 if (!name)
return NULL;
401 if (symname_p(name) && strlen(name) == len) {
410 #define lesser(a,b) (((a)>(b))?(b):(a))
422 if (sym1 == sym2)
return mrb_fixnum_value(0);
426 size_t len, len1, len2;
431 retval = memcmp(p1, p2, len);
433 if (len1 == len2)
return mrb_fixnum_value(0);
434 if (len1 > len2)
return mrb_fixnum_value(1);
435 return mrb_fixnum_value(-1);
437 if (retval > 0)
return mrb_fixnum_value(1);
438 return mrb_fixnum_value(-1);