Skip to content

Commit

Permalink
Fix Issue#163.
Browse files Browse the repository at this point in the history
The issue was caused the *DIN command parser being confused by names
that started with a numeric character.  This commit mostly re-writes the
parser to handle that case correctly.
  • Loading branch information
Steve Fosdick committed Dec 18, 2021
1 parent f4e0771 commit 85d1bec
Show file tree
Hide file tree
Showing 2 changed files with 42 additions and 28 deletions.
5 changes: 4 additions & 1 deletion src/sdf-acc.c
Original file line number Diff line number Diff line change
Expand Up @@ -562,6 +562,9 @@ void mmb_load(char *fn)
}
mmb_ptr += MMB_ZONE_CAT_SIZE;
}
unsigned i = 0;
for (mmb_ptr = mmb_cat; mmb_ptr < mmb_end; mmb_ptr += 16)
log_debug("sdf-acc: mmb#%04u=%-12.12s", i++, mmb_ptr);
if (mmb_fp) {
fclose(mmb_fp);
if (sdf_fp[1] == mmb_fp) {
Expand Down Expand Up @@ -648,7 +651,7 @@ static inline int cat_name_cmp(const char *nam_ptr, const char *cat_ptr, const c
if ((cat_ch ^ nam_ch) & 0x5f)
return -1;
} while (cat_nxt != cat_ptr);
return (cat_nxt - mmb_cat) / 16 - 2;
return (cat_nxt - mmb_cat) / 16 - 1;
}

int mmb_find(const char *name)
Expand Down
65 changes: 38 additions & 27 deletions src/vdfs.c
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
#define _DEBUG
/*
* VDFS for B-EM
* Steve Fosdick 2016-2020
Expand Down Expand Up @@ -4162,15 +4163,18 @@ static void cmd_vdfs(uint16_t addr)
}
}

static int mmb_parse_find(uint16_t addr, int ch)
static int mmb_parse_find(uint16_t addr)
{
char name[17];
int i;
int ch = readmem(addr++);
int i = 0;
bool quote = false;

if (ch == '"')
if (ch == '"') {
quote = true;
ch = readmem(addr++);
i = 0;
while (ch != '"' && ch != '\r' && i < sizeof(name)) {
}
while (ch != '\r' && i < sizeof(name) && ((quote && ch != '"') || (!quote && ch != ' '))) {
name[i++] = ch;
ch = readmem(addr++);
}
Expand Down Expand Up @@ -4209,34 +4213,41 @@ static bool mmb_check_pick(unsigned drive, unsigned disc)

static void cmd_mmb_din(uint16_t addr)
{
int num1, num2, ch;

ch = readmem(addr++);
if (ch >= '0' && ch <= '9') {
num1 = ch - '0';
while ((ch = readmem(addr++)) >= '0' && ch <= '9')
num1 = num1 * 10 + ch - '0';
int num1 = 0, num2 = 0;
uint16_t addr2 = addr;
int ch = readmem(addr2);
while (ch >= '0' && ch <= '9') {
num1 = num1 * 10 + ch - '0';
ch = readmem(++addr2);
}
if (ch == ' ' || ch == '\r') {
while (ch == ' ')
ch = readmem(addr++);
ch = readmem(++addr2);
if (ch == '\r')
mmb_check_pick(0, num1);
else if (ch >= '0' && ch <= '9') {
num2 = ch - '0';
while ((ch = readmem(addr++)) >= '0' && ch <= '9')
else {
addr = addr2;
while (ch >= '0' && ch <= '9') {
num2 = num2 * 10 + ch - '0';
if (num1 >= 0 && num1 <= 3)
mmb_check_pick(num1, num2);
else
adfs_error(err_badparms);
}
else if ((num2 = mmb_parse_find(addr, ch)) >= 0) {
if (num1 >= 0 && num1 <= 3)
mmb_check_pick(num1, num2);
else
adfs_error(err_badparms);
ch = readmem(++addr2);
}
if (ch == ' ' || ch == '\r') {
while (ch == ' ')
ch = readmem(++addr2);
if (ch == '\r' && num1 >= 0 && num1 <= 3)
mmb_check_pick(num1, num2);
else
adfs_error(err_badparms);
}
else if ((num2 = mmb_parse_find(addr)) >= 0) {
if (num1 >= 0 && num1 <= 3)
mmb_check_pick(num1, num2);
else
adfs_error(err_badparms);
}
}
}
else if ((num1 = mmb_parse_find(addr, ch)) >= 0)
else if ((num1 = mmb_parse_find(addr)) >= 0)
mmb_check_pick(0, num1);
}

Expand Down

0 comments on commit 85d1bec

Please sign in to comment.