World OMstatus OMgetBigInt(OMdev dev, char **data, int *len, int *sign, OMbigIntType * format) { OMtokenType type; OMassert(data); *data = NULL; dev->inTokenNb++; OMcheckStatus(OMgetType(dev, &type)); if (type == OMtokenInt32) { // allow user to get a bigint (if it was a 32 bit int) // OPTIM build a special low level call to get the string? int i; char tmp[12]; // a 32 bit int has at most 10 chars OMcheckStatus((*ENCODING(dev, getInt32)) (dev, &i)); if (i < 0) { *sign = -1; i = -i; } sprintf(tmp, "%d", i); *data = strdup(tmp); *len = strlen(tmp); return OMsuccess; } else { return (*ENCODING(dev, getBigInt)) (dev, data, len, sign, format); } }
/* OMgetSymbolLength * Get the current token (wich is assumed to be a symbol) lengths. * dev: device to read from * clen: where to put the cd length (not counting the last '\0') * nlen: where to put the name length (not counting the last '\0') * return: 0 or some error code */ World OMstatus OMgetSymbolLength(OMdev dev, int *clen, int *nlen) { OMassert(dev); return (*ENCODING(dev, getSymbolLength)) (dev, clen, nlen); }
XPT_Do16(XPTCursor *cursor, uint16_t *u16p) { union { uint8_t b8[2]; uint16_t b16; } u; if (!CHECK_COUNT(cursor, 2)) return PR_FALSE; if (ENCODING(cursor)) { u.b16 = XPT_SWAB16(*u16p); CURS_POINT(cursor) = u.b8[0]; cursor->offset++; CURS_POINT(cursor) = u.b8[1]; } else { u.b8[0] = CURS_POINT(cursor); cursor->offset++; u.b8[1] = CURS_POINT(cursor); *u16p = XPT_SWAB16(u.b16); } cursor->offset++; return PR_TRUE; }
void push_headers(HEADER *header) { int num; ADDRESS *adr; push_text("subject"); PUSH_TEXT(header->env->real_subj); push_text("message_id"); PUSH_TEXT(header->env->message_id); push_text("type"); PUSH_TEXT( TYPE(header->content) ); push_text("subtype"); PUSH_TEXT(header->content->subtype); push_text("encoding"); PUSH_TEXT( ENCODING(header->content->encoding) ); push_text("length"); push_int(header->content->length); PUSH_MAPPING_si("lines", header->lines); PUSH_MAPPING_si("mime", header->mime); PUSH_MAPPING_si("flagged", header->flagged); PUSH_MAPPING_si("tagged", header->tagged); PUSH_MAPPING_si("deleted", header->deleted); PUSH_MAPPING_si("replied", header->replied); PUSH_MAPPING_si("date_sent", header->date_sent); PUSH_MAPPING_si("date_received", header->received); push_text("env"); PUSH_ADDRESS("from",from); PUSH_ADDRESS_LIST("to",to); PUSH_ADDRESS_LIST("cc",cc); PUSH_ADDRESS_LIST("bcc",bcc); PUSH_ADDRESS("sender",sender); PUSH_ADDRESS("reply_to",reply_to); PUSH_ADDRESS("return_path",return_path); f_aggregate_mapping(14); f_aggregate_mapping(30); }
/* OMgetLength * Get the current token length. * dev: device to read from * len: where to put the token length * the last '\0' for string like tokens is not counted * (rem: for WCString it is the number of bytes not the number of wide chars) * return: 0 or some error code */ World OMstatus OMgetLength(OMdev dev, int *len) { OMassert(dev); return (*ENCODING(dev, getLength)) (dev, len); }
XPT_Do32(XPTCursor *cursor, uint32_t *u32p) { union { uint8_t b8[4]; uint32_t b32; } u; if (!CHECK_COUNT(cursor, 4)) return PR_FALSE; if (ENCODING(cursor)) { u.b32 = XPT_SWAB32(*u32p); CURS_POINT(cursor) = u.b8[0]; cursor->offset++; CURS_POINT(cursor) = u.b8[1]; cursor->offset++; CURS_POINT(cursor) = u.b8[2]; cursor->offset++; CURS_POINT(cursor) = u.b8[3]; } else { u.b8[0] = CURS_POINT(cursor); cursor->offset++; u.b8[1] = CURS_POINT(cursor); cursor->offset++; u.b8[2] = CURS_POINT(cursor); cursor->offset++; u.b8[3] = CURS_POINT(cursor); *u32p = XPT_SWAB32(u.b32); } cursor->offset++; return PR_TRUE; }
/* OMgetType * Get the type of the current token on device <dev>/ * dev: device to look at. * type: where to store returned type. * return: 0 or some error code */ World OMstatus OMgetType(OMdev dev, OMtokenType * type) { OMassert(dev); return (*ENCODING(dev, getType)) (dev, type); }
World OMstatus OMgetByteArrayN(OMdev dev, char *data, int len) { OMassert(dev); dev->inTokenNb++; return (*ENCODING(dev, getByteArray)) (dev, &data, &len); }
World OMstatus OMputVar(OMdev dev, const char *var) { OMassert(dev); dev->outTokenNb++; return (*ENCODING(dev, putVar)) (dev, var, strlen(var)); }
World OMstatus OMputVarN(OMdev dev, const char *var, int len) { OMassert(dev); dev->outTokenNb++; return (*ENCODING(dev, putVar)) (dev, var, len); }
World OMstatus OMputStringN(OMdev dev, const char *str, int len) { OMassert(dev); dev->outTokenNb++; return (*ENCODING(dev, putString)) (dev, str, len); }
World OMstatus OMputSymbolN(OMdev dev, const char *cd, int clen, const char *name, int nlen) { OMassert(dev); dev->outTokenNb++; return (*ENCODING(dev, putSymbol)) (dev, cd, clen, name, nlen); }
World OMstatus OMputByteArray(OMdev dev, const char *data, int len) { OMassert(dev); dev->outTokenNb++; return (*ENCODING(dev, putByteArray)) (dev, data, len); }
World OMstatus OMputCommentN(OMdev dev, const char *comment, int len) { OMassert(dev); dev->outTokenNb++; return (*ENCODING(dev, putComment)) (dev, comment, len); }
World OMstatus OMputError(OMdev dev) { OMassert(dev); dev->outTokenNb++; return (*ENCODING(dev, putTokenTag)) (dev, OMtokenError); }
/* OMPut* functions. * They all take a device <dev> to put token to. * Some of them need more parameters to define the token content. * They are thoroughly documented in OpenMath Specification shiped with the library. * return: a status that reflect the operation success. */ World OMstatus OMputInt32(OMdev dev, int n) { OMassert(dev); dev->outTokenNb++; return (*ENCODING(dev, putInt32)) (dev, n); }
World OMstatus OMgetStringN(OMdev dev, char *str, int len) { OMassert(dev); dev->inTokenNb++; return (*ENCODING(dev, getString)) (dev, &str, &len); }
World OMstatus OMgetSymbolN(OMdev dev, char *cd, int clen, char *name, int nlen) { OMassert(dev); dev->inTokenNb++; return (*ENCODING(dev, getSymbol)) (dev, &cd, &clen, &name, &nlen); }
/* BEWARE: the <len> is suposed to be the length in bytes for the preallocated buffer <wcstr> (not the length in number of wide chars) */ World OMstatus OMgetWCStringN(OMdev dev, OMUCS2 * wcstr, int len) { OMassert(dev); dev->inTokenNb++; return (*ENCODING(dev, getWCString)) (dev, &wcstr, &len); }
World OMstatus OMgetEndError(OMdev dev) { OMassert(dev); dev->inTokenNb++; return (*ENCODING(dev, getTokenTag)) (dev, OMtokenEndError); }
World OMstatus OMgetVarN(OMdev dev, char *var, int len) { OMassert(dev); dev->inTokenNb++; return (*ENCODING(dev, getVar)) (dev, &var, &len); }
World OMstatus OMputSymbol(OMdev dev, const char *cd, const char *name) { OMassert(dev); dev->outTokenNb++; return (*ENCODING(dev, putSymbol)) (dev, cd, strlen(cd), name, strlen(name)); }
World OMstatus OMgetObject(OMdev dev) { OMassert(dev); dev->inTokenNb++; return (*ENCODING(dev, getTokenTag)) (dev, OMtokenObject); }
World OMstatus OMgetInt32(OMdev dev, int *i) { OMassert(dev); dev->inTokenNb++; return (*ENCODING(dev, getInt32)) (dev, i); }
World OMstatus OMgetCommentN(OMdev dev, char *comment, int len) { OMassert(dev); dev->inTokenNb++; return (*ENCODING(dev, getComment)) (dev, &comment, &len); }
World OMstatus OMgetFloat64(OMdev dev, double *d) { OMassert(dev); dev->inTokenNb++; return (*ENCODING(dev, getFloat64)) (dev, d); }
World OMstatus OMputBigInt(OMdev dev, const char *data, int len, int sign, OMbigIntType format) { OMassert(dev); dev->outTokenNb++; return (*ENCODING(dev, putBigInt)) (dev, data, len, sign, format); }
/* OMputWCString * If you are using wide char strings you need to output them * with that function rather than with OMputString. * (It takes endianess into account) */ World OMstatus OMputWCString(OMdev dev, const OMUCS2 * wcstr) { OMassert(dev); dev->outTokenNb++; return (*ENCODING(dev, putWCString)) (dev, wcstr, OMWCStrLen(wcstr)); }
World OMstatus OMputObject(OMdev dev) { OMassert(dev); OMbeginObject(dev); dev->outTokenNb++; return (*ENCODING(dev, putTokenTag)) (dev, OMtokenObject); }
World OMstatus OMgetByteArray(OMdev dev, char **data, int *len) { OMassert(data); *data = NULL; dev->inTokenNb++; return (*ENCODING(dev, getByteArray)) (dev, data, len); }