static lua_Number readhexa (const char **s, lua_Number r, int *count) { for (; lisxdigit(cast_uchar(**s)); (*s)++) { /* read integer part */ r = (r * cast_num(16.0)) + cast_num(luaO_hexavalue(cast_uchar(**s))); (*count)++; } return r; }
/* ** convert an hexadecimal numeric string to a number, following ** C99 specification for 'strtod' */ static lua_Number lua_strx2number (const char *s, char **endptr) { lua_Number r = 0.0; /* result (accumulator) */ int sigdig = 0; /* number of significant digits */ int nosigdig = 0; /* number of non-significant digits */ int e = 0; /* exponent correction */ int neg = 0; /* 1 if number is negative */ int dot = 0; /* true after seen a dot */ *endptr = cast(char *, s); /* nothing is valid yet */ while (lisspace(cast_uchar(*s))) s++; /* skip initial spaces */ neg = isneg(&s); /* check signal */ if (!(*s == '0' && (*(s + 1) == 'x' || *(s + 1) == 'X'))) /* check '0x' */ return 0.0; /* invalid format (no '0x') */ for (s += 2; ; s++) { /* skip '0x' and read numeral */ if (*s == '.') { if (dot) break; /* second dot? stop loop */ else dot = 1; } else if (lisxdigit(cast_uchar(*s))) { if (sigdig == 0 && *s == '0') { /* non-significant zero? */ nosigdig++; if (dot) e--; /* zero after dot? correct exponent */ } else { if (++sigdig <= MAXSIGDIG) { /* can read it without overflow? */ r = (r * cast_num(16.0)) + luaO_hexavalue(cast_uchar(*s)); if (dot) e--; /* decimal digit */ } else /* too many digits; ignore */ if (!dot) e++; /* still count it for exponent */ } } else break; /* neither a dot nor a digit */ } if (nosigdig + sigdig == 0) /* no digits? */ return 0.0; /* invalid format */ *endptr = cast(char *, s); /* valid up to here */ e *= 4; /* each digit multiplies/divides value by 2^4 */ if (*s == 'p' || *s == 'P') { /* exponent part? */ int exp1 = 0; /* exponent value */ int neg1; /* exponent signal */ s++; /* skip 'p' */ neg1 = isneg(&s); /* signal */ if (!lisdigit(cast_uchar(*s))) return 0.0; /* invalid; must have at least one digit */ while (lisdigit(cast_uchar(*s))) /* read exponent */ exp1 = exp1 * 10 + *(s++) - '0'; if (neg1) exp1 = -exp1; e += exp1; *endptr = cast(char *, s); /* valid up to here */ }
char *tempnam(const char *dir, const char *pfx) { static int counter = 0; unsigned char *d, *s, *a; int l; if (!(d = cast_uchar getenv("TMPDIR"))) { if (dir) d = cast_uchar dir; else if (!(d = cast_uchar getenv("TMP")) && !(d = cast_uchar getenv("TEMP"))) { #ifdef P_tmpdir d = cast_uchar(P_tmpdir); #else d = cast_uchar "/tmp"; #endif } } l = 0; s = init_str(); add_to_str(&s, &l, d); if (s[0] && s[strlen(cast_const_char s) - 1] != '/') add_chr_to_str(&s, &l, '/'); add_to_str(&s, &l, cast_uchar pfx); add_num_to_str(&s, &l, counter++); a = cast_uchar strdup(cast_const_char s); mem_free(s); return cast_char a; }
int luaZ_fill (ZIO *z) { size_t size; terra_State *T = z->L; const char *buff; buff = z->reader(T->L, z->data, &size); if (buff == NULL || size == 0) return EOZ; z->n = size - 1; /* discount char being returned */ z->p = buff; return cast_uchar(*(z->p++)); }
int luaO_str2d (const char *s, size_t len, lua_Number *result) { char *endptr; if (strpbrk(s, "nN")) /* reject 'inf' and 'nan' */ return 0; else if (strpbrk(s, "xX")) /* hexa? */ *result = lua_strx2number(s, &endptr); else *result = lua_str2number(s, &endptr); if (endptr == s) return 0; /* nothing recognized */ while (lisspace(cast_uchar(*endptr))) endptr++; return (endptr == s + len); /* OK if no trailing characters */ }
const char *luaX_token2str (LexState *ls, int token) { if (token < FIRST_RESERVED) { /* single-byte symbols? */ lua_assert(token == cast_uchar(token)); return luaO_pushfstring(ls->L, "'%c'", token); } else { const char *s = luaX_tokens[token - FIRST_RESERVED]; if (token < TK_EOS) /* fixed format (symbols and reserved words)? */ return luaO_pushfstring(ls->L, "'%s'", s); else /* names, strings, and numerals */ return s; } }
/* ** convert an hexadecimal numeric string to a number, following ** C99 specification for 'strtod' */ static lua_Number lua_strx2number (const char *s, char **endptr) { lua_Number r = 0.0; int e = 0, i = 0; int neg = 0; /* 1 if number is negative */ *endptr = cast(char *, s); /* nothing is valid yet */ while (lisspace(cast_uchar(*s))) s++; /* skip initial spaces */ neg = isneg(&s); /* check signal */ if (!(*s == '0' && (*(s + 1) == 'x' || *(s + 1) == 'X'))) /* check '0x' */ return 0.0; /* invalid format (no '0x') */ s += 2; /* skip '0x' */ r = readhexa(&s, r, &i); /* read integer part */ if (*s == '.') { s++; /* skip dot */ r = readhexa(&s, r, &e); /* read fractional part */ } if (i == 0 && e == 0) return 0.0; /* invalid format (no digit) */ e *= -4; /* each fractional digit divides value by 2^-4 */ *endptr = cast(char *, s); /* valid up to here */ if (*s == 'p' || *s == 'P') { /* exponent part? */ int exp1 = 0; int neg1; s++; /* skip 'p' */ neg1 = isneg(&s); /* signal */ if (!lisdigit(cast_uchar(*s))) goto ret; /* must have at least one digit */ while (lisdigit(cast_uchar(*s))) /* read exponent */ exp1 = exp1 * 10 + *(s++) - '0'; if (neg1) exp1 = -exp1; e += exp1; } *endptr = cast(char *, s); /* valid up to here */ ret: if (neg) r = -r; return l_mathop(ldexp)(r, e); }
unsigned char *get_text_translation(unsigned char *text, struct terminal *term) { unsigned char **current_tra; struct conv_table *conv_table; unsigned char *trn; int charset; if (!term) charset = 0; else if (term->spec) charset = term->spec->charset; else charset = utf8_table; if (is_direct_text(text)) return text; if ((current_tra = translation_array[current_language][charset])) { unsigned char *tt; if ((trn = current_tra[text - dummyarray])) return trn; tr: if (!(tt = cast_uchar translations[current_language].t[text - dummyarray].name)) { trn = cast_uchar translation_english[text - dummyarray].name; } else { struct document_options l_opt; memset(&l_opt, 0, sizeof(l_opt)); l_opt.plain = 0; l_opt.cp = charset; conv_table = get_translation_table(current_lang_charset, charset); trn = convert_string(conv_table, tt, (int)strlen(cast_const_char tt), &l_opt); if (!strcmp(cast_const_char trn, cast_const_char tt)) { mem_free(trn); trn = tt; } } current_tra[text - dummyarray] = trn; } else { if (current_lang_charset && charset != current_lang_charset) { current_tra = translation_array[current_language][charset] = mem_alloc(sizeof (unsigned char **) * T__N_TEXTS); memset(current_tra, 0, sizeof (unsigned char **) * T__N_TEXTS); goto tr; } if (!(trn = cast_uchar translations[current_language].t[text - dummyarray].name)) { trn = cast_uchar(translations[current_language].t[text - dummyarray].name = translation_english[text - dummyarray].name); /* modifying translation structure */ } } return trn; }
static lua_Number lua_strb2number (const char *s, char **endptr) { lua_Number r = 0.0; int i = 0; int f = 0; *endptr = cast(char *, s); /* nothing is valid yet */ while (lisspace(cast_uchar(*s))) s++; /* skip initial spaces */ if (!(*s == '0' && (*(s + 1) == 'b' || *(s + 1) == 'B'))) /* check '0b' */ return 0.0; /* invalid format (no '0b') */ s += 2; /* skip '0b' */ while ((*s == '0') || (*s == '1')) { f = 0; r *= 2.0; if (*s == '1') r += 1.0; i++; s++; while (*s == '_') {s++; f = 1;} } if ((i == 0) || (f > 0)) return 0.0; /* invalid format */ *endptr = cast(char *, s); /* valid up to here */ return r; }