- From: <Linus.Walleij@ecs.ericsson.se>
- Date: Wed, 17 Mar 1999 14:35:33 +0100
- To: frystyk@w3.org, www-lib@w3.org
> It would be really cool if you could make the converter the other way > and make these two function public and move them to HTWWWStr.c. > Interested? OK here is what I cooked up for HTWWWStr.c: /********************************************************** ** This routine encodes x-www-urlencoded, the string ** ** must be ISO 8859-1 dammit! If you compile on ** ** MSDOS / MacIntosh etcetera, make sure you convert ** ** your host specific character layouts to conform to ** ** to ISO 8859-1, ** ** Linus Walleij March 1999 ** **********************************************************/ char *HTURLEncode(char *cStrIn) { char *cNew; char *cPtr; char cHexChars[] = "0123456789ABCDEF"; size_t NewLength; NewLength = strlen(cStrIn); cNew = (char *) malloc(NewLength); cPtr = cNew; while (*cStrIn) { if (*cStrIn==' ') *cPtr = '+'; else if ( (*cStrIn>='0' && *cStrIn<='9') || (*cStrIn>='A' && *cStrIn<='Z') || (*cStrIn>='a' && *cStrIn<='z')) *cPtr = *cStrIn; else { NewLength += 2; *cPtr = '\0'; cNew = (char *) realloc(cNew, NewLength); cPtr = (char *) strchr(cNew, '\0'); *cPtr = '%'; cPtr++; *cPtr = cHexChars[((*cStrIn >> 4) & 0xF)]; cPtr++; *cPtr = cHexChars[(*cStrIn & 0xF)]; } cPtr++; cStrIn++; } *cPtr = '\0'; return cNew; } /********************************************************** ** This routine decodes x-www-urlencoded, any content ** ** that is not valid will be thrown away, and the ** ** string must be ISO 8859-1 dammit! If you compile on ** ** MSDOS / MacIntosh etcetera, make sure you convert ** ** your host specific character layouts to conform to ** ** to ISO 8859-1, ** ** Linus Walleij March 1999 ** **********************************************************/ char *HTURLDecode(char *cStrIn) { char *cNew; char *cPtr; char loNyb, hiNyb, bytByte; size_t OldLength; size_t NewLength; OldLength = NewLength = strlen(cStrIn); cNew = (char *) malloc(NewLength); cPtr = cNew; while (*cStrIn) { if (*cStrIn=='+') *cPtr = ' '; else if ( (*cStrIn>='0' && *cStrIn<='9') || (*cStrIn>='A' && *cStrIn<='Z') || (*cStrIn>='a' && *cStrIn<='z')) *cPtr = *cStrIn; else if (*cStrIn=='%') { NewLength -= 2; cStrIn++; hiNyb = *cStrIn; hiNyb -= (hiNyb < 0x60) ? 0 : 0x20; hiNyb -= (hiNyb <= 0x39) ? 0x30 : 0x37; cStrIn++; loNyb = *cStrIn; loNyb -= (loNyb < 0x60) ? 0 : 0x20; loNyb -= (loNyb <= 0x39) ? 0x30 : 0x37; *cPtr = (hiNyb << 4) | loNyb; } cPtr++; cStrIn++; } *cPtr = '\0'; if (NewLength < OldLength) cNew = (char *) realloc(cNew, NewLength); return cNew; } The routines work fine but if you want to add them to HTWWWStr.h I guess you have to look at how I allocate / reallocate memory, as I remembered libwww to use its own memory allocation routines. (HT_MALLOC?) I don't have a compiling codebase here so I can't try it out unfortunately :-/ Also using size_t as string size type could be avoided for avoiding porting problems, int is just as good I guess. After they've been added I'd recommend going through the query_url_encode and form_url_encode functions in HTAccess and correct them using calls to HTURLEncode / HTURLDecode as they are defunct as they look today. Allright I bet someone could hack up better encode/decode routines easily, but these work atleast... Linus Walleij
Received on Wednesday, 17 March 1999 08:40:09 UTC