- size = lseek(fd, 0L, SEEK_END);
- pos = lseek(fd, 0L, SEEK_SET);
+ tok += 2;
+
+ if (*tok != EOL)
+ {
+ // Check size parameter (can be omitted)
+ if (*tok++ == ',')
+ {
+ if (*tok != ',')
+ {
+ if (abs_expr(&size) != OK)
+ {
+ close(fd);
+ return ERROR;
+ }
+ }
+ else
+ size = lseek(fd, 0L, SEEK_END);
+ }
+
+ // Check offset parameter (can be omitted)
+ if (*tok != EOL)
+ {
+ if (*tok++ == ',')
+ {
+ if (*tok != EOL)
+ {
+ if (abs_expr(&pos) != OK)
+ {
+ close(fd);
+ return ERROR;
+ }
+
+ lseek(fd, pos, SEEK_SET);
+ size -= pos;
+ }
+ else
+ {
+ // offset parameter omitted, so it's 0
+ pos = lseek(fd, 0L, SEEK_SET);
+ }
+ }
+ else
+ return error(comma_error);
+ }
+ else
+ pos = lseek(fd, 0L, SEEK_SET);
+ }
+ else
+ {
+ // size & pos not given, so assume offset of 0 and all of the binary
+ size = lseek(fd, 0L, SEEK_END);
+ pos = lseek(fd, 0L, SEEK_SET);
+ }
+