/* * mkimg2.c * * Create empty hard disk or floppy disk images for bochs. * */ #include #include #include #include "config.h" /* remove leading spaces, newline junk at end. return pointer to cleaned string, which is between s0 and the null */ char * clean_string (char *s0) { char *s = s0; char *ptr; /* find first nonblank */ while (isspace (*s)) s++; /* truncate string at first non-alphanumeric */ ptr = s; while (isprint (*ptr)) ptr++; *ptr = 0; return s; } /* returns 0 on success, -1 on failure */ int ask_int (char *prompt, int min, int max, int the_default, int *out) { int n = max + 1; char buffer[1024]; char *clean; int illegal; while (1) { printf ("%s", prompt); if (!fgets (buffer, sizeof(buffer), stdin)) return -1; //printf ("Before cleaning we had: '%s'\n", buffer); clean = clean_string (buffer); //printf ("After cleaning we had: '%s'\n", clean); if (strlen(clean) < 1) { // empty line, use the default *out = the_default; return 0; } illegal = (1 != sscanf (buffer, "%d", &n)); if (illegal || nmax) { printf ("Your choice (%s) was not an integer between %d and %d.\n\n", clean, min, max); } else { // choice is okay *out = n; return 0; } } } int ask_menu (char *prompt, int n_choices, char *choice[], int the_default, int *out) { char buffer[1024]; char *clean; int i; *out = -1; while (1) { printf ("%s", prompt); if (!fgets (buffer, sizeof(buffer), stdin)) return -1; //printf ("Before cleaning we had: '%s'\n", buffer); clean = clean_string (buffer); //printf ("After cleaning we had: '%s'\n", clean); if (strlen(clean) < 1) { // empty line, use the default *out = the_default; return 0; } for (i=0; i0) printf (", "); printf ("%s", choice[i]); } printf ("\n"); } } int ask_string (char *prompt, char *the_default, char *out) { char buffer[1024]; char *clean; int i; out[0] = 0; printf ("%s", prompt); if (!fgets (buffer, sizeof(buffer), stdin)) return -1; //printf ("Before cleaning we had: '%s'\n", buffer); clean = clean_string (buffer); //printf ("After cleaning we had: '%s'\n", clean); if (strlen(clean) < 1) { // empty line, use the default strcpy (out, the_default); return 0; } strcpy (out, clean); return 0; } char *fdhd_menu = "\nDo you want to create a floppy disk image or a hard disk image?\nPlease type hd or fd. [hd] "; char *fdhd_choices[] = { "fd", "hd" }; int fdhd_n_choices = 2; char *fdsize_menu = "\nChoose the size of floppy disk image to create, in megabytes.\nPlease type 0.72, 1.2, 1.44, or 2.88. [1.44] "; char *fdsize_choices[] = { "0.72","1.2","1.44","2.88" }; int fdsize_n_choices = 4; void panic (char *c) { printf ("Internal error: %s\n", c); exit (1); } int make_image (int sec, char *filename) { FILE *fp = fopen (filename, "w"); char buffer[1024]; int i; unsigned int n; if (fp == NULL) { // attempt to print an error #ifdef HAVE_PERROR sprintf (buffer, "while opening '%s' for writing", filename); perror (buffer); #endif exit (1); } // clear the buffer for (i=0; i<512; i++) buffer[i] = 0; // write it however many times printf ("\nWriting: "); for (i=0; i