|
|
1.1 root 1: /* 1.1.1.5 root 2: Hatari tool: MSA and ST disk image creator and converter - hmsa.c 1.1 root 3: 1.1.1.7 ! root 4: This file is distributed under the GNU General Public License, version 2 ! 5: or at your option any later version. Read the file gpl.txt for details. 1.1 root 6: */ 7: 8: #include <stdio.h> 9: #include <stdlib.h> 10: #include <stdarg.h> 11: #include <string.h> 12: 13: #include "hmsa.h" 1.1.1.2 root 14: #include "main.h" /* bool etc. */ 1.1.1.5 root 15: #include "createBlankImage.h" 1.1 root 16: #include "file.h" 17: #include "msa.h" 18: 1.1.1.3 root 19: /* prototypes for dummy log/alert functions below */ 20: #include "dialog.h" 21: #include "log.h" 1.1 root 22: 23: /** 1.1.1.5 root 24: * Print suitable output prefix based on log level 25: */ 26: static void print_prefix(LOGTYPE nType) 27: { 28: const char *sType; 29: switch (nType) { 30: case LOG_FATAL: 31: case LOG_ERROR: 32: sType = "ERROR: "; 33: break; 34: case LOG_WARN: 35: sType = "WARNING: "; 36: break; 37: default: 38: return; 39: } 40: fputs(sType, stdout); 41: } 42: 43: /** 44: * Output Hatari log string. 1.1 root 45: */ 1.1.1.3 root 46: extern void Log_Printf(LOGTYPE nType, const char *psFormat, ...) 1.1 root 47: { 48: va_list argptr; 1.1.1.5 root 49: print_prefix(nType); 50: va_start(argptr, psFormat); 51: vfprintf(stdout, psFormat, argptr); 52: va_end(argptr); 1.1 root 53: } 54: 1.1.1.5 root 55: /** 56: * Output Hatari Alert dialog string. 57: */ 58: extern void Log_AlertDlg(LOGTYPE nType, const char *psFormat, ...) 59: { 60: va_list argptr; 61: print_prefix(nType); 62: va_start(argptr, psFormat); 63: vfprintf(stdout, psFormat, argptr); 64: va_end(argptr); 65: /* Add a new-line if necessary: */ 66: if (psFormat[strlen(psFormat)-1] != '\n') 67: fputs("\n", stdout); 68: } 1.1 root 69: 70: /** 1.1.1.5 root 71: * Output Hatari Query dialog string. 1.1 root 72: */ 73: int DlgAlert_Query(const char *text) 74: { 75: puts(text); 76: return TRUE; 77: } 78: 1.1.1.5 root 79: /** 80: * Create MSA or ST image of requested size. 81: * return error string or NULL for success. 82: */ 83: static const char* create_image(const char *filename, const char *sizeid) 84: { 85: int tracks, sectors, sides; 86: tracks = 80; 87: 88: if (strcasecmp(sizeid, "ss") == 0) { 89: sides = 1; 90: sectors = 9; 91: } else if (strcasecmp(sizeid, "ds") == 0) { 92: sides = 2; 93: sectors = 9; 94: } else if (strcasecmp(sizeid, "hd") == 0) { 95: sides = 2; 96: sectors = 18; 97: } else if (strcasecmp(sizeid, "ed") == 0) { 98: sides = 2; 99: sectors = 36; 100: } else { 101: return "ERROR: given disk size isn't one of supported ones!\n"; 102: } 103: if (CreateBlankImage_CreateFile(filename, tracks, sectors, sides)) { 104: return NULL; 105: } 106: return "ERROR: Disk creation failed.\n"; 107: } 108: 109: /** 110: * Print program usage 111: */ 112: static void usage(const char *name) 113: { 114: printf("\n\ 115: Hatari MSA (Magic Shadow Archiver) / ST disk image creator & converter v0.3.\n\ 116: \n\ 117: Usage: %s FILENAME [DISK SIZE]\n\ 118: \n\ 119: If you give only one parameter - the file name of an existing MSA\n\ 120: or ST disk image, this image will be converted to the other disk image\n\ 121: format under a suitable new file name. Disk image format is recognized\n\ 122: based on the file name extension (.msa or .st).\n\ 123: \n\ 124: If the given file doesn't exist and you give also a disk size\n\ 125: (SS, DS, HD, ED), an empty disk of the given size will be created.\n\ 126: \n\ 1.1.1.7 ! root 127: This software is distributed under the GNU General Public License, version 2\n\ ! 128: or at your option any later version. Please read the file gpl.txt for details.\n\ 1.1.1.5 root 129: \n", 130: name); 131: } 1.1 root 132: 133: /** 1.1.1.5 root 134: * Command line argument parsing and new disk creation 1.1 root 135: */ 136: int main(int argc, char *argv[]) 137: { 1.1.1.5 root 138: bool isMsa; 1.1 root 139: int retval; 1.1.1.5 root 140: long disksize; 141: unsigned char *diskbuf; 142: const char *srcfile, *srcdot; 143: char *dstfile, *dstdot; 144: 145: if(argc < 2 || argv[1][0] == '-') { 146: usage(argv[0]); 1.1 root 147: return 0; 148: } 149: 1.1.1.5 root 150: srcfile = argv[1]; 1.1.1.6 root 151: srcdot = strrchr(srcfile, '.'); 1.1.1.5 root 152: if(srcdot == NULL) { 153: usage(argv[0]); 154: fprintf(stderr, "ERROR: extension missing for file name %s!\n", argv[1]); 1.1 root 155: return -1; 156: } 157: 1.1.1.5 root 158: if (strcasecmp(srcdot, ".msa") == 0) { 159: isMsa = true; 160: } else if (strcasecmp(srcdot, ".st") == 0) { 161: isMsa = false; 162: } else { 163: usage(argv[0]); 164: fprintf(stderr, "ERROR: unrecognized file name extension %s (not .msa or .st)!\n", srcdot); 1.1 root 165: return -1; 166: } 167: 1.1.1.5 root 168: if (!File_Exists(srcfile)) { 169: const char *errstr; 170: if (argc != 3) { 171: usage(argv[0]); 172: fprintf(stderr, "ERROR: disk size for the new disk image not given!\n"); 1.1 root 173: return -1; 174: } 1.1.1.5 root 175: errstr = create_image(srcfile, argv[2]); 176: if (errstr) { 177: usage(argv[0]); 178: fputs(errstr, stderr); 1.1 root 179: return -1; 180: } 1.1.1.5 root 181: return 0; 182: } 1.1 root 183: 1.1.1.5 root 184: dstfile = malloc(strlen(srcfile) + 6); 185: if (dstfile == NULL) { 186: fprintf(stderr, "ERROR: No memory for new disk name!\n"); 187: return -1; 188: } 1.1 root 189: 1.1.1.5 root 190: strcpy(dstfile, srcfile); 1.1.1.6 root 191: dstdot = strrchr(dstfile, '.'); 1.1.1.5 root 192: if (isMsa) { 193: /* Convert MSA to ST disk image */ 194: strcpy(dstdot, ".st"); 195: } else { 196: /* Convert ST to MSA disk image */ 197: strcpy(dstdot, ".msa"); 198: } 1.1 root 199: 1.1.1.5 root 200: if (File_Exists(dstfile)) { 201: fprintf(stderr, "ERROR: Destination disk image %s exists already!\n", dstfile); 202: free(dstfile); 203: return -1; 204: } 205: 206: if (isMsa) { 207: /* Read the source disk image */ 208: diskbuf = MSA_ReadDisk(srcfile, &disksize); 209: if (!diskbuf || disksize < 512*8) { 210: fprintf(stderr, "ERROR: could not read MSA disk %s!\n", srcfile); 211: retval = -1; 212: } else { 213: printf("Converting %s to %s (%li Bytes).\n", srcfile, dstfile, disksize); 214: retval = File_Save(dstfile, diskbuf, disksize, FALSE); 215: } 216: } else { 217: /* Just read disk image directly into buffer */ 218: disksize = 0; 219: diskbuf = File_Read(srcfile, &disksize, NULL); 220: if (!diskbuf || disksize < 512*8) { 221: fprintf(stderr, "ERROR: could not read ST disk %s!\n", srcfile); 222: retval = -1; 223: } else { 224: printf("Converting %s to %s (%li Bytes).\n", srcfile, dstfile, disksize); 225: retval = MSA_WriteDisk(dstfile, diskbuf, disksize); 226: } 1.1 root 227: } 228: 1.1.1.5 root 229: if (diskbuf) { 230: free(diskbuf); 231: } 232: free(dstfile); 1.1 root 233: 234: return retval; 235: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.