mirror of
https://github.com/gbdev/rgbds.git
synced 2026-01-24 17:23:02 +00:00
Merge pull request #329 from NieDzejkob/allow-stdin-input
Allow using - to indicate input from stdin (resolves #305)
This commit is contained in:
@@ -31,7 +31,7 @@ struct yy_buffer_state {
|
|||||||
/* Address where the data is initially written after a safety margin */
|
/* Address where the data is initially written after a safety margin */
|
||||||
char *pBufferStart;
|
char *pBufferStart;
|
||||||
char *pBuffer;
|
char *pBuffer;
|
||||||
uint32_t nBufferSize;
|
size_t nBufferSize;
|
||||||
uint32_t oAtLineStart;
|
uint32_t oAtLineStart;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -405,23 +405,25 @@ void fstk_RunRept(uint32_t count)
|
|||||||
/*
|
/*
|
||||||
* Initialize the filestack routines
|
* Initialize the filestack routines
|
||||||
*/
|
*/
|
||||||
void fstk_Init(char *s)
|
void fstk_Init(char *pFileName)
|
||||||
{
|
{
|
||||||
char tzFileName[_MAX_PATH + 1];
|
|
||||||
char tzSymFileName[_MAX_PATH + 1 + 2];
|
char tzSymFileName[_MAX_PATH + 1 + 2];
|
||||||
|
|
||||||
snprintf(tzSymFileName, sizeof(tzSymFileName), "\"%s\"", s);
|
snprintf(tzSymFileName, sizeof(tzSymFileName), "\"%s\"", pFileName);
|
||||||
sym_AddString("__FILE__", tzSymFileName);
|
sym_AddString("__FILE__", tzSymFileName);
|
||||||
|
|
||||||
strcpy(tzFileName, s);
|
|
||||||
pFileStack = NULL;
|
pFileStack = NULL;
|
||||||
pCurrentFile = fopen(tzFileName, "rb");
|
if (strcmp(pFileName, "-") == 0) {
|
||||||
if (pCurrentFile == NULL)
|
pCurrentFile = stdin;
|
||||||
err(1, "Unable to open file '%s'", tzFileName);
|
} else {
|
||||||
|
pCurrentFile = fopen(pFileName, "rb");
|
||||||
|
if (pCurrentFile == NULL)
|
||||||
|
err(1, "Unable to open file '%s'", pFileName);
|
||||||
|
}
|
||||||
|
|
||||||
nMacroCount = 0;
|
nMacroCount = 0;
|
||||||
nCurrentStatus = STAT_isInclude;
|
nCurrentStatus = STAT_isInclude;
|
||||||
snprintf(tzCurrentFileName, _MAX_PATH + 1, "%s", tzFileName);
|
snprintf(tzCurrentFileName, _MAX_PATH + 1, "%s", pFileName);
|
||||||
CurrentFlexHandle = yy_create_buffer(pCurrentFile);
|
CurrentFlexHandle = yy_create_buffer(pCurrentFile);
|
||||||
yy_switch_to_buffer(CurrentFlexHandle);
|
yy_switch_to_buffer(CurrentFlexHandle);
|
||||||
nLineNo = 1;
|
nLineNo = 1;
|
||||||
|
|||||||
@@ -156,28 +156,71 @@ YY_BUFFER_STATE yy_create_buffer(FILE *f)
|
|||||||
if (pBuffer == NULL)
|
if (pBuffer == NULL)
|
||||||
fatalerror("%s: Out of memory!", __func__);
|
fatalerror("%s: Out of memory!", __func__);
|
||||||
|
|
||||||
uint32_t size;
|
size_t size = 0, capacity = -1;
|
||||||
|
char *buf = NULL;
|
||||||
|
|
||||||
fseek(f, 0, SEEK_END);
|
/*
|
||||||
size = ftell(f);
|
* Check if we can get the file size without implementation-defined
|
||||||
fseek(f, 0, SEEK_SET);
|
* behavior:
|
||||||
|
*
|
||||||
|
* From ftell(3p):
|
||||||
|
* [On error], ftell() and ftello() shall return −1, and set errno to
|
||||||
|
* indicate the error.
|
||||||
|
*
|
||||||
|
* The ftell() and ftello() functions shall fail if: [...]
|
||||||
|
* ESPIPE The file descriptor underlying stream is associated with a
|
||||||
|
* pipe, FIFO, or socket.
|
||||||
|
*
|
||||||
|
* From fseek(3p):
|
||||||
|
* The behavior of fseek() on devices which are incapable of seeking
|
||||||
|
* is implementation-defined.
|
||||||
|
*/
|
||||||
|
if (ftell(f) != -1) {
|
||||||
|
fseek(f, 0, SEEK_END);
|
||||||
|
capacity = ftell(f);
|
||||||
|
rewind(f);
|
||||||
|
}
|
||||||
|
|
||||||
/* Give extra room for 2 newlines and terminator */
|
// If ftell errored or the block above wasn't executed
|
||||||
uint32_t capacity = size + 3;
|
if (capacity == -1)
|
||||||
|
capacity = 4096;
|
||||||
|
// Handle 0-byte files gracefully
|
||||||
|
else if (capacity == 0)
|
||||||
|
capacity = 1;
|
||||||
|
|
||||||
pBuffer->pBufferRealStart = malloc(capacity + SAFETYMARGIN);
|
while (!feof(f)) {
|
||||||
|
if (buf == NULL || size >= capacity) {
|
||||||
|
if (buf)
|
||||||
|
capacity *= 2;
|
||||||
|
/* Give extra room for 2 newlines and terminator */
|
||||||
|
buf = realloc(buf, capacity + SAFETYMARGIN + 3);
|
||||||
|
|
||||||
if (pBuffer->pBufferRealStart == NULL)
|
if (buf == NULL)
|
||||||
fatalerror("%s: Out of memory for buffer!", __func__);
|
fatalerror("%s: Out of memory for buffer!",
|
||||||
|
__func__);
|
||||||
|
}
|
||||||
|
|
||||||
pBuffer->pBufferStart = pBuffer->pBufferRealStart + SAFETYMARGIN;
|
char *bufpos = buf + SAFETYMARGIN + size;
|
||||||
pBuffer->pBuffer = pBuffer->pBufferRealStart + SAFETYMARGIN;
|
size_t read_count = fread(bufpos, 1, capacity - size, f);
|
||||||
|
|
||||||
size = fread(pBuffer->pBuffer, sizeof(uint8_t), size, f);
|
if (read_count == 0 && !feof(f))
|
||||||
|
fatalerror("%s: fread error", __func__);
|
||||||
|
|
||||||
|
size += read_count;
|
||||||
|
}
|
||||||
|
|
||||||
|
pBuffer->pBufferRealStart = buf;
|
||||||
|
pBuffer->pBufferStart = buf + SAFETYMARGIN;
|
||||||
|
pBuffer->pBuffer = buf + SAFETYMARGIN;
|
||||||
pBuffer->pBuffer[size] = 0;
|
pBuffer->pBuffer[size] = 0;
|
||||||
pBuffer->nBufferSize = size;
|
pBuffer->nBufferSize = size;
|
||||||
|
|
||||||
|
/* This is added here to make the buffer scaling above easy to express,
|
||||||
|
* while taking the newline space into account
|
||||||
|
* for the `yy_buffer_append`s below.
|
||||||
|
*/
|
||||||
|
capacity += 3;
|
||||||
|
|
||||||
/* Convert all line endings to LF and spaces */
|
/* Convert all line endings to LF and spaces */
|
||||||
|
|
||||||
char *mem = pBuffer->pBuffer;
|
char *mem = pBuffer->pBuffer;
|
||||||
|
|||||||
0
test/asm/bank-noexist.out.pipe
Normal file
0
test/asm/bank-noexist.out.pipe
Normal file
2
test/asm/divzero-instr.out.pipe
Normal file
2
test/asm/divzero-instr.out.pipe
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
ERROR: -(2):
|
||||||
|
Division by zero
|
||||||
4
test/asm/divzero-section-bank.out.pipe
Normal file
4
test/asm/divzero-section-bank.out.pipe
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
ERROR: -(1):
|
||||||
|
Invalid integer constant
|
||||||
|
ERROR: -(1):
|
||||||
|
Division by zero
|
||||||
0
test/asm/equ-charmap.out.pipe
Normal file
0
test/asm/equ-charmap.out.pipe
Normal file
3
test/asm/label-redefinition.out.pipe
Normal file
3
test/asm/label-redefinition.out.pipe
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
ERROR: -(7):
|
||||||
|
'Sym' already defined in m(6)
|
||||||
|
error: Assembly aborted (1 errors)!
|
||||||
2
test/asm/line-continuation.out.pipe
Normal file
2
test/asm/line-continuation.out.pipe
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
ERROR: -(2) -> @(-1):
|
||||||
|
Macro '@' not defined
|
||||||
3
test/asm/local-wrong-parent.out.pipe
Normal file
3
test/asm/local-wrong-parent.out.pipe
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
ERROR: -(5):
|
||||||
|
Not currently in the scope of 'WrongParent'
|
||||||
|
error: Assembly aborted (1 errors)!
|
||||||
2
test/asm/macro-@.out.pipe
Normal file
2
test/asm/macro-@.out.pipe
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
ERROR: -(1) -> @(-1):
|
||||||
|
Macro '@' not defined
|
||||||
0
test/asm/narg-decreases-after-shift.out.pipe
Normal file
0
test/asm/narg-decreases-after-shift.out.pipe
Normal file
2
test/asm/null-in-macro.out.pipe
Normal file
2
test/asm/null-in-macro.out.pipe
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
ERROR: -(1):
|
||||||
|
Unterminated MACRO definition.
|
||||||
3
test/asm/reference-undefined-sym.out.pipe
Normal file
3
test/asm/reference-undefined-sym.out.pipe
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
ERROR: -(4):
|
||||||
|
'X' already referenced at -(2)
|
||||||
|
error: Assembly aborted (1 errors)!
|
||||||
0
test/asm/remote-local-explicit.out.pipe
Normal file
0
test/asm/remote-local-explicit.out.pipe
Normal file
2
test/asm/remote-local-noexist.out.pipe
Normal file
2
test/asm/remote-local-noexist.out.pipe
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
ERROR: -(7):
|
||||||
|
'Parent.child.fail' is a nonsensical reference to a nested local symbol
|
||||||
0
test/asm/remote-local.out.pipe
Normal file
0
test/asm/remote-local.out.pipe
Normal file
2
test/asm/strlen.out.pipe
Normal file
2
test/asm/strlen.out.pipe
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
$3
|
||||||
|
$4
|
||||||
31
test/asm/strsub.out.pipe
Normal file
31
test/asm/strsub.out.pipe
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
warning: -(13) -> xstrsub(1):
|
||||||
|
STRSUB: Length too big: 32
|
||||||
|
warning: -(14) -> xstrsub(1):
|
||||||
|
STRSUB: Length too big: 300
|
||||||
|
warning: -(15) -> xstrsub(1):
|
||||||
|
STRSUB: Position starts at 1
|
||||||
|
warning: -(15) -> xstrsub(1):
|
||||||
|
STRSUB: Length too big: 300
|
||||||
|
warning: -(16) -> xstrsub(1):
|
||||||
|
STRSUB: Position 4 is past the end of the string
|
||||||
|
warning: -(17) -> xstrsub(1):
|
||||||
|
STRSUB: Position 4 is past the end of the string
|
||||||
|
warning: -(17) -> xstrsub(1):
|
||||||
|
STRSUB: Length too big: 1
|
||||||
|
warning: -(20) -> xstrsub(1):
|
||||||
|
STRSUB: Length too big: 10
|
||||||
|
A
|
||||||
|
B
|
||||||
|
C
|
||||||
|
AB
|
||||||
|
BC
|
||||||
|
BC
|
||||||
|
BC
|
||||||
|
ABC
|
||||||
|
|
||||||
|
|
||||||
|
カタ
|
||||||
|
カナ
|
||||||
|
カナ
|
||||||
|
g
|
||||||
|
g̈
|
||||||
@@ -6,18 +6,25 @@ after=$(mktemp)
|
|||||||
rc=0
|
rc=0
|
||||||
|
|
||||||
for i in *.asm; do
|
for i in *.asm; do
|
||||||
../../rgbasm -o $o $i > $after 2>&1
|
for variant in '' '.pipe'; do
|
||||||
diff -u ${i%.asm}.out $after
|
if [ -z "$variant" ]; then
|
||||||
rc=$(($? || $rc))
|
../../rgbasm -o $o $i > $after 2>&1
|
||||||
bin=${i%.asm}.out.bin
|
else
|
||||||
if [ -f $bin ]; then
|
cat $i | ../../rgbasm -o $o - > $after 2>&1
|
||||||
../../rgblink -o $gb $o > $after 2>&1
|
fi
|
||||||
head -c $(wc -c < $bin) $gb > $after 2>&1
|
|
||||||
hexdump -C $after > $before && mv $before $after
|
diff -u ${i%.asm}.out$variant $after
|
||||||
hexdump -C $bin > $before
|
|
||||||
diff -u $before $after
|
|
||||||
rc=$(($? || $rc))
|
rc=$(($? || $rc))
|
||||||
fi
|
bin=${i%.asm}.out.bin
|
||||||
|
if [ -f $bin ]; then
|
||||||
|
../../rgblink -o $gb $o > $after 2>&1
|
||||||
|
head -c $(wc -c < $bin) $gb > $after 2>&1
|
||||||
|
hexdump -C $after > $before && mv $before $after
|
||||||
|
hexdump -C $bin > $before
|
||||||
|
diff -u $before $after
|
||||||
|
rc=$(($? || $rc))
|
||||||
|
fi
|
||||||
|
done
|
||||||
done
|
done
|
||||||
|
|
||||||
rm -f $o $gb $before $after
|
rm -f $o $gb $before $after
|
||||||
|
|||||||
1
test/asm/undefined-dot.out.pipe
Normal file
1
test/asm/undefined-dot.out.pipe
Normal file
@@ -0,0 +1 @@
|
|||||||
|
error: -(3) : '.' not defined
|
||||||
0
test/asm/utf-8.out.pipe
Normal file
0
test/asm/utf-8.out.pipe
Normal file
0
test/asm/zero-byte-file.asm
Normal file
0
test/asm/zero-byte-file.asm
Normal file
0
test/asm/zero-byte-file.out
Normal file
0
test/asm/zero-byte-file.out
Normal file
0
test/asm/zero-byte-file.out.pipe
Normal file
0
test/asm/zero-byte-file.out.pipe
Normal file
Reference in New Issue
Block a user