#include "EXTERN.h"
#include "perl.h"
#include <stdio.h>
#include <stdarg.h>
#include <stdlib.h>
#include <unistd.h>
#include <qdos.h>

FILE * mypopen(cmd,mode)
char	*cmd;
char	*mode;
{
    return popen(cmd, mode);
}

int mypclose(ptr)
FILE *ptr;
{
    return pclose(ptr);
}

int
do_spawn(cmd)
char *cmd;
{
    return system(cmd);
}

int setmode (int fd, int val)
{
    return 0;
}


/*
 * The following code is based on the do_exec and do_aexec functions
 * in file doio.c
 */
int
do_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 = forkvp(tmps,(int*)-1L,argv);
	else
	    status = forkvp(argv[0],(int*)-1L,argv);
	Safefree(argv);
    }
    return status;
}

int syscall(int trapno,...)
{
    int res;
    REGS_t regs;
    REGS_t out;
    va_list ap;
    
    va_start(ap, trapno);
    regs = va_arg(ap, REGS_t);
    
    switch (trapno)
    {
        case 1:
            qdos1(&regs, &out);
            break;
        case 2:
            qdos2(&regs, &out);
            break;
        case 3:
            if((int)regs.A0 < 0xffff)
            {
                regs.A0 = (addreg_t) getchid((int)regs.A0);
            }
            switch(regs.D0)
            {
                case 2:
                    res = io_fline ((long)regs.A0, regs.D3,
                                   regs.A1, regs.D2);
                    if(res > 0)
                    {
                        *(regs.A1+res) = 0;
                    }
                    break;
                case 3:
                    res = io_fstrg((long)regs.A0, regs.D3,
                                   regs.A1, regs.D2);
                    break;
                case 0x30:
                    res = sd_point ((long)regs.A0, regs.D3,
                                    *(double *)regs.A1,
                                    *((double *)regs.A1+1));
                    break;
                case 0x31:
                    res = sd_line ((long)regs.A0, regs.D3,
                                   *(double *)regs.A1,
                                   *((double *)regs.A1+1),
                                   *((double *)regs.A1+2),
                                   *((double *)regs.A1+3));
                    break;
                case 0x32:
                    res = sd_arc ((long)regs.A0, regs.D3,
                                  *(double *)regs.A1,
                                  *((double *)regs.A1+1),
                                  *((double *)regs.A1+2),
                                  *((double *)regs.A1+3),
                                  *((double *)regs.A1+4));
                    break;
                case 0x33:
                    res = sd_elipse ((long)regs.A0, regs.D3,
                                     *(double *)regs.A1,
                                     *((double *)regs.A1+1),
                                     *((double *)regs.A1+2),
                                     *((double *)regs.A1+3),
                                     *((double *)regs.A1+4));
                    break;
                case 0x34:
                    res = sd_scale ((long)regs.A0, regs.D3,
                                    *(double *)regs.A1,
                                    *((double *)regs.A1+1),
                                    *((double *)regs.A1+2));
                    break;
                case 0x36:
                    res = sd_gcur ((long)regs.A0, regs.D3,
                                   *(double *)regs.A1,
                                   *((double *)regs.A1+1),
                                   *((double *)regs.A1+2),
                                   *((double *)regs.A1+3));
                    break;
                default:
                    res = qdos3(&regs, &out);                    
            }
            break;
        default:
            res = -1;
            break;
    }
    return res;
}




