/** * Encode URI field * * @v field URI field index * @v raw Raw data * @v raw_len Length of raw data * @v buf Buffer * @v len Length of buffer * @ret len Length of encoded string (excluding NUL) */ size_t uri_encode ( unsigned int field, const void *raw, size_t raw_len, char *buf, ssize_t len ) { const uint8_t *raw_bytes = ( ( const uint8_t * ) raw ); ssize_t remaining = len; size_t used; char c; /* Ensure encoded string is NUL-terminated even if empty */ if ( len > 0 ) buf[0] = '\0'; /* Copy string, escaping as necessary */ while ( raw_len-- ) { c = *(raw_bytes++); if ( uri_character_escaped ( c, field ) ) { used = ssnprintf ( buf, remaining, "%%%02X", c ); } else { used = ssnprintf ( buf, remaining, "%c", c ); } buf += used; remaining -= used; } return ( len - remaining ); }
/** * Encode URI field * * @v uri URI * @v field URI field index * @v buf Buffer to contain encoded string * @v len Length of buffer * @ret len Length of encoded string (excluding NUL) */ size_t uri_encode ( const char *string, unsigned int field, char *buf, ssize_t len ) { ssize_t remaining = len; size_t used; char c; /* Ensure encoded string is NUL-terminated even if empty */ if ( len > 0 ) buf[0] = '\0'; /* Copy string, escaping as necessary */ while ( ( c = *(string++) ) ) { if ( uri_character_escaped ( c, field ) ) { used = ssnprintf ( buf, remaining, "%%%02X", c ); } else { used = ssnprintf ( buf, remaining, "%c", c ); } buf += used; remaining -= used; } return ( len - remaining ); }