char* unescape_string(char* string) { /* * Description: given an input stream converts escaped characters into their appropriate char representation and returns it as a new string * Parameters: string to be converted * Modifies: nothing * Returns: resulting string with all the escaped characters with their appropriate values * */ //printf("unecaping: %s\n", string); char* unescaped_string = (char*)malloc(strlen(string) * sizeof(char) + 1); int current_position = 0; int unescaped_string_position = 0; unsigned char escape_character = 0; for(current_position = 0; current_position < strlen(string); current_position++) { escape_character = *(string + current_position); if(*(string + current_position) == '\\') { if(*(string + current_position + 1) == 'x') { current_position++; int hex_count; escape_character = 0; for(hex_count = 1; hex_count <= MAX_HEX_CHARS; hex_count++) { if(!isxdigit(*(string + current_position + hex_count))) { break; } escape_character = escape_character * 16 + char_to_hex(*(string + current_position + hex_count)); } hex_count--; current_position += hex_count; } else if(is_oct_digit((*(string + current_position + 1))) == 1) { int oct_count; escape_character = 0; for(oct_count = 1; oct_count <= MAX_OCT_CHARS; oct_count++) { if(is_oct_digit(*(string + current_position + oct_count)) == 0) { break; } escape_character = escape_character * 8 + char_to_oct(*(string + current_position + oct_count)); } current_position += oct_count; } else { escape_character = is_escape_character(*(string + current_position + 1)); if(escape_character == 0) { escape_character = *(string + current_position); } else { current_position++; } } } *(unescaped_string + unescaped_string_position) = escape_character; unescaped_string_position++; escape_character = 0; } *(unescaped_string + unescaped_string_position + 1) = '\0'; return unescaped_string; }
Long VG_(strtoll8) ( Char* str, Char** endptr ) { Bool neg = False; Long n = 0, digit = 0; // Skip leading whitespace. while (VG_(isspace)(*str)) str++; // Allow a leading '-' or '+'. if (*str == '-') { str++; neg = True; } else if (*str == '+') { str++; } while (is_oct_digit(*str, &digit)) { n = 8*n + digit; str++; } if (neg) n = -n; if (endptr) *endptr = str; // Record first failing character. return n; }
int regex_parser::process_escape(const char *re, int ptr, int_set *chars){ if (ptr==strlen(re)){ return (++ptr); //fatal("regex_parser:: process_escape: \\ in last position."); } char c=re[ptr]; int next; if(is_x(c)){ if(ptr>strlen(re)-3) fatal("regex_parser::process_escape: invalid hex escape sequence."); else if (!is_hex_digit(re[ptr+1]) || !is_hex_digit(re[ptr+2])) fatal("regex_parser::process_escape: invalid hex escape sequence."); else{ char tmp[5]; tmp[0]='0';tmp[1]=c;tmp[2]=re[ptr+1];tmp[3]=re[ptr+2]; tmp[4]='\0'; sscanf(tmp,"0x%x", &next); chars->insert(next); ptr=ptr+3; } }else if (is_oct_digit(c)){ if(ptr>strlen(re)-3) {next=escaped(c);ptr++;chars->insert(next);} //normal escape sequence else if (!is_oct_digit(re[ptr+1]) || !is_oct_digit(re[ptr+2])) {next=escaped(c);ptr++;chars->insert(next);} //normal escape sequence else{ //really an octal sequence! char tmp[5]; tmp[0]='0';tmp[1]=c;tmp[2]=re[ptr+1];tmp[3]=re[ptr+2]; tmp[4]='\0'; sscanf(tmp,"0%o", &next); chars->insert(next); ptr=ptr+3; } }else if(c=='s'){ chars->insert('\t'); chars->insert('\n'); chars->insert('\r'); chars->insert('\x0C'); chars->insert('\x20'); ptr++; }else if(c=='S'){ chars->insert('\t'); chars->insert('\n'); chars->insert('\r'); chars->insert('\x0C'); chars->insert('\x20'); chars->negate(); ptr++; }else if(c=='d'){ chars->insert('0');chars->insert('1');chars->insert('2'); chars->insert('3');chars->insert('4');chars->insert('5'); chars->insert('6');chars->insert('7');chars->insert('8'); chars->insert('9'); ptr++; }else if(c=='D'){ chars->insert('0');chars->insert('1');chars->insert('2'); chars->insert('3');chars->insert('4');chars->insert('5'); chars->insert('6');chars->insert('7');chars->insert('8'); chars->insert('9'); chars->negate(); ptr++; }else if(c=='w'){ chars->insert('_'); chars->insert('0');chars->insert('1');chars->insert('2'); chars->insert('3');chars->insert('4');chars->insert('5'); chars->insert('6');chars->insert('7');chars->insert('8'); chars->insert('9'); chars->insert('a');chars->insert('b');chars->insert('c'); chars->insert('d');chars->insert('e');chars->insert('f'); chars->insert('g');chars->insert('h');chars->insert('i'); chars->insert('j');chars->insert('k');chars->insert('l'); chars->insert('m');chars->insert('n');chars->insert('o'); chars->insert('p');chars->insert('q');chars->insert('r'); chars->insert('s');chars->insert('t');chars->insert('u'); chars->insert('v');chars->insert('w');chars->insert('x'); chars->insert('y');chars->insert('z'); chars->insert('A');chars->insert('B');chars->insert('C'); chars->insert('D');chars->insert('E');chars->insert('F'); chars->insert('G');chars->insert('H');chars->insert('I'); chars->insert('J');chars->insert('K');chars->insert('L'); chars->insert('M');chars->insert('N');chars->insert('O'); chars->insert('P');chars->insert('Q');chars->insert('R'); chars->insert('S');chars->insert('T');chars->insert('U'); chars->insert('V');chars->insert('W');chars->insert('X'); chars->insert('Y');chars->insert('Z'); ptr++; }else if(c=='W'){ chars->insert('_'); chars->insert('0');chars->insert('1');chars->insert('2'); chars->insert('3');chars->insert('4');chars->insert('5'); chars->insert('6');chars->insert('7');chars->insert('8'); chars->insert('9'); chars->insert('a');chars->insert('b');chars->insert('c'); chars->insert('d');chars->insert('e');chars->insert('f'); chars->insert('g');chars->insert('h');chars->insert('i'); chars->insert('j');chars->insert('k');chars->insert('l'); chars->insert('m');chars->insert('n');chars->insert('o'); chars->insert('p');chars->insert('q');chars->insert('r'); chars->insert('s');chars->insert('t');chars->insert('u'); chars->insert('v');chars->insert('w');chars->insert('x'); chars->insert('y');chars->insert('z'); chars->insert('A');chars->insert('B');chars->insert('C'); chars->insert('D');chars->insert('E');chars->insert('F'); chars->insert('G');chars->insert('H');chars->insert('I'); chars->insert('J');chars->insert('K');chars->insert('L'); chars->insert('M');chars->insert('N');chars->insert('O'); chars->insert('P');chars->insert('Q');chars->insert('R'); chars->insert('S');chars->insert('T');chars->insert('U'); chars->insert('V');chars->insert('W');chars->insert('X'); chars->insert('Y');chars->insert('Z'); chars->negate(); ptr++; }else{ next=escaped(c); chars->insert(next); ptr++; } return ptr; }
long parse_integer(char *str, char **endptr, int len, int base, int *err){ if(len == 0){ len = strlen(str); } //since signed overflow is undefined and I don't really //want to use gmp for this, use an unsigned long to hold the value uint64_t num = 0; int i = 0, negitive = 0, overflow = 0; //ignore leading space while(isspace(str[i]) && ++i < len); if(i < len){ if(str[i] == '-'){ negitive = 1; i++; } } if(i == len){ if(endptr){*endptr = str;} return 0; } #define TO_NUMBER(start, end, base) \ ({uint64_t number = 0, next = 0; \ int j; \ for(j = start; j < end; j++){ \ next = (number * base) + char_to_number(str[j]); \ if(next < number){/*overflow*/ \ overflow = j; \ break; \ } else { \ number = next; \ } \ } \ number;}) //I'm pretty sure this will cause an error if the string is something like //0x abcdefg. It should be read as a 0, but I'm not sure what will happen if(base == 0 && ((i+1) < len)){ if(str[i] == '0' && str[i+1] == 'x'){ base = 16; i+=2; } else if(str[i] == '0' && str[i+1] == 'o'){ base = 8; i+=2; } else if(str[i] == '0' && str[i+1] == 'b'){ base = 2; i+=2; } else { base = 10; } } while(str[i] == '0' && ++i < len);//read leading zeros if(i == len){ if(endptr){*endptr = (str+i);} return 0; } /* Use special cases for 2, 8, 10, and 16 to speed them up. Multiplies in base 2, 8, or 16 become shifts, and for x86 at least a multiply by 10 becomes two lea instructions. */ #define DO_CASE(base) \ if(i <= max_length_per_base[base]){ \ num = TO_NUMBER(start, i, base); \ } \ if(i > max_length_per_base[base] || overflow > 0 || num>LONG_MAX){ \ *err = errno = ERANGE; \ *endptr = (str+i); \ return (negitive ? LONG_MIN : LONG_MAX); \ } int start = i; if(base == 10){ while(isdigit(str[i]) && ++i < len); DO_CASE(base); } else if(base == 16){ while(isxdigit(str[i]) && ++i < len); DO_CASE(base); } else if(base == 8){ while(is_oct_digit(str[i]) && ++i < len); DO_CASE(base); } else if(base == 2){ while(is_binary_digit(str[i]) && ++i < len); DO_CASE(base); } else if(base < 10){ i = memspn((uint8_t*)str + i, len - i, valid_digits, base); DO_CASE(base); } else { i = memspn((uint8_t*)str + i, len -i, valid_digits, 10 + (base-10)*2); DO_CASE(base); } if(endptr){*endptr = (str + i);} return (long)(negitive ? -num : num); }