ref: 0ec0e4fde657c442431548180c91018078c2bf3c
dir: /amf.c/
#include <u.h> #include <libc.h> #include "amf.h" enum { Anum, Aarr = 8, Aend, Alstr = 12, }; u8int * amfi16(u8int *p, u8int *e, s16int i) { if(p == nil) return nil; if(e-p < 2){ werrstr("buffer short"); return nil; } *p++ = i >> 8; *p++ = i; return p; } u8int * amfi24(u8int *p, u8int *e, s32int i) { if(p == nil) return nil; if(e-p < 3){ werrstr("buffer short"); return nil; } *p++ = i >> 16; *p++ = i >> 8; *p++ = i; return p; } u8int * amfi32(u8int *p, u8int *e, s32int i) { if(p == nil) return nil; if(e-p < 4){ werrstr("buffer short"); return nil; } *p++ = i >> 24; *p++ = i >> 16; *p++ = i >> 8; *p++ = i; return p; } u8int * amfnum(u8int *p, u8int *e, double v) { union { double v; u64int u; }x; if(p == nil) return nil; if(p+8 > e){ werrstr("buffer short"); return nil; } x.v = v; *p++ = x.u >> 56; *p++ = x.u >> 48; *p++ = x.u >> 40; *p++ = x.u >> 32; *p++ = x.u >> 24; *p++ = x.u >> 16; *p++ = x.u >> 8; *p++ = x.u; return p; } u8int * amfkvnum(u8int *p, u8int *e, char *name, double v) { int n; if(p == nil) return nil; if((n = strlen(name)) > 0xffff){ werrstr("string too long"); return nil; } if(p+2+n+8 > e){ werrstr("buffer short"); return nil; } p = amfi16(p, e, n); p = (u8int*)memmove(p, name, n) + n; return amfnum(p, e, v); } u8int * amfstr(u8int *p, u8int *e, char *s) { int n; if(p == nil) return nil; n = strlen(s); if(p+1+4+n > e){ werrstr("string too long"); return nil; } *p++ = Alstr; return (u8int*)memmove(amfi32(p, e, n), s, n) + n; } u8int * amfarr(u8int *p, u8int *e) { if(p == nil) return nil; if(p == e){ werrstr("buffer short"); return nil; } *p++ = Aarr; return p; } u8int * amfend(u8int *p, u8int *e) { return amfi24(p, e, Aend); }