App-rs
view release on metacpan or search on metacpan
}
} else {
memcpy(ou + ol, in, il); ol += il, il = 0;
}
}
}
MODULE = App::rs PACKAGE = App::rs
SV*
rs_parse(char *f)
CODE:
char *p = (char*)mmapr(f, NULL);
struct {
enum {
NEW, RK, RV
}st;
uint32_t l;
SV *key;
HV *v;
}s[256], *q;
SV *v;
uint8_t sp = 0;
CALL;
while (sp) {
q = s + sp - 1;
if (q->st == NEW) {
char t = *p++;
uint32_t l = *(uint32_t*)p;
p += 4;
if (t == 'S') {
v = newSV(0);
SvUPGRADE(v, SVt_PV);
SvPVX(v) = p, SvCUR_set(v, l), SvLEN_set(v, 0);
SvPOK_only(v);
p += l, sp -= 1;
} else {
if (l) {
q->v = newHV(), q->l = l, q->st = RK;
CALL;
} else {
RET(newRV_noinc((SV*)newHV()));
}
}
} else {
if (q->st == RK) {
q->key = v, q->st = RV;
CALL;
} else {
hv_store_ent(q->v, q->key, v, 0);
if (q->l -= 1) {
q->st = RK;
CALL;
} else {
RET(newRV_noinc((SV*)q->v));
}
}
}
}
RETVAL = v;
OUTPUT:
RETVAL
void
rs_unparse(SV *v, int fd)
CODE:
char p[5];
struct {
enum {
NEW, OLD
}st;
HV *v;
}s[256], *q;
uint8_t sp = 0;
LLAC(v);
while (sp) {
q = s + sp - 1;
if (q->st == NEW) {
unless (SvROK(v)) {
char *in;
STRLEN il;
in = SvPV(v, il);
HPACK('S', il);
cwrite(fd, in, il);
TER;
} else {
v = SvRV(v);
if (SvTYPE(v) < SVt_PVAV) {
off_t il;
char *in = (char*)mmapr(SvPV_nolen(v), &il);
HPACK('S', il);
if (il) {
cwrite(fd, in, il);
errn1(munmap(in, il));
}
TER;
} else {
q->v = (HV*)v, q->st = OLD;
uint32_t l = 0;
hv_iterinit(q->v);
while (hv_iternext(q->v)) l += 1;
HPACK('H', l);
hv_iterinit(q->v);
}
}
} else {
char *key;
I32 retlen;
v = hv_iternextsv(q->v, &key, &retlen);
if (v) {
HPACK('S', retlen);
cwrite(fd, key, retlen);
LLAC(v);
} else {
TER;
}
}
}
cwrite(fd, NULL, 0);
bool
lchown(char *f, uid_t uid, gid_t gid)
POSTCALL:
RETVAL = !RETVAL;
bool
utimensat(char *f, int t)
CODE:
struct timespec times[2];
times[0].tv_nsec = UTIME_OMIT;
times[1].tv_sec = t, times[1].tv_nsec = 0;
RETVAL = !utimensat(AT_FDCWD, f, times, AT_SYMLINK_NOFOLLOW);
OUTPUT:
RETVAL
( run in 2.376 seconds using v1.01-cache-2.11-cpan-98e64b0badf )