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; }
XPT_Do8(XPTCursor *cursor, uint8_t *u8p) { if (!CHECK_COUNT(cursor, 1)) return PR_FALSE; if (cursor->state->mode == XPT_ENCODE) CURS_POINT(cursor) = *u8p; else *u8p = CURS_POINT(cursor); cursor->offset++; return PR_TRUE; }
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; }
XPT_Do16(NotNull<XPTCursor*> cursor, uint16_t *u16p) { union { uint8_t b8[2]; uint16_t b16; } u; if (!CHECK_COUNT(cursor, 2)) return false; u.b8[0] = CURS_POINT(cursor); cursor->offset++; u.b8[1] = CURS_POINT(cursor); *u16p = XPT_SWAB16(u.b16); cursor->offset++; return true; }
XPT_Do8(NotNull<XPTCursor*> cursor, uint8_t *u8p) { if (!CHECK_COUNT(cursor, 1)) return false; *u8p = CURS_POINT(cursor); cursor->offset++; return true; }
XPT_Do32(NotNull<XPTCursor*> cursor, uint32_t *u32p) { union { uint8_t b8[4]; uint32_t b32; } u; if (!CHECK_COUNT(cursor, 4)) return false; 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 true; }
XPT_DoCString(XPTArena *arena, NotNull<XPTCursor*> cursor, char **identp, bool ignore) { uint32_t offset = 0; if (!XPT_Do32(cursor, &offset)) return false; if (!offset) { *identp = NULL; return true; } XPTCursor my_cursor; my_cursor.pool = XPT_DATA; my_cursor.offset = offset; my_cursor.state = cursor->state; char* start = &CURS_POINT(&my_cursor); char* end = strchr(start, 0); /* find the end of the string */ if (!end) { fprintf(stderr, "didn't find end of string on decode!\n"); return false; } int len = end - start; XPT_ASSERT(len > 0); if (!ignore) { char *ident = (char*)XPT_CALLOC1(arena, len + 1u); if (!ident) return false; memcpy(ident, start, (size_t)len); ident[len] = 0; *identp = ident; } return true; }
XPT_DoCString(XPTArena *arena, XPTCursor *cursor, char **identp) { XPTCursor my_cursor; char *ident = *identp; uint32_t offset = 0; XPTMode mode = cursor->state->mode; if (mode == XPT_DECODE) { char *start, *end; int len; if (!XPT_Do32(cursor, &offset)) return PR_FALSE; if (!offset) { *identp = NULL; return PR_TRUE; } my_cursor.pool = XPT_DATA; my_cursor.offset = offset; my_cursor.state = cursor->state; start = &CURS_POINT(&my_cursor); end = strchr(start, 0); /* find the end of the string */ if (!end) { fprintf(stderr, "didn't find end of string on decode!\n"); return PR_FALSE; } len = end - start; XPT_ASSERT(len > 0); ident = (char*)XPT_MALLOC(arena, len + 1u); if (!ident) return PR_FALSE; memcpy(ident, start, (size_t)len); ident[len] = 0; *identp = ident; } else { if (!ident) { offset = 0; if (!XPT_Do32(cursor, &offset)) return PR_FALSE; return PR_TRUE; } if (!XPT_MakeCursor(cursor->state, XPT_DATA, strlen(ident) + 1, &my_cursor) || !XPT_Do32(cursor, &my_cursor.offset)) return PR_FALSE; while(*ident) if (!XPT_Do8(&my_cursor, (uint8_t *)ident++)) return PR_FALSE; if (!XPT_Do8(&my_cursor, (uint8_t *)ident)) /* write trailing zero */ return PR_FALSE; } return PR_TRUE; }