main(int argc, char **argv) { long i; if (argc != 2) { printf("BACKMAP%ld [filespec] by Ken Silverman\n",NEWMAPVERSION); printf("This BACKMAP%ld.EXE converts map version %ld to map version %ld\n",NEWMAPVERSION,NEWMAPVERSION+1,NEWMAPVERSION); exit(0); } menunamecnt = 0; getfilenames(argv[1]); sortfilenames(); if (menunamecnt == 0) { printf("BACKMAP%ld [filespec] by Ken Silverman\n",NEWMAPVERSION); printf("This BACKMAP%ld.EXE converts map version %ld to map version %ld\n",NEWMAPVERSION,NEWMAPVERSION+1,NEWMAPVERSION); printf("File not found\n"); exit(0); } printf("Converting map version %ld to map version %ld\n",NEWMAPVERSION+1,NEWMAPVERSION); for(i=0;i<menunamecnt;i++) convmap(menuname[i]); }
static bbc_status_t remote_crc(serial_h com, bool wildcards, bool directories) { bbc_status_t result = BBC_OK ; char name[MAXLINELEN] ; if ( filespec(name, MAXLINELEN, wildcards, directories) == 0 ) return BBC_OK ; if ( wildcards ) { filelist *files ; if ( (result = getfilenames(com, name, &files, directories)) == BBC_SYNC ) { result = BBC_OK ; while ( files && !interrupted(true) ) { filelist *next = files->next ; if ( (result = retrieve_crc(com, files)) != BBC_OK ) { printf("Error retrieving CRC of %s, skipping\n", files->name) ; free(files) ; files = next ; break ; } free(files) ; files = next ; } while ( files ) { filelist *next = files->next ; printf("Skipping file %s because of previous error\n", files->name) ; free(files) ; files = next ; } } } else { filelist file ; strcpy(file.name, name) ; if ( (result = retrieve_crc(com, &file)) != BBC_OK ) printf("Error retrieving CRC for %s\n", name) ; } return result ; }
static bbc_status_t retrieve_file(serial_h com, filelist *file) { bbc_status_t result ; file->type = 0 ; if ( (result = getfileinfo(com, file)) == BBC_OK ) { char pcname[MAXLINELEN] ; FILE *pcfile ; bool fileerr = false ; if ( file->type == 0 ) { /* OSFILE returned 0 */ printf("File %s does not exist on BBC, skipping\n", file->name) ; return BBC_OK ; } strcpy(pcname, file->name) ; /* Check if PC name is used */ if ( !check_pcname(file->type == 2 ? "Directory" : "File", pcname, MAXLINELEN) ) return BBC_OK ; if ( file->type == 1 ) { /* OSFILE indicates it's a file */ char buffer[BBCTRACKSIZE] ; int fhandle, size ; if ( (pcfile = fopen(pcname, "wb")) == NULL ) { printf("Can't open PC file %s to retrieve %s, skipping\n", pcname, file->name) ; return BBC_OK ; } printf("Retrieving file %s %x %x %x %c%c%c%c to %s\n", file->name, file->load, file->exec, file->length, (file->attrs & FILE_Not_R) ? ' ' : 'R', (file->attrs & FILE_Not_W) ? ' ' : 'W', (file->attrs & FILE_Not_X) ? ' ' : 'X', (file->attrs & FILE_Not_D) ? 'L' : ' ', pcname) ; serial_printf(com, "S%s\r", file->name) ; if ( (result = bbc_readline(com, buffer, MAXLINELEN)) == BBC_SYNC && (result = bbc_readline(com, buffer, MAXLINELEN)) == BBC_OK && sscanf(buffer, "%d", &fhandle) == 1 && fhandle != 0 && (result = bbc_readline(com, buffer, MAXLINELEN)) == BBC_OK && sscanf(buffer, "%d", &size) == 1 ) { int remaining = size, nbytes = 0 ; unsigned int crc = 0; while ( remaining > 0 ) { int rbytes = remaining > BBCTRACKSIZE ? BBCTRACKSIZE : remaining ; if ( (result = bbc_read(com, buffer, &rbytes)) == BBC_OK ) { if ( !fileerr && (int)fwrite(buffer, sizeof(char), rbytes, pcfile) != rbytes ) fileerr = true ; remaining -= rbytes ; nbytes += rbytes ; crccalc(buffer, rbytes, &crc) ; printf("\rRead %d bytes of %d", nbytes, size) ; fflush(stdout) ; } else /* Error reading bytes */ break ; } putchar('\n') ; if ( result == BBC_OK ) { unsigned int bbccrc = 0 ; if ( (result = bbc_readline(com, buffer, MAXLINELEN)) != BBC_OK || sscanf(buffer, "%u", &bbccrc) != 1 ) { printf("Problem retrieving CRC for %s from BBC\n", file->name) ; fileerr = true ; } else if ( bbccrc != crc ) { printf("CRC error for %s (%x not equal to %x)\n", file->name, crc, bbccrc) ; fileerr = true ; } } } else { printf("Problem opening %s on BBC, skipping\n", file->name) ; fileerr = true ; } fclose(pcfile) ; } else if ( file->type == 2 ) { /* OSFILE indicates it's a directory */ char pcdir[MAXLINELEN], bbcdir[MAXLINELEN] ; filelist *subfiles = NULL ; printf("Retrieving directory %s %x %x %x %c%c%c%c to %s\n", file->name, file->load, file->exec, file->length, (file->attrs & FILE_Not_R) ? ' ' : 'R', (file->attrs & FILE_Not_W) ? ' ' : 'W', (file->attrs & FILE_Not_X) ? ' ' : 'X', (file->attrs & FILE_Not_D) ? 'L' : ' ', pcname) ; (void)mkdir(pcname, 0755) ; if ( getcwd(pcdir, MAXLINELEN) && (result = getcurdir(com, bbcdir, MAXLINELEN)) == BBC_OK ) { if ( chdir(pcname) == 0 ) { if ( (result = setcurdir(com, file->name)) == BBC_SYNC ) { if ( (result = getfilenames(com, "*", &subfiles, false)) == BBC_SYNC ) { result = BBC_OK ; while ( subfiles && !interrupted(false) ) { filelist *next = subfiles->next ; if ( (result = retrieve_file(com, subfiles)) != BBC_OK ) { printf("Error retrieving file %s, skipping\n", subfiles->name) ; free(subfiles) ; subfiles = next ; fileerr = true ; break ; } free(subfiles) ; subfiles = next ; } while ( subfiles ) { filelist *next = subfiles->next ; printf("Skipping file %s because of previous error\n", subfiles->name) ; free(subfiles) ; subfiles = next ; } if ( interrupted(true) ) fileerr = true ; } if ( result == BBC_OK && (result = setcurdir(com, bbcdir)) == BBC_SYNC ) result = BBC_OK ; } (void)chdir(pcdir) ; } } } else { printf("File %s has unknown OSFILE type %d, skipping\n", file->name, file->type) ; return BBC_OK ; } if ( result == BBC_OK && !fileerr ) { /* Write .inf file */ char *basename ; strcat(pcname, ".inf") ; /* Get basename to compare against; if !boot, get boot option */ if ( (basename = strrchr(file->name, '.')) != NULL ) ++basename ; else basename = file->name ; if ( (pcfile = fopen(pcname, "w")) != NULL ) { fprintf(pcfile, "%s %06x %06x %06x%s", file->name, file->load, file->exec, file->length, (file->attrs & FILE_Not_D) ? " Locked" : "") ; /* Use qmatch to use case-insensitive comparison */ if ( qmatch("!boot", basename, -1) ) { char buffer[MAXLINELEN] ; if ( (result = getbootopt(com, buffer, MAXLINELEN)) == BBC_OK ) fprintf(pcfile, " OPT4=%s", buffer) ; } fprintf(pcfile, " ATTR=%x TYPE=%d\n", file->attrs, file->type) ; fclose(pcfile) ; } else { /* Can't open .inf name, delete downloaded file */ printf("Problem creating info file %s.inf, skipping\n", file->name) ; pcname[strlen(pcname) - 4] = '\0' ; remove(pcname) ; } } else { /* If download failed, remove file */ remove(pcname) ; } } return result ; }
static void PopulateForm(int32_t pgs) { HWND hwnd; char buf[512]; int32_t i,j; if (pgs & POPULATE_GAMEDIRS) { CACHE1D_FIND_REC *dirs = NULL; hwnd = GetDlgItem(pages[TAB_CONFIG], IDCGAMEDIR); getfilenames("/"); (void)ComboBox_ResetContent(hwnd); j = ComboBox_AddString(hwnd, "None"); (void)ComboBox_SetItemData(hwnd, j, 0); (void)ComboBox_SetCurSel(hwnd, j); for (dirs=finddirs,i=1; dirs != NULL; dirs=dirs->next,i++) { (void)ComboBox_AddString(hwnd, dirs->name); (void)ComboBox_SetItemData(hwnd, i, i); if (Bstrcasecmp(dirs->name,settings.gamedir) == 0) (void)ComboBox_SetCurSel(hwnd, i); } } if (pgs & POPULATE_VIDEO) { int32_t mode; hwnd = GetDlgItem(pages[TAB_CONFIG], IDCVMODE); mode = checkvideomode(&settings.xdim, &settings.ydim, settings.bpp, settings.flags&1, 1); if (mode < 0 || (settings.bpp < 15 && (settings.flags & 2))) { int32_t cd[] = { 32, 24, 16, 15, 8, 0 }; for (i=0; cd[i];) { if (cd[i] >= settings.bpp) i++; else break; } for (; cd[i]; i++) { mode = checkvideomode(&settings.xdim, &settings.ydim, cd[i], settings.flags&1, 1); if (mode < 0) continue; settings.bpp = cd[i]; break; } } Button_SetCheck(GetDlgItem(pages[TAB_CONFIG], IDCFULLSCREEN), ((settings.flags&1) ? BST_CHECKED : BST_UNCHECKED)); Button_SetCheck(GetDlgItem(pages[TAB_CONFIG], IDCPOLYMER), ((settings.flags&2) ? BST_CHECKED : BST_UNCHECKED)); (void)ComboBox_ResetContent(hwnd); for (i=0; i<validmodecnt; i++) { if (validmode[i].fs != (settings.flags & 1)) continue; if ((validmode[i].bpp < 15) && (settings.flags & 2)) continue; // all modes get added to the 3D mode list Bsprintf(buf, "%d x %d %dbpp", validmode[i].xdim, validmode[i].ydim, validmode[i].bpp); j = ComboBox_AddString(hwnd, buf); (void)ComboBox_SetItemData(hwnd, j, i); if (i == mode)(void)ComboBox_SetCurSel(hwnd, j); } } if (pgs & POPULATE_CONFIG) { #if 0 struct audioenumdev *d; char *n; hwnd = GetDlgItem(pages[TAB_CONFIG], IDCSOUNDDRV); (void)ComboBox_ResetContent(hwnd); if (wavedevs) { d = wavedevs->devs; for (i=0; wavedevs->drvs[i]; i++) { strcpy(buf, wavedevs->drvs[i]); if (d->devs) { strcat(buf, ":"); n = buf + strlen(buf); for (j=0; d->devs[j]; j++) { strcpy(n, d->devs[j]); (void)ComboBox_AddString(hwnd, buf); } } else { (void)ComboBox_AddString(hwnd, buf); } d = d->next; } } #endif Button_SetCheck(GetDlgItem(pages[TAB_CONFIG], IDCALWAYSSHOW), (settings.forcesetup ? BST_CHECKED : BST_UNCHECKED)); Button_SetCheck(GetDlgItem(pages[TAB_CONFIG], IDCAUTOLOAD), (!(settings.flags & 4) ? BST_CHECKED : BST_UNCHECKED)); hwnd = GetDlgItem(pages[TAB_CONFIG], IDCINPUT); (void)ComboBox_ResetContent(hwnd); (void)ComboBox_SetCurSel(hwnd, 0); j = 4; #ifdef RENDERTYPEWIN if (di_disabled) j = 2; #endif for (i=0; i<j; i++) { (void)ComboBox_InsertString(hwnd, i, controlstrings[i]); (void)ComboBox_SetItemData(hwnd, i, i); switch (i) { case INPUT_MOUSE: if (settings.usemouse && !settings.usejoy)(void)ComboBox_SetCurSel(hwnd, i); break; case INPUT_JOYSTICK: if (!settings.usemouse && settings.usejoy)(void)ComboBox_SetCurSel(hwnd, i); break; case INPUT_ALL: if (settings.usemouse && settings.usejoy)(void)ComboBox_SetCurSel(hwnd, i); break; } } } if (pgs & POPULATE_GAME) { struct grpfile *fg; int32_t j; char buf[1024]; hwnd = GetDlgItem(pages[TAB_CONFIG], IDCDATA); for (fg = foundgrps; fg; fg=fg->next) { struct grpfile *grp; for (grp = listgrps; grp; grp=grp->next) if (fg->crcval == grp->crcval) break; if (grp == NULL) continue; Bsprintf(buf, "%s\t%s", grp->name, fg->name); j = ListBox_AddString(hwnd, buf); (void)ListBox_SetItemData(hwnd, j, (LPARAM)fg); if (!Bstrcasecmp(fg->name, settings.selectedgrp)) { (void)ListBox_SetCurSel(hwnd, j); settings.game = fg->game; settings.crcval = fg->crcval; } } } }