version 1.139, 2002/04/15 12:26:11
|
version 1.140, 2002/05/08 03:15:46
|
Line 99 char *EscapeURL (const char *url)
|
Line 99 char *EscapeURL (const char *url)
|
{ |
{ |
/* put here below all the chars that need to |
/* put here below all the chars that need to |
be escaped into %xx */ |
be escaped into %xx */ |
case 0x27: /* & */ |
|
case 0x20: /* space */ |
case 0x20: /* space */ |
|
case 0x26: /* & */ |
|
case 0x27: /* antislash */ |
new_chars = 3; |
new_chars = 3; |
break; |
break; |
|
|
Line 129 char *EscapeURL (const char *url)
|
Line 130 char *EscapeURL (const char *url)
|
} |
} |
} |
} |
/* escape the char */ |
/* escape the char */ |
if (new_chars == 3) |
if (new_chars == 3) |
{ |
{ |
buffer[buffer_len] = '%'; |
buffer[buffer_len] = '%'; |
EscapeChar (&buffer[buffer_len+1], *ptr); |
EscapeChar (&buffer[buffer_len+1], *ptr); |
} |
} |
else |
else |
buffer[buffer_len] = *ptr; |
buffer[buffer_len] = *ptr; |
|
|
|
/* update the status */ |
|
buffer_len += new_chars; |
|
buffer_free_mem -= new_chars; |
|
/* examine the next char */ |
|
ptr++; |
|
} |
|
buffer[buffer_len] = EOS; |
|
} |
|
else |
|
buffer = NULL; |
|
|
|
return (buffer); |
|
} |
|
|
|
/*---------------------------------------------------------------------- |
|
EscapeXML |
|
Takes a string and escapes all protected chars into entity |
|
sequences. |
|
Returns either NULL or a new buffer, which must be freed by the caller |
|
----------------------------------------------------------------------*/ |
|
char *EscapeXML (const char *string) |
|
{ |
|
char *buffer; |
|
int buffer_len; |
|
int buffer_free_mem; |
|
char *ptr; |
|
char *entity = NULL; |
|
int new_chars; |
|
void *status; |
|
|
|
if (string && *string) |
|
{ |
|
buffer_free_mem = strlen (string) + 20; |
|
buffer = TtaGetMemory (buffer_free_mem + 1); |
|
ptr = (char *) string; |
|
buffer_len = 0; |
|
|
|
while (*ptr) |
|
{ |
|
switch (*ptr) |
|
{ |
|
case 0x26: /* & */ |
|
entity = "&"; |
|
new_chars = 5; |
|
|
|
case '<': /* lt; */ |
|
entity = "<"; |
|
new_chars = 4; |
|
break; |
|
|
|
case '>': /* gt; */ |
|
entity = ">"; |
|
new_chars = 4; |
|
break; |
|
|
|
default: |
|
new_chars = 1; |
|
break; |
|
} |
|
|
|
/* see if we need extra room in the buffer */ |
|
if (new_chars > buffer_free_mem) |
|
{ |
|
buffer_free_mem = 20; |
|
status = TtaRealloc (buffer, sizeof (char) |
|
* (buffer_len + buffer_free_mem + 1)); |
|
if (status) |
|
buffer = (char *) status; |
|
else |
|
{ |
|
/* @@ maybe we should do some other behavior here, like |
|
freeing the buffer and return a void thing */ |
|
buffer[buffer_len] = EOS; |
|
break; |
|
} |
|
} |
|
/* escape the char */ |
|
if (entity) |
|
{ |
|
sprintf (&buffer[buffer_len], "%s", entity); |
|
entity = NULL; |
|
} |
|
else |
|
buffer[buffer_len] = *ptr; |
|
|
/* update the status */ |
/* update the status */ |
buffer_len += new_chars; |
buffer_len += new_chars; |
buffer_free_mem -= new_chars; |
buffer_free_mem -= new_chars; |