mirror of
https://github.com/cc65/cc65.git
synced 2024-12-28 06:30:16 +00:00
Merge pull request #2387 from colinleroy/sim65-implement-remove
Implement __sysremove for sim65
This commit is contained in:
commit
51b946bf25
@ -8,10 +8,15 @@
|
|||||||
;
|
;
|
||||||
|
|
||||||
.export exit, args, _open, _close, _read, _write
|
.export exit, args, _open, _close, _read, _write
|
||||||
|
.export __sysremove, ___osmaperrno
|
||||||
|
|
||||||
|
__sysremove := $FFF2
|
||||||
|
___osmaperrno := $FFF3
|
||||||
_open := $FFF4
|
_open := $FFF4
|
||||||
_close := $FFF5
|
_close := $FFF5
|
||||||
_read := $FFF6
|
_read := $FFF6
|
||||||
_write := $FFF7
|
_write := $FFF7
|
||||||
args := $FFF8
|
args := $FFF8
|
||||||
exit := $FFF9
|
exit := $FFF9
|
||||||
|
|
||||||
|
; $FFFA-FFFF are hardware vectors, extend before not after!
|
||||||
|
@ -163,7 +163,7 @@ static void PVArgs (CPURegs* Regs)
|
|||||||
|
|
||||||
static void PVOpen (CPURegs* Regs)
|
static void PVOpen (CPURegs* Regs)
|
||||||
{
|
{
|
||||||
char Path[PVOPEN_PATH_SIZE];
|
char Path[PV_PATH_SIZE];
|
||||||
int OFlag = O_INITIAL;
|
int OFlag = O_INITIAL;
|
||||||
int OMode = 0;
|
int OMode = 0;
|
||||||
unsigned RetVal, I = 0;
|
unsigned RetVal, I = 0;
|
||||||
@ -184,7 +184,7 @@ static void PVOpen (CPURegs* Regs)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
++I;
|
++I;
|
||||||
if (I >= PVOPEN_PATH_SIZE) {
|
if (I >= PV_PATH_SIZE) {
|
||||||
Error("PVOpen path too long at address $%04X",Name);
|
Error("PVOpen path too long at address $%04X",Name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -253,6 +253,35 @@ static void PVClose (CPURegs* Regs)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
static void PVSysRemove (CPURegs* Regs)
|
||||||
|
{
|
||||||
|
char Path[PV_PATH_SIZE];
|
||||||
|
unsigned RetVal, I = 0;
|
||||||
|
|
||||||
|
unsigned Name = GetAX (Regs);
|
||||||
|
|
||||||
|
Print (stderr, 2, "PVSysRemove ($%04X)\n", Name);
|
||||||
|
|
||||||
|
do {
|
||||||
|
if (!(Path[I] = MemReadByte ((Name + I) & 0xFFFF))) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
++I;
|
||||||
|
if (I >= PV_PATH_SIZE) {
|
||||||
|
Error("PVSysRemove path too long at address $%04X", Name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
while (1);
|
||||||
|
|
||||||
|
Print (stderr, 2, "PVSysRemove (\"%s\")\n", Path);
|
||||||
|
|
||||||
|
RetVal = remove (Path);
|
||||||
|
|
||||||
|
SetAX (Regs, RetVal);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static void PVRead (CPURegs* Regs)
|
static void PVRead (CPURegs* Regs)
|
||||||
{
|
{
|
||||||
unsigned char* Data;
|
unsigned char* Data;
|
||||||
@ -305,7 +334,17 @@ static void PVWrite (CPURegs* Regs)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
static void PVOSMapErrno (CPURegs* Regs)
|
||||||
|
{
|
||||||
|
unsigned err = GetAX(Regs);
|
||||||
|
SetAX (Regs, err != 0 ? -1 : 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static const PVFunc Hooks[] = {
|
static const PVFunc Hooks[] = {
|
||||||
|
PVSysRemove,
|
||||||
|
PVOSMapErrno,
|
||||||
PVOpen,
|
PVOpen,
|
||||||
PVClose,
|
PVClose,
|
||||||
PVRead,
|
PVRead,
|
||||||
|
@ -44,11 +44,11 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
#define PARAVIRT_BASE 0xFFF4
|
#define PARAVIRT_BASE 0xFFF2
|
||||||
/* Lowest address used by a paravirtualization hook */
|
/* Lowest address used by a paravirtualization hook */
|
||||||
|
|
||||||
#define PVOPEN_PATH_SIZE 1024
|
#define PV_PATH_SIZE 1024
|
||||||
/* Maximum path size supported by PVOpen */
|
/* Maximum path size supported by PVOpen/PVSysRemove */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -10,6 +10,7 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
FILE *in, *out;
|
FILE *in, *out;
|
||||||
char buf[32];
|
char buf[32];
|
||||||
@ -34,6 +35,7 @@ int main(int argc,char **argv)
|
|||||||
printf("Error: file pointer should be in error state\n");
|
printf("Error: file pointer should be in error state\n");
|
||||||
}
|
}
|
||||||
fclose(out);
|
fclose(out);
|
||||||
|
unlink(outfile_path);
|
||||||
|
|
||||||
in = fopen(INFILE, "rb");
|
in = fopen(INFILE, "rb");
|
||||||
if (in == NULL) {
|
if (in == NULL) {
|
||||||
|
55
test/val/remove.c
Normal file
55
test/val/remove.c
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
int fails = 0;
|
||||||
|
|
||||||
|
|
||||||
|
static void create_out_file(const char *outfile_path) {
|
||||||
|
FILE *out;
|
||||||
|
|
||||||
|
|
||||||
|
out = fopen(outfile_path, "wb");
|
||||||
|
if (out == NULL) {
|
||||||
|
printf("Could not create %s\n", outfile_path);
|
||||||
|
fails++;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
fclose(out);
|
||||||
|
}
|
||||||
|
|
||||||
|
int main (int argc, char **argv)
|
||||||
|
{
|
||||||
|
int r;
|
||||||
|
static char outfile_path[FILENAME_MAX+1];
|
||||||
|
|
||||||
|
sprintf(outfile_path, "%s.test.out", argv[0]);
|
||||||
|
|
||||||
|
create_out_file(outfile_path);
|
||||||
|
r = remove(outfile_path);
|
||||||
|
if (r != 0) {
|
||||||
|
printf("could not remove() %s\n", outfile_path);
|
||||||
|
fails++;
|
||||||
|
}
|
||||||
|
|
||||||
|
create_out_file(outfile_path);
|
||||||
|
r = unlink(outfile_path);
|
||||||
|
if (r != 0) {
|
||||||
|
printf("could not unlink() %s\n", outfile_path);
|
||||||
|
fails++;
|
||||||
|
}
|
||||||
|
|
||||||
|
r = remove("klsdfjqlsjdflkqjdsoizu");
|
||||||
|
if (r == 0) {
|
||||||
|
printf("remove()ing non-existent file succeeded\n");
|
||||||
|
fails++;
|
||||||
|
}
|
||||||
|
|
||||||
|
r = unlink("klsdfjqlsjdflkqjdsoizu");
|
||||||
|
if (r == 0) {
|
||||||
|
printf("unlink()ing non-existent file succeeded\n");
|
||||||
|
fails++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return fails;
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user