README.md

libpercented

Библиотека на C для процентного кодирования и декодирования по умолчанию кодирует или декодирует весь заданный ввод, но имеется возможность задать свои правилам, такие как:

  • какие байты ввода не кодировать, а выводить как есть;
  • какие байты ввода не кодировать, а заменять на другие;

Это позволяет например кодировать компоненты URL адресов по заданным правилам, и/или декодировать их (или адреса целиком).

Не использует выделения памяти, работает с входным и выходным буферами, кодирует и декодирует данные целиком Можно использовать не как библиотеку, а просто расположить percented.c и percented.h в дереве исходников вашего проекта.

Зависимости

  • Заголовки
    • stddef.h
  • C компилятор
    • C99 или C11

Установка и удаление

Глобально

make
sudo make install
sudo make uninstall

Локально

make
make PREFIX=$HOME/.local install
make PREFIX=$HOME/.local uninstall

Независимо

make
make DESTDIR=$HOME/some_you_dir install
make DESTDIR=$HOME/some_you_dir uninstall

Использование

Минимальный пример кодирования

/* https://creativecommons.org/public-domain/cc0/  */
#include <stdio.h>
#include <string.h>
#include "percented.h"
int main(int argc, char **argv)
{
    /* prepare input */
    unsigned char inp[] =
    "https://example.com/file?name=фо то.jpg&name=img.png#название";
    size_t        inp_size = strlen(inp);
    /* prepare ouput */
    size_t        out_size = inp_size * 3;
    unsigned char out[out_size];
    /* prepare variable to save data len (can ignore it and set NULL) */
    size_t        written = 0;
    /* set data, if last parametr is NULL encode all input bytes */
    int status = percented_encode(inp,inp_size,out,out_size,&written,NULL);
    if(status != PERCENTED_SUCCESS)
    {
        fprintf(stderr,"Error: code = %d\n",status);
        return status;
    }
    /* out_size > written size, in this case need set '\0' */
    out[written] = '\0';
    /* show result */
    printf("data = %s  size = %d\n",out, written);
    return 0;
}
cc encode.c -o app libpercented.a
./app
data = %68%74%74%70%73%3A%2F%2F%65%78%61%6D%70%6C%65%2E%63%6F%6D%2F%66%69%6C%65%3F%6E%61%6D%65%3D%D1%84%D0%BE%20%D1%82%D0%BE%2E%6A%70%67%26%6E%61%6D%65%3D%69%6D%67%2E%70%6E%67%23%D0%BD%D0%B0%D0%B7%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5  size = 219

Минимальный пример декодирования

/* This example code licensed as Public Domain CC0 */
/* https://creativecommons.org/public-domain/cc0/  */
#include <stdio.h>
#include <string.h>
#include "percented.h"
int main(int argc, char **argv)
{
    /* prepare input */
    unsigned char inp[] =
    "https%3A%2F%2Fexample.com%2Ffile%3Fname%3D%D1%84%D0%BE+%D1%82%D0%BE.jpg"
    "%26name%3Dimg.png%23%D0%BD%D0%B0%D0%B7%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5";
    size_t        inp_size = strlen(inp);
    /* prepare ouput */
    size_t        out_size = inp_size; /* or calculate own */
    unsigned char out[out_size];
    /* prepare variable to save data len (can ignore it and set NULL) */
    size_t        written = 0;
    /* set data, if last parametr is NULL try just decode all */
    int status = percented_decode(inp,inp_size,out,out_size,&written,NULL);
    if(status != PERCENTED_SUCCESS)
    {
        fprintf(stderr,"Error: code = %d\n",status);
        return status;
    }
    /*out_size > written size, in this case need set '\0' */
    out[written] = '\0';
    printf("data = %s  size = %d\n",out, written);
    return 0;
}
cc decode.c -o app libpercented.a
./app
data = https://example.com/file?name=фо+то.jpg&name=img.png#название  size = 73

Пример использования кодирования по своим правилам

#include <string.h>
#include "percented.h"
int main(int argc, char **argv)
{
    /* create you own rule */
    unsigned char ignore[] =
    "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~";
    unsigned char replace_from[] = " ";
    unsigned char replace_to[]   = "+";
    struct percented rule;
    int reg_status =  percented_register(ignore,replace_from,replace_to,&rule);
    if(reg_status != PERCENTED_SUCCESS)
    {
        fprintf(stderr,"Error: code = %c\n",reg_status);
        return reg_status;
    }
    /* prepare input */
    unsigned char inp[] =
    "https://example.com/file?name=фо то.jpg&name=img.png#название";
    size_t        inp_size = strlen(inp);
    /* prepare ouput */
    size_t        out_size = inp_size * 3;
    unsigned char out[out_size];
    /* prepare variable to save data len (can ignore it and set NULL) */
    size_t        written = 0;
    int status = percented_encode(inp,inp_size,out,out_size,&written,&rule);
    if(status != PERCENTED_SUCCESS)
    {
        fprintf(stderr,"Error: code = %d\n",status);
        return status;
    }
    /*out_size > written size, in this case need set '\0' */
    out[written] = '\0';
    printf("data = %s  size = %d\n",out, written);
    return 0;
}
cc custom.c -o app libpercented.a
./app
data = https%3A%2F%2Fexample.com%2Ffile%3Fname%3D%D1%84%D0%BE+%D1%82%D0%BE.jpg%26name%3Dimg.png%23%D0%BD%D0%B0%D0%B7%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5  size = 139

На заметку

Кажется всё работает правильно. Потоковый механизм кодирования и декодирования в планах.

Описание

Процентное кодирование и декодирование

Конвейеры
0 успешных
0 с ошибкой