📄 atarist.c
字号:
/* * random stuff for atariST */#include "EXTERN.h"#include "perl.h"/* call back stuff, atari specific stuff below *//* Be sure to refetch the stack pointer after calling these routines. */intcallback(subname, sp, gimme, hasargs, numargs)char *subname;int sp; /* stack pointer after args are pushed */int gimme; /* called in array or scalar context */int hasargs; /* whether to create a @_ array for routine */int numargs; /* how many args are pushed on the stack */{ static ARG myarg[3]; /* fake syntax tree node */ int arglast[3]; arglast[2] = sp; sp -= numargs; arglast[1] = sp--; arglast[0] = sp; if (!myarg[0].arg_ptr.arg_str) myarg[0].arg_ptr.arg_str = str_make("",0); myarg[1].arg_type = A_WORD; myarg[1].arg_ptr.arg_stab = stabent(subname, FALSE); myarg[2].arg_type = hasargs ? A_EXPR : A_NULL; return do_subr(myarg, gimme, arglast);}intcallv(subname, sp, gimme, argv)char *subname;register int sp; /* current stack pointer */int gimme; /* called in array or scalar context */register char **argv; /* null terminated arg list, NULL for no arglist */{ register int items = 0; int hasargs = (argv != 0); astore(stack, ++sp, Nullstr); /* reserve spot for 1st return arg */ if (hasargs) { while (*argv) { astore(stack, ++sp, str_2mortal(str_make(*argv,0))); items++; argv++; } } return callback(subname, sp, gimme, hasargs, items);}#include <process.h>#include <stdio.h>long _stksize = 64*1024L;unsigned long __DEFAULT_BUFSIZ__ = 4 * 1024L;/* * The following code is based on the do_exec and do_aexec functions * in file doio.c */intdo_aspawn(really,arglast)STR *really;int *arglast;{ register STR **st = stack->ary_array; register int sp = arglast[1]; register int items = arglast[2] - sp; register char **a; char **argv; char *tmps; int status; if (items) { New(1101,argv, items+1, char*); a = argv; for (st += ++sp; items > 0; items--,st++) { if (*st) *a++ = str_get(*st); else *a++ = ""; } *a = Nullch; if (really && *(tmps = str_get(really))) status = spawnvp(-P_WAIT,tmps,argv); /* -P_WAIT is a hack, see spawnvp.c in the lib */ else status = spawnvp(-P_WAIT,argv[0],argv); Safefree(argv); } return status;}intdo_spawn(cmd)char *cmd;{ return system(cmd);}#if 0 /* patchlevel 79 onwards we can *//* * we unfortunately cannot use the super efficient fread/write from the lib */size_t fread(void *data, size_t size, size_t count, FILE *fp){ size_t i, j; unsigned char *buf = (unsigned char *)data; int c; for(i = 0; i < count; i++) { for(j = 0; j < size; j++) { if((c = getc(fp)) == EOF) return 0; *buf++ = c; } } return i;}size_t fwrite(const void *data, size_t size, size_t count, FILE *fp){ size_t i, j; const unsigned char *buf = (const unsigned char *)data; for(i = 0; i < count; i++) { for(j = 0; j < size; j++) { if(fputc(*buf++, fp) == EOF) return 0; } } return i;}#endif#ifdef HAS_SYSCALL#define __NO_INLINE__#include <osbind.h> /* must include this for proper protos *//* these must match osbind.pl */#define TRAP_1_W 1#define TRAP_1_WW 2#define TRAP_1_WL 3#define TRAP_1_WLW 4#define TRAP_1_WWW 5#define TRAP_1_WLL 6#define TRAP_1_WWLL 7#define TRAP_1_WLWW 8#define TRAP_1_WWLLL 9#define TRAP_13_W 10#define TRAP_13_WW 11#define TRAP_13_WL 12#define TRAP_13_WWW 13#define TRAP_13_WWL 14#define TRAP_13_WWLWWW 15#define TRAP_14_W 16#define TRAP_14_WW 17#define TRAP_14_WL 18#define TRAP_14_WWW 19#define TRAP_14_WWL 20#define TRAP_14_WWLL 21#define TRAP_14_WLLW 22#define TRAP_14_WLLL 23#define TRAP_14_WWWL 24#define TRAP_14_WWWWL 25#define TRAP_14_WLLWW 26#define TRAP_14_WWWWWWW 27#define TRAP_14_WLLWWWWW 28#define TRAP_14_WLLWWWWLW 29#define TRAP_14_WLLWWWWWLW 30int syscall(trap, fn, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12 )unsigned long trap, fn, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12;{ /* for now */ switch(trap) { case TRAP_1_W: return trap_1_w(fn); case TRAP_1_WW: return trap_1_ww(fn, a1); case TRAP_1_WL: return trap_1_wl(fn, a1); case TRAP_1_WLW: return trap_1_wlw(fn, a1, a2); case TRAP_1_WWW: return trap_1_www(fn, a1, a2); case TRAP_1_WLL: return trap_1_wll(fn, a1, a2); case TRAP_1_WWLL: return trap_1_wwll(fn, a1, a2, a3); case TRAP_1_WLWW: return trap_1_wlww(fn, a1, a2, a3); case TRAP_1_WWLLL: return trap_1_wwlll(fn, a1, a2, a3, a4); case TRAP_13_W: return trap_13_w(fn); case TRAP_13_WW: return trap_13_ww(fn, a1); case TRAP_13_WL: return trap_13_wl(fn, a1); case TRAP_13_WWW: return trap_13_www(fn, a1, a2); case TRAP_13_WWL: return trap_13_wwl(fn, a1, a2); case TRAP_13_WWLWWW: return trap_13_wwlwww(fn, a1, a2, a3, a4, a5); case TRAP_14_W: return trap_14_w(fn); case TRAP_14_WW: return trap_14_ww(fn, a1); case TRAP_14_WL: return trap_14_wl(fn, a1); case TRAP_14_WWW: return trap_14_www(fn, a1, a2); case TRAP_14_WWL: return trap_14_wwl(fn, a1, a2); case TRAP_14_WWLL: return trap_14_wwll(fn, a1, a2, a3); case TRAP_14_WLLW: return trap_14_wllw(fn, a1, a2, a3); case TRAP_14_WLLL: return trap_14_wlll(fn, a1, a2, a3); case TRAP_14_WWWL: return trap_14_wwwl(fn, a1, a2, a3); case TRAP_14_WWWWL: return trap_14_wwwwl(fn, a1, a2, a3, a4); case TRAP_14_WLLWW: return trap_14_wllww(fn, a1, a2, a3, a4); case TRAP_14_WWWWWWW: return trap_14_wwwwwww(fn, a1, a2, a3, a4, a5, a6); case TRAP_14_WLLWWWWW: return trap_14_wllwwwww(fn, a1, a2, a3, a4, a5, a6, a7); case TRAP_14_WLLWWWWLW: return trap_14_wllwwwwlw(fn, a1, a2, a3, a4, a5, a6, a7, a8); case TRAP_14_WLLWWWWWLW: return trap_14_wllwwwwwlw(fn, a1, a2, a3, a4, a5, a6, a7, a8, a9); } }#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -