viric@19: #include viric@19: #include viric@19: #include "dictre.h" viric@19: viric@19: static int url_get(FILE *f) viric@19: { viric@19: int val; viric@19: viric@19: val = fgetc(f); viric@19: if (val == '%') viric@19: { viric@19: unsigned char num[3]; viric@19: num[2] = '\0'; viric@19: num[0] = fgetc(f); viric@19: num[1] = fgetc(f); viric@19: val = strtol(num, 0, 16); viric@19: } else if (val == '&') viric@19: return END_OF_URL; viric@19: else if (val == '+') viric@19: return ' '; viric@19: /*printf("[%i]", val);*/ viric@19: return val; viric@19: } viric@19: viric@19: static int char2num(unsigned char c) viric@19: { viric@19: if (c >= '0' && c <= '9') viric@19: return c - '0'; viric@19: if (c >= 'A' && c <= 'Z') viric@19: return c + 10 - 'A'; viric@19: if (c >= 'a' && c <= 'z') viric@19: return c + 10 - 'a'; viric@19: return 0; viric@19: } viric@19: viric@19: int http_getc(FILE *f) viric@19: { viric@19: int c; viric@19: static unsigned char tmp[6]; /* for a UTF-8 string */ viric@19: static int itmp = -1; viric@19: static int tmplen; viric@19: viric@19: if (itmp == -1) viric@19: { viric@19: c = url_get(f); viric@19: if (c == '&') viric@19: { viric@19: c = url_get(f); viric@19: if (c == '#') viric@19: { viric@19: char iserror = 0; viric@19: int entval; viric@19: /*Get number*/ viric@19: entval = 0; viric@19: while((c = url_get(f)) != ';') viric@19: { viric@19: /* Digits in base 10 */ viric@19: entval = char2num(c) + entval * 10; viric@19: } viric@19: /*printf("{%i}", entval);*/ viric@19: /*Get utf-8 version*/ viric@19: tmplen = 0; viric@19: U8_APPEND(tmp, tmplen, 6, entval, iserror); viric@19: if (iserror) viric@19: return -3; viric@19: /* We need not to program itmp for the next run viric@19: * if we have only one character to send */ viric@19: if (tmplen != 1) viric@19: itmp = 1; viric@19: return tmp[0]; viric@19: } viric@19: else viric@19: return HTTP_DECODE_ERROR; /* ERROR! */ viric@19: } viric@19: } else /* We already have a character to keep on sending */ viric@19: { viric@19: int tosend; viric@19: tosend = itmp; viric@19: ++itmp; viric@19: if (itmp == tmplen) viric@19: itmp = -1; viric@19: return tmp[tosend]; viric@19: } viric@19: return c; viric@19: }