EXPORT int string_compare_encoded (const char * ap, const char * bp) { if (ap == NULL) return (bp == NULL) ? 0 : -1; if (bp == NULL) return 1; unsigned char a = * ap ++, b = * bp ++; for (; a || b; a = * ap ++, b = * bp ++) { if (a == '%' && ap[0] && ap[1]) { a = (FROM_HEX (ap[0]) << 4) | FROM_HEX (ap[1]); ap += 2; } if (b == '%' && bp[0] && bp[1]) { b = (FROM_HEX (bp[0]) << 4) | FROM_HEX (bp[1]); bp += 2; } if (a > '9' || b > '9' || a < '0' || b < '0') { if (a <= 'Z' && a >= 'A') a += 'a' - 'A'; if (b <= 'Z' && b >= 'A') b += 'a' - 'A'; if (a > b) return 1; if (a < b) return -1; } else { int x = a - '0'; for (; (a = * ap) <= '9' && a >= '0'; ap ++) x = 10 * x + (a - '0'); int y = b - '0'; for (; (b = * bp) >= '0' && b <= '9'; bp ++) y = 10 * y + (b - '0'); if (x > y) return 1; if (x < y) return -1; } } return 0; }
static int get_cpiohdr(unsigned char *buf, long *size, long *namesize, long *chksum) { struct new_ascii_header *cpiohdr; cpiohdr = (struct new_ascii_header *)buf; if (strncmp(cpiohdr->c_magic, "070702", 6) != 0) { ERROR("CPIO Format not recognized: magic not found\n"); return -EINVAL; } *size = FROM_HEX(cpiohdr->c_filesize); *namesize = FROM_HEX(cpiohdr->c_namesize); *chksum = FROM_HEX(cpiohdr->c_chksum); return 0; }
EXPORT void str_decode_percent (const char * str, int len, char * out) { if (len < 0) len = INT_MAX; while (len --) { char c = * str ++; if (! c) break; if (c == '%' && len >= 2 && str[0] && str[1]) { c = (FROM_HEX (str[0]) << 4) | FROM_HEX (str[1]); str += 2; len -= 2; } * out ++ = c; } * out = 0; }