static int fsdevice_flush_partition(vdrive_t* vdrive, char* arg) { char* comma; int er; if (arg == NULL || *arg == '\0') { er = CBMDOS_IPE_SYNTAX; /* change to root partition not implemented */ } else if ((comma = strchr(arg, ',')) == NULL) { er = fsdevice_flush_cd(vdrive, arg); } else { /* create partition: check syntax */ int i = 0; *comma++ = '\0'; for (i = 0; i < 4 && *comma++; i++) { } if (i == 4 && *comma++ == ',' && *comma++ == 'c' && !*comma) { er = fsdevice_flush_mkdir(arg); } else { er = CBMDOS_IPE_SYNTAX; } } return er; }
void fsdevice_flush(vdrive_t *vdrive, unsigned int secondary) { unsigned int dnr; char *cmd, *realarg, *arg; char *cbmcmd; int er = CBMDOS_IPE_SYNTAX; dnr = vdrive->unit - 8; if ((secondary != 15) || (!(fsdevice_dev[dnr].cptr))) { return; } cbmcmd = lib_malloc(ioutil_maxpathlen()); /* FIXME: Use `vdrive_command_parse()'! */ /* remove trailing cr */ while (fsdevice_dev[dnr].cptr && (fsdevice_dev[dnr].cmdbuf[fsdevice_dev[dnr].cptr - 1] == 13)) { (fsdevice_dev[dnr].cptr)--; } fsdevice_dev[dnr].cmdbuf[fsdevice_dev[dnr].cptr] = 0; strcpy(cbmcmd, (char *)(fsdevice_dev[dnr].cmdbuf)); charset_petconvstring((BYTE *)cbmcmd, 1); /* CBM name to FSname */ cmd = cbmcmd; while (*cmd == ' ') { cmd++; } arg = strchr(cbmcmd, ':'); if (arg != NULL) { *arg++ = '\0'; } realarg = strchr((char *)(fsdevice_dev[dnr].cmdbuf), ':'); if (realarg != NULL) { *realarg++ = '\0'; } /* i v n r s c b-r chn drv trk sec u1 chn drv trk sec b-w chn drv trk sec u2 chn drv trk sec b-p chn pos b-a drv trk sec b-f drv trk sec b-e chn drv trk sec m-r lo hi len m-w lo hi len <data> m-e lo hi u9/ui switch mode u:/uj reset cd cd_ / md rd */ if (!strncmp((char *)(fsdevice_dev[dnr].cmdbuf), "M-R", 3)) { er = fsdevice_flush_mr(vdrive, realarg); } else if (!strncmp((char *)(fsdevice_dev[dnr].cmdbuf), "M-W", 3)) { er = fsdevice_flush_mw(vdrive, realarg); } else if (!strncmp((char *)(fsdevice_dev[dnr].cmdbuf), "M-E", 3)) { er = fsdevice_flush_me(vdrive, realarg); } else if (!strcmp(cmd, "u1")) { er = fsdevice_flush_u1(vdrive, realarg); } else if (!strcmp(cmd, "u2")) { er = fsdevice_flush_u2(vdrive, realarg); } else if (!strncmp((char *)(fsdevice_dev[dnr].cmdbuf), "B-A", 3)) { er = fsdevice_flush_ba(vdrive, realarg); } else if (!strncmp((char *)(fsdevice_dev[dnr].cmdbuf), "B-F", 3)) { er = fsdevice_flush_bf(vdrive, realarg); } else if (!strncmp((char *)(fsdevice_dev[dnr].cmdbuf), "B-R", 3)) { er = fsdevice_flush_br(vdrive, realarg); } else if (!strncmp((char *)(fsdevice_dev[dnr].cmdbuf), "B-W", 3)) { er = fsdevice_flush_bw(vdrive, realarg); } else if (!strncmp((char *)(fsdevice_dev[dnr].cmdbuf), "B-P", 3)) { er = fsdevice_flush_bp(vdrive, realarg); } else if (!strncmp((char *)(fsdevice_dev[dnr].cmdbuf), "B-E", 3)) { er = fsdevice_flush_be(vdrive, realarg); } else if (!strcmp(cmd, "cd")) { er = fsdevice_flush_cd(vdrive, arg); } else if (!strcmp((char *)(fsdevice_dev[dnr].cmdbuf), "CD_")) { er = fsdevice_flush_cdup(vdrive); } else if (*cmd == '/') { er = fsdevice_flush_partition(vdrive, arg); } else if (!strcmp(cmd, "md")) { er = fsdevice_flush_mkdir(arg); } else if (!strcmp(cmd, "rd")) { er = fsdevice_flush_remove(arg); } else if ((!strcmp(cmd, "ui")) || (!strcmp(cmd, "u9"))) { er = fsdevice_flush_reset(); } else if ((!strcmp(cmd, "uj")) || (!strcmp(cmd, "u:"))) { er = fsdevice_flush_reset(); } else if (*cmd == 'i') { /* additional args for I are ignored */ er = fsdevice_flush_initialize(vdrive); } else if (*cmd == 'v') { /* additional args for V are ignored */ er = fsdevice_flush_validate(vdrive); } else if (*cmd == 'n' && arg != NULL) { er = fsdevice_flush_new(vdrive, realarg); } else if (*cmd == 'r' && arg != NULL) { er = fsdevice_flush_rename(vdrive, realarg); } else if (*cmd == 's' && arg != NULL) { er = fsdevice_flush_scratch(vdrive, realarg); } fsdevice_error(vdrive, er); fsdevice_dev[dnr].cptr = 0; lib_free(cbmcmd); }