Example #1
0
File: uri.c Project: brain0/ipxe
/**
 * 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 );
}
Example #2
0
/**
 * 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 );
}