[Oberon] pcreceive.sh not working for files that are multiples of 255
Andreas Pirklbauer
andreas_pirklbauer at yahoo.com
Fri Jun 30 13:37:42 CEST 2017
Hi Paul,
It works (although the code could now benefit from some cleanup, but.. does the job). Even zero-sized files work now.
Thanks!
Andreas
On Friday, June 30, 2017, 1:25:36 PM GMT+2, Paul Reed <paulreed at paddedcell.com> wrote:
Hi Andreas,
> I do not really understand 100% the part starting with
> "int pos = (rxcount - fnlen -1) % 256, followed by two cascaded if
> statements, one with condition pos == 0 and one with condition flen >
> 255".
Nor did I, even though I wrote it :( However, after sitting down with my
former self and getting him to explain himself, I have tested the
following patch (on macOS, at least; the latter diff just gets rid of a
warning).
The rxcount variable tracks how many characters have been "received" by
the *virtual* machine, which is why it's % 256 not % 255 (took me a
while...).
So a packet header byte is "received" every 256 bytes, or (now) when the
remaining file length (flen) is zero, otherwise it's a data byte. That's
what the if statement *should* have said. Apologies!
Thanks again,
Paul
diff --git a/src/pclink.c b/src/pclink.c
index 5c4aa81..fa9ce3d 100644
--- a/src/pclink.c
+++ b/src/pclink.c
@@ -101,18 +101,18 @@ static uint32_t PCLink_RData(const struct
RISC_Serial *serial) {
}
} else {
int pos = (rxcount - fnlen - 1) % 256;
- if (pos == 0) {
+ if (pos == 0 || flen == 0) {
if (flen > 255) {
ch = 255;
} else {
ch = (uint8_t)flen;
+ if (flen == 0) {
+ mode = 0; unlink(RecName);
+ }
}
} else {
read(fd, &ch, 1);
flen--;
- if (flen == 0) {
- mode = 0; unlink(RecName);
- }
}
}
}
diff --git a/src/sdl-main.c b/src/sdl-main.c
index 892f9e9..8510f2a 100644
--- a/src/sdl-main.c
+++ b/src/sdl-main.c
@@ -66,7 +66,7 @@ static struct option long_options[] = {
{ "leds", no_argument, NULL, 'L' },
{ "size", required_argument, NULL, 's' },
{ "serial-fd", required_argument, NULL, 'F' },
- { NULL }
+ { NULL, no_argument, NULL, '\0' }
};
static void fail(int code, const char *fmt, ...) {
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.inf.ethz.ch/pipermail/oberon/attachments/20170630/0a44cc75/attachment.html>
More information about the Oberon
mailing list