3 ms·
Duff's device output cut due to length limit, but here you go: CL-USER> (vacietis::cstr-noeval " void send (char * to, char * from, int count) { int n = (count
by jiyunomegami 6y ago
Duff's device output cut due to length limit, but here you go:
CL-USER> (vacietis::cstr-noeval "
void send (char * to, char * from, int count) {
int n = (count + 7) / 8;
switch (count % 8) {
case 0: do { * to++ = * from++;
case 7: * to++ = * from++;
case 6: * to++ = * from++;
case 5: * to++ = * from++;
case 4: * to++ = * from++;
case 3: * to++ = * from++;
case 2: * to++ = * from++;
case 1: * to++ = * from++; } while (--n > 0); } }
int main () {
char tobuf[32];
memset(tobuf, 0, sizeof(tobuf));
char* from = \"Duff the magic dragon's device!\";
send(tobuf, from, 31);
printf(\"from: %s\\n\", from);
printf(\" to: %s\\n\", tobuf);
return 0;
}")
(PROGN
(PROGN (DECLAIM (FTYPE (FUNCTION (* * * ) T) SEND)) (VACIETIS::VAC-DEFUN/1 SEND (TO FROM COUNT) (DECLARE (TYPE (SIGNED-BYTE 32) COUNT))
(PROG* ((N (VACIETIS.C:INTEGER/ (VACIETIS.C:+ COUNT 7) 8)))
(DECLARE (TYPE (SIGNED-BYTE 32) N))
(VACIETIS.C:SWITCH (VACIETIS.C:% COUNT 8)
(1 2 3 4 5 6 7 0)
(0
(VACIETIS.C:DO
(TAGBODY
(VACIETIS.C:=
(VACIETIS.C:DEREF*
(PROG1 TO
(VACIETIS.C:= TO (VACIETIS.C:PTR+ TO 1))))
(VACIETIS.C:DEREF* (PROG1 FROM (VACIETIS.C:= FROM (VACIETIS.C:PTR+ FROM 1)))))
7 (VACIETIS.C:= (VACIETIS.C:DEREF* (PROG1 TO (VACIETIS.C:= TO (VACIETIS.C:PTR+ TO 1)))) (VACIETIS.C:DEREF* (PROG1 FROM (VACIETIS.C:= FROM (VACIETIS.C:PTR+ FROM 1)))))
6 ... )))))))
(PROGN
(DECLAIM (FTYPE (FUNCTION NIL (SIGNED-BYTE 32)) MAIN))
(VACIETIS::VAC-DEFUN/1 MAIN NIL (DECLARE)
(PROG* ((TOBUF (MAKE-ARRAY 32 :ELEMENT-TYPE '(SIGNED-BYTE 8)))
(FROM (VACIETIS:STRING-TO-CHAR* "Duff the magic dragon's device!"))) (DECLARE (DYNAMIC-EXTENT FROM)
(TYPE (SIMPLE-ARRAY (SIGNED-BYTE 8) (32))
TOBUF)
(DYNAMIC-EXTENT TOBUF))
(MEMSET TOBUF 0 32)
(SEND TOBUF FROM 31)
(PRINTF (VACIETIS:STRING-TO-CHAR* "from: %s
") FROM)
(PRINTF (VACIETIS:STRING-TO-CHAR* " to: %s
") TOBUF) (RETURN-FROM MAIN 0)))))
Once you evaluate the above, you can call main from lisp.
- carapace 6y ago(Psst, indent four spaces for monospace blocks) Like this. :)