Skip to content

Commit

Permalink
FEAT: implemented indexz?, at and atz actions on file port
Browse files Browse the repository at this point in the history
  • Loading branch information
Oldes committed Jul 8, 2022
1 parent f0ecd11 commit 68cb9d0
Show file tree
Hide file tree
Showing 2 changed files with 57 additions and 2 deletions.
19 changes: 17 additions & 2 deletions src/core/p-file.c
Original file line number Diff line number Diff line change
Expand Up @@ -636,6 +636,9 @@ REBINT Mode_Syms[] = {
case A_INDEXQ:
SET_INTEGER(D_RET, file->file.index + 1);
break;
case A_INDEXZQ:
SET_INTEGER(D_RET, file->file.index);
break;

case A_LENGTHQ:
SET_INTEGER(D_RET, file->file.size - file->file.index); // !clip at zero
Expand All @@ -654,13 +657,20 @@ REBINT Mode_Syms[] = {
goto seeked;

case A_BACK:
if (file->file.index > 0) file->file.index--;
file->file.index--;
goto seeked;

case A_SKIP:
file->file.index += Get_Num_Arg(D_ARG(2));
goto seeked;

case A_AT:
file->file.index = Get_Num_Arg(D_ARG(2)) - 1;
goto seeked;
case A_ATZ:
file->file.index = Get_Num_Arg(D_ARG(2));
goto seeked;

case A_HEADQ:
DECIDE(file->file.index == 0);

Expand All @@ -680,7 +690,6 @@ REBINT Mode_Syms[] = {
break;

/* Not yet implemented:
A_AT, // 38
A_PICK, // 41
A_PATH, // 42
A_PATH_SET, // 43
Expand All @@ -701,6 +710,12 @@ REBINT Mode_Syms[] = {
return R_RET;

seeked:
// fit index in available range...
if (file->file.index < 0)
file->file.index = 0;
else if (file->file.index > file->file.size)
file->file.index = file->file.size;

SET_FLAG(file->modes, RFM_RESEEK);
return R_ARG1;

Expand Down
40 changes: 40 additions & 0 deletions src/tests/units/port-test.r3
Original file line number Diff line number Diff line change
Expand Up @@ -347,6 +347,46 @@ if system/platform = 'Windows [
port? close p
not error? try [delete %12345]
]
--test-- "skip/at on file port"
write %12345 "12345"
p: open/read/seek %12345
;@@ https://github.com/Oldes/Rebol-issues/issues/2506
--assert all [
1 = index? head p
3 = index? skip p 2
5 = index? skip p 2
6 = index? tail p
6 = index? skip p 20
1 = index? skip head p -10
1 = index? back head p
1 = index? back back head p
]
--assert all [
6 = index? tail p
6 = index? at p 20
2 = index? at p 2
2 = index? at p 2
1 = index? at p 0
1 = index? at p -10
]
--assert all [
6 = index? tail p
6 = index? atz p 20
3 = index? atz p 2
3 = index? atz p 2
1 = index? atz p 0
1 = index? atz p -10
]
--assert all [
5 = indexz? tail p
5 = indexz? atz p 20
2 = indexz? atz p 2
2 = indexz? atz p 2
0 = indexz? atz p 0
0 = indexz? atz p -10
]
close p
delete %12345

--test-- "CLEAR file port"
;@@ https://github.com/Oldes/Rebol-issues/issues/812
Expand Down

0 comments on commit 68cb9d0

Please sign in to comment.