1494 /* * m2u v1.0 Converts Mac text files to Unix * * Copyright (C) 2000 Mats Peterson * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. * * Please send any comments/bug reports to * mats_peterson@swipnet.se (Mats Peterson) */ #define _POSIX_SOURCE #include #include #include #include #include #include #include #include #define FALSE 0 #define TRUE 1 int translate = FALSE; static unsigned char mac2latin1[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 0, 196, 197, 199, 201, 209, 214, 220, 225, 224, 226, 228, 227, 229, 231, 233, 232, 234, 235, 237, 236, 238, 239, 241, 243, 242, 244, 246, 245, 250, 249, 251, 252, 0, 176, 162, 163, 167, 0, 182, 223, 174, 169, 0, 180, 168, 0, 198, 216, 0, 177, 0, 0, 165, 181, 0, 0, 0, 0, 0, 170, 186, 0, 230, 248, 191, 161, 172, 0, 0, 0, 0, 171, 187, 0, 32, 192, 195, 213, 0, 0, 0, 0, 0, 0, 0, 0, 247, 0, 255, 0, 0, 164, 0, 0, 0, 0, 0, 183, 0, 0, 0, 194, 202, 193, 203, 200, 205, 206, 207, 204, 211, 212, 0, 210, 218, 219, 217, 0, 0, 0, 175, 0, 0, 0, 184, 0, 0, 0 }; void convert(char *fname) { struct stat statbuf; struct utimbuf tb; FILE* f_in; FILE* f_tmp; char *tmpname; int c, r, fd; if (stat(fname, &statbuf) < 0) { perror("stat"); fprintf(stderr, "problem with file '%s'\n", fname); return; } if (! (f_in = fopen(fname, "r"))) { perror("fopen"); fprintf(stderr, "problem with file '%s'\n", fname); return; } tmpname = malloc(strlen(fname) + 15); if (tmpname) { int fd; strcpy(tmpname, fname); strcat(tmpname, "m2uXXXXXX"); fd = mkstemp(tmpname); if (fd < 0) { free(tmpname); tmpname = NULL; } else { if (! (f_tmp = fdopen(fd, "wb"))) { perror("fdopen"); free(tmpname); tmpname = NULL; } } } if (! tmpname) { fprintf(stderr, "Error: unable to generate temporary file\n"); fclose(f_in); return; } printf("Converting %s...\n", fname); while (1) { c = fgetc(f_in); if (feof(f_in)) break; if (ferror(f_in)) { fprintf(stderr, "Read error\n"); goto error; } if ((translate) && (c >= 32)) { c = mac2latin1[c]; if (c == 0) c = 32; } if (c == 13) c = 10; fputc(c, f_tmp); if (ferror(f_tmp)) { fprintf(stderr, "Write error\n"); goto error; } } fclose(f_in); fclose(f_tmp); if (rename(tmpname, fname) < 0) { perror("rename"); fprintf(stderr, "problem with file '%s'\n", fname); goto error2; } free(tmpname); if (chown(fname, statbuf.st_uid, statbuf.st_gid) < 0) { perror("chown"); fprintf(stderr, "problem with file '%s'\n", fname); return; } if (chmod(fname, statbuf.st_mode) < 0) { perror("chmod"); fprintf(stderr, "problem with file '%s'\n", fname); return; } tb.actime = statbuf.st_atime; tb.modtime = statbuf.st_mtime; if (utime(fname, &tb) < 0) { perror("utime"); fprintf(stderr, "problem with file '%s'\n", fname); } return; error: fclose(f_in); fclose(f_tmp); error2: remove(tmpname); free(tmpname); } int getopts(int argc, char **argv) { int c; opterr = 0; while ((c = getopt(argc, argv, "t")) != -1) { switch(c) { case 't': translate = TRUE; break; case '?': if (isprint(optopt)) fprintf(stderr, "Unknown option '-%c'.\n", optopt); else fprintf(stderr, "Unknown option character '\\x%x'.\n", optopt); return 0; default: abort(); } } return 1; } void usage(void) { fprintf(stderr, "usage: m2u [-t] file ...\n"); exit(1); } int main(int argc, char **argv) { int i; if (! getopts(argc, argv)) exit(1); if (argc == 1) usage(); for (i = optind; i < argc ; i++) convert(argv[i]); printf("\nConversion finished.\n\n"); exit(0); } . 0