21#define URLENC_COMMON 1
22#define URLENC_FUNC_ENCODE urlenc_enc_u16
23#define URLENC_FUNC_DECODE urlenc_dec_u16
24#define URLENC_T uint16_t
25#include "url_encoding.c"
27#define URLENC_FUNC_ENCODE urlenc_enc_u8
28#define URLENC_FUNC_DECODE urlenc_dec_u8
29#define URLENC_T uint8_t
30#include "url_encoding.c"
44 nlen = si.
end - si.
it;
46 if( enc == UR_ENC_LATIN1 )
49 uint8_t* (*func)(
const uint8_t*,
const uint8_t*, uint8_t*) =
50 decode ? urlenc_dec_u8 : urlenc_enc_u8;
52 cp = func( cp + si.
it, cp + si.
end, nstr->
ptr.
b );
55 else if( enc == UR_ENC_UCS2 )
58 uint16_t* (*func)(
const uint16_t*,
const uint16_t*, uint16_t*) =
59 decode ? urlenc_dec_u16 : urlenc_enc_u16;
61 cp = func( cp + si.
it, cp + si.
end, nstr->
ptr.
u16 );
67 "encode 'url requires latin1 or ucs2 string" );
90#define OPT_ENCODE_BOM 0x01
91 static const uint8_t _bomUtf8[3] = { 0xef, 0xbb, 0xbf };
92 const UCell* data = a2;
95 if( ur_isStringType( type ) )
100 if( ! ur_is(a1, UT_WORD) )
101 return errorType(
"encode expected word! type" );
103 switch( ur_atom(a1) )
115 return url_encode( ut, data, res, 0 );
118 "encode passed invalid type '%s",
126 if( enc == UR_ENC_UTF8 )
130 else if( enc == UR_ENC_UCS2 )
132 uint16_t bom = 0xfeff;
164 else if( type == UT_BINARY )
168 if( ! ur_is(a1, UT_INT) )
171 return errorType(
"encode expected type 2, 16, or 64 for binary" );
179 bin->
form = UR_BENC_2;
182 bin->
form = UR_BENC_16;
185 bin->
form = UR_BENC_64;
193 return errorType(
"encode expected binary!/string! data" );
209 if( ur_atom(a1) == UR_ATOM_URL )
210 return url_encode( ut, a2, res, 1 );
225CFUNC(cfunc_encodingQ)
227 static UAtom encAtoms[4] = {
228 UR_ATOM_LATIN1, UR_ATOM_UTF8, UR_ATOM_UCS2, UT_UNSET
230 static char bencBase[4] = { 16, 2, 64, 16 };
232 if( ur_isStringType(
ur_type(a1) ) )
236 ur_setWordUnbound(res, encAtoms[buf->
form & 3] );
238 else if( ur_is(a1, UT_BINARY) )
242 ur_int(res) = bencBase[buf->
form & 3];
#define CFUNC(name)
Macro to define C functions.
Definition boron.h:57
#define CFUNC_OPTIONS
Macro to get uint16_t option flags from inside a C function.
Definition boron.h:59
void ur_binAppendData(UBuffer *, const uint8_t *data, int len)
Append data to binary buffer.
Definition binary.c:213
UBuffer * ur_makeBinaryCell(UThread *, int size, UCell *cell)
Generate a single binary and set cell to reference it.
Definition binary.c:74
void ur_binAppendArray(UBuffer *, const USeriesIter *si)
Append array slice to binary buffer.
Definition binary.c:227
#define ur_strFree
A string is a simple array.
Definition urlan.h:629
UBuffer * ur_makeStringCell(UThread *, int enc, int size, UCell *cell)
Generate a single string and set cell to reference it.
Definition string.c:104
void ur_strInit(UBuffer *, int enc, int size)
Initialize buffer to type UT_STRING.
Definition string.c:430
void ur_strAppend(UBuffer *, const UBuffer *strB, UIndex itB, UIndex endB)
Append another string buffer to this string.
Definition string.c:899
void ur_seriesSlice(const UThread *, USeriesIter *si, const UCell *cell)
Set USeriesIter to series slice.
Definition env.c:1338
#define ur_bufferSer(c)
Convenience macro for ur_bufferSeries().
Definition urlan.h:752
#define ur_setId(c, t)
Set type and initialize the other 24 bits of UCellId to zero.
Definition urlan.h:701
UIndex it
Start position.
Definition urlan.h:338
UStatus ur_error(UThread *, int errorType, const char *fmt,...)
Create error! exception.
Definition env.c:964
UIndex end
End position.
Definition urlan.h:339
@ UR_THROW
Returned to indicate an evaluation exception occured.
Definition urlan.h:117
@ UR_OK
Returned to indicate successful evaluation/operation.
Definition urlan.h:118
#define ur_bufferSerM(c)
Convenience macro for ur_bufferSeriesM().
Definition urlan.h:753
const UBuffer * buf
Buffer pointer.
Definition urlan.h:337
#define ur_type(c)
Return UrlanDataType of cell.
Definition urlan.h:695
The UBuffer struct holds information about a resource, usually a chunk of memory.
Definition urlan.h:266
uint8_t * b
bytes
Definition urlan.h:277
uint8_t form
This can indicate a specific form of the data (such as a string encoding).
Definition urlan.h:269
UIndex used
This typically holds the number of elements in the buffer.
Definition urlan.h:271
uint16_t * u16
uint16_t
Definition urlan.h:279
union UBuffer::@312146223224040072236377336057316010374162171270 ptr
This typically holds a pointer to a chunk of memory.
Iterator for const series of any type.
Definition urlan.h:336
The UThread struct stores the data specific to a thread of execution.
Definition urlan.h:309
A cell holds a single value of a simple type or a reference (often to a UBuffer) for a complex type.
Definition urlan.h:248
@ UR_ERR_SCRIPT
General script evaluation error.
Definition urlan.h:126
@ UR_ERR_INTERNAL
Fatal internal problem.
Definition urlan.h:129
@ UR_ERR_TYPE
Invalid argument/parameter datatype.
Definition urlan.h:125