viric@0: #include viric@0: #include "dictre.h" viric@0: viric@0: static char * get_string(FILE *index, char *buffer) viric@0: { viric@0: int c; viric@0: int count; viric@0: viric@0: count = 0; viric@0: do viric@0: { viric@0: c = fgetc(index); viric@0: if(c == EOF) viric@0: { viric@0: count = 1; /* for next [count-1] */ viric@0: break; viric@0: } viric@0: buffer[count++] = (char) c; viric@0: } while(c != '\t' && c != '\n'); viric@0: viric@0: buffer[count-1] = '\0'; viric@0: } viric@0: viric@0: char * get_word(FILE *index) viric@0: { viric@0: char buffer[500]; viric@0: char *out; viric@0: int len; viric@0: viric@0: get_string(index, buffer); viric@0: viric@0: if ((len = strlen(buffer)) > 0) viric@0: { viric@0: out = (char *) malloc(len + 1); viric@0: strcpy(out, buffer); viric@0: } viric@0: else viric@0: out = 0; viric@0: viric@0: return out; viric@0: } viric@0: viric@0: static int char2val(char letter) viric@0: { viric@0: switch(letter) viric@0: { viric@0: case 'A': return 0; viric@0: case 'B': return 1; viric@0: case 'C': return 2; viric@0: case 'D': return 3; viric@0: case 'E': return 4; viric@0: case 'F': return 5; viric@0: case 'G': return 6; viric@0: case 'H': return 7; viric@0: case 'I': return 8; viric@0: case 'J': return 9; viric@0: case 'K': return 10; viric@0: case 'L': return 11; viric@0: case 'M': return 12; viric@0: case 'N': return 13; viric@0: case 'O': return 14; viric@0: case 'P': return 15; viric@0: case 'Q': return 16; viric@0: case 'R': return 17; viric@0: case 'S': return 18; viric@0: case 'T': return 19; viric@0: case 'U': return 20; viric@0: case 'V': return 21; viric@0: case 'W': return 22; viric@0: case 'X': return 23; viric@0: case 'Y': return 24; viric@0: case 'Z': return 25; viric@0: case 'a': return 26; viric@0: case 'b': return 27; viric@0: case 'c': return 28; viric@0: case 'd': return 29; viric@0: case 'e': return 30; viric@0: case 'f': return 31; viric@0: case 'g': return 32; viric@0: case 'h': return 33; viric@0: case 'i': return 34; viric@0: case 'j': return 35; viric@0: case 'k': return 36; viric@0: case 'l': return 37; viric@0: case 'm': return 38; viric@0: case 'n': return 39; viric@0: case 'o': return 40; viric@0: case 'p': return 41; viric@0: case 'q': return 42; viric@0: case 'r': return 43; viric@0: case 's': return 44; viric@0: case 't': return 45; viric@0: case 'u': return 46; viric@0: case 'v': return 47; viric@0: case 'w': return 48; viric@0: case 'x': return 49; viric@0: case 'y': return 50; viric@0: case 'z': return 51; viric@0: case '0': return 52; viric@0: case '1': return 53; viric@0: case '2': return 54; viric@0: case '3': return 55; viric@0: case '4': return 56; viric@0: case '5': return 57; viric@0: case '6': return 58; viric@0: case '7': return 59; viric@0: case '8': return 60; viric@0: case '9': return 61; viric@0: case '+': return 62; viric@8: case '/': return 63; viric@0: default: viric@0: return 0; viric@0: } viric@0: } viric@0: viric@14: int str2int_len(const char *str, int length) viric@0: { viric@0: int i = 0; viric@0: int val = 0; viric@0: viric@0: while (i < length) viric@0: { viric@0: val = char2val(str[i]) + val * 64; viric@0: ++i; viric@0: } viric@0: viric@0: return val; viric@0: } viric@0: viric@14: int str2int(const char *str) viric@14: { viric@14: int length = strlen(str); viric@14: return str2int_len(str, length); viric@14: } viric@14: viric@0: int get_int(FILE *index) viric@0: { viric@0: char buffer[500]; viric@0: int val; viric@0: viric@0: get_string(index, buffer); viric@0: viric@0: if (strlen(buffer) > 0) viric@0: { viric@0: val = str2int(buffer); viric@0: } else viric@0: val = -1; viric@0: viric@0: return val; viric@0: } viric@0: viric@0: char * get_def(FILE *fdefs, int offset, int length) viric@0: { viric@0: char *out; viric@0: fseek(fdefs, offset, SEEK_SET); viric@0: viric@10: out = (char *) malloc(length+1); viric@0: fread(out, length, 1, fdefs); viric@10: out[length] = 0; viric@0: return out; viric@0: } viric@8: viric@8: static char num_to_ia5char(int n) viric@8: { viric@8: /* From RFC 1421 */ viric@8: if (n >= 0 && n <= 25) viric@8: return 'A' + n; viric@8: else if (n >= 26 && n <= 51) viric@8: return 'a' + (n - 26); viric@8: else if (n >= 52 && n <= 61) viric@8: return '0' + (n - 52); viric@8: else if (n == 62) viric@8: return '+'; viric@8: else if (n == 63) viric@8: return '/'; viric@8: else viric@8: return '!'; /* Error */ viric@8: } viric@8: viric@8: int num_to_ia5(char *dest, int n) viric@8: { viric@8: char tmp[20]; viric@8: viric@8: int i, max; viric@8: viric@8: for(i =0; i <= 10; ++i) viric@8: { viric@8: tmp[i] = num_to_ia5char(n % 64); viric@8: if (n < 64) viric@8: break; viric@8: n /= 64; viric@8: } viric@8: viric@8: max = i; viric@8: viric@8: /* reverse the number */ viric@8: for (i=0; i<=max; ++i) viric@8: dest[i] = tmp[max-i]; viric@8: viric@8: /* Ending '\0' */ viric@8: dest[max+1] = '\0'; viric@8: return max; viric@8: }