diff -cr ram:diff-2.0/cmp.c dh1:diff-2.0/cmp.c *** ram:diff-2.0/cmp.c Tue Jan 26 21:48:22 1993 --- dh1:diff-2.0/cmp.c Fri Jan 08 20:07:40 1993 *************** *** 28,33 **** --- 28,36 ---- int cmp (); void printc (); void error (); + #ifdef AMIGA + void fake_stat_result (); + #endif /* AMIGA */ /* Name under which this program was invoked. */ char *program_name; *************** *** 166,175 **** --- 169,191 ---- usage ("at least one filename should be specified"); } + #ifndef AMIGA if (fstat (file1_desc, &stat_buf1) < 0) error (2, errno, "%s", file1); if (fstat (file2_desc, &stat_buf2) < 0) error (2, errno, "%s", file2); + #else /* AMIGA */ + if (file1_desc != 0) + if (fstat (file1_desc, &stat_buf1) < 0) + error (2, errno, "%s", file1); + else + fake_stat_result (&stat_buf1); + if (file2_desc != 0) + if (fstat (file2_desc, &stat_buf2) < 0) + error (2, errno, "%s", file2); + else + fake_stat_result (&stat_buf2); + #endif /* AMIGA */ /* If both the input descriptors are associated with plain files, we can make the job simpler in some cases. */ *************** *** 185,190 **** --- 201,207 ---- /* If output is redirected to "/dev/null", we may assume `-s'. */ + #ifndef AMIGA if (comparison_type != type_status) { struct stat sb; *************** *** 200,205 **** --- 217,223 ---- comparison_type = type_status; } } + #endif /* AMIGA */ /* If only a return code is needed, conclude that the files differ if they have different sizes. */ *************** *** 510,512 **** --- 528,548 ---- while (--width > 0) putc (' ', fs); } + + #ifdef AMIGA + void fake_stat_result (sbuf) + struct stat *sbuf; + { + time_t cur_time; + + time (&cur_time); + sbuf->st_dev = 0; + sbuf->st_ino = 0; + sbuf->st_mode = S_IREAD; + sbuf->st_nlink = 1; + sbuf->st_uid = 0; + sbuf->st_gid = 0; + sbuf->st_size = 0; + sbuf->st_ctime = sbuf->st_atime = sbuf->st_mtime = cur_time; + } + #endif /* AMIGA */ diff -cr ram:diff-2.0/diff.c dh1:diff-2.0/diff.c *** ram:diff-2.0/diff.c Tue Jan 26 21:48:23 1993 --- dh1:diff-2.0/diff.c Tue Jan 26 21:41:45 1993 *************** *** 39,44 **** --- 39,47 ---- void add_regexp(); void specify_style (); void usage (); + #ifdef AMIGA + int fake_stat_result (); + #endif /* AMIGA */ /* Nonzero for -r: if comparing two directories, compare their common subdirectories recursively. */ *************** *** 635,642 **** --- 638,674 ---- if (name1 == 0) name1 = name0; + #ifndef AMIGA inf[0].name = dir0 == 0 ? name0 : concat (dir0, "/", name0); inf[1].name = dir1 == 0 ? name1 : concat (dir1, "/", name1); + #else /* AMIGA */ + { + int len = strlen (dir0); + if (dir0 == 0 || len == 0) + inf[0].name = name0; + else if (dir0[len-1] == ':') + { + inf[0].name = xmalloc (len + strlen (name0) + 1); + strcpy (inf[0].name, dir0); + strcat (inf[0].name, name0); + } + else + inf[0].name = concat (dir0, "/", name0); + } + { + int len = strlen (dir1); + if (dir1 == 0 || len == 0) + inf[1].name = name1; + else if (dir1[len-1] == ':') + { + inf[1].name = xmalloc (len + strlen (name1) + 1); + strcpy (inf[1].name, dir1); + strcat (inf[1].name, name1); + } + else + inf[1].name = concat (dir1, "/", name1); + } + #endif /* AMIGA */ /* Stat the files. Record whether they are directories. */ *************** *** 653,659 **** --- 685,695 ---- { inf[i].desc = 0; inf[i].name = "Standard Input"; + #ifndef AMIGA stat_result = fstat (0, &inf[i].stat); + #else /* AMIGA */ + stat_result = fake_stat_result (&inf[i].stat); + #endif /* AMIGA */ } else stat_result = stat (inf[i].name, &inf[i].stat); *************** *** 678,688 **** --- 714,742 ---- /* If one is a directory, and it was specified in the command line, use the file in that dir with the other file's basename. */ + #ifndef AMIGA int fnm_arg = inf[0].dir_p; int dir_arg = 1 - fnm_arg; char *p = rindex (inf[fnm_arg].name, '/'); char *filename = inf[dir_arg].name = concat (inf[dir_arg].name, "/", (p ? p+1 : inf[fnm_arg].name)); + #else /* AMIGA */ + int fnm_arg, dir_arg; + char *p1, *p2, *p; + char *filename; + + fnm_arg = inf[0].dir_p; + dir_arg = 1 - fnm_arg; + p1 = rindex (inf[fnm_arg].name, '/'); + p2 = rindex (inf[fnm_arg].name, ':'); + p = max (p1, p2); + if (*(inf[dir_arg].name + strlen (inf[dir_arg].name) - 1) == ':') + filename = inf[dir_arg].name + = concat (inf[dir_arg].name, "", (p ? p+1 : inf[fnm_arg].name)); + else + filename = inf[dir_arg].name + = concat (inf[dir_arg].name, "/", (p ? p+1 : inf[fnm_arg].name)); + #endif /* !AMIGA */ if (inf[fnm_arg].desc == 0) fatal ("can't compare - to a directory"); *************** *** 835,837 **** --- 889,910 ---- return val; } + + #ifdef AMIGA + int fake_stat_result (sbuf) + struct stat *sbuf; + { + time_t cur_time; + + time (&cur_time); + sbuf->st_dev = 0; + sbuf->st_ino = 0; + sbuf->st_mode = S_IREAD; + sbuf->st_nlink = 1; + sbuf->st_uid = 0; + sbuf->st_gid = 0; + sbuf->st_size = 0; + sbuf->st_ctime = sbuf->st_atime = sbuf->st_mtime = cur_time; + return 0; + } + #endif /* AMIGA */ diff -cr ram:diff-2.0/diff3.c dh1:diff-2.0/diff3.c *** ram:diff-2.0/diff3.c Tue Jan 26 21:48:24 1993 --- dh1:diff-2.0/diff3.c Fri Jan 08 18:17:24 1993 *************** *** 28,33 **** --- 28,43 ---- #include "getopt.h" #include "system.h" + #ifdef AMIGA + #include + #include + #include + #include + #include + + extern struct DosLibrary *DOSBase; + #endif /* AMIGA */ + /* * Internal data structures and macros for the diff3 program; includes * data structures for both diff3 diffs and normal diffs. *************** *** 231,236 **** --- 241,252 ---- char *commonname; struct stat statb; + #ifdef AMIGA + if (DOSBase->dl_lib.lib_Version < 37) { + fputs ("Need Amiga OS 2.0 (V.37) to execute.\n", stderr); + exit (20); + } + #endif incompat = 0; tag_strings[0] = tag_strings[1] = 0; *************** *** 1155,1160 **** --- 1171,1178 ---- char *filea, *fileb; char **output_placement; { + #ifndef AMIGA + char *argv[6]; char **ap; int fds[2]; *************** *** 1198,1203 **** --- 1216,1291 ---- perror_with_exit ("fork failed"); close (fds[1]); /* Prevent erroneous lack of EOF */ + + #else /* AMIGA */ + + static char diff_command_line[200]; + int fds[2]; + char *diff_result; + int current_chunk_size; + int bytes; + int total; + void (*oldsigint)(); + static long num_invocations = 0; + char pipe_name[20]; + struct Task *Task; + struct TagItem STags[5]; + BPTR StdOutDiff; + + /* The user should not be able to break the program while the child + process is being executed, otherwise the child process will still + be writing to the pipe-device until it deadlocks because there is + no reader on the other side of the pipe. So prohibit breaking the + program until the pipe is closed. */ + oldsigint = signal (SIGINT, SIG_IGN); + + /* Construct command line. Enclose filenames in double quotes in + case the user specifies files with spaces in their names. */ + strcpy (diff_command_line, diff_program); + if (always_text) + strcat (diff_command_line, " -a"); + strcat (diff_command_line, " --"); + strcat (diff_command_line, " \""); + strcat (diff_command_line, filea); + strcat (diff_command_line, "\" \""); + strcat (diff_command_line, fileb); + strcat (diff_command_line, "\""); + + /* Construct filename for the pipe to be used */ + Task = FindTask (NULL); + num_invocations++; + sprintf (pipe_name, "PIPE:%08lX_%ld", Task, num_invocations); + + /* Open pipe for child process */ + StdOutDiff = Open (pipe_name, MODE_NEWFILE); + if (!StdOutDiff) + perror_with_exit ("pipe failed"); + + /* Child process runs asynchronously with pipe as stdout */ + STags[0].ti_Tag = SYS_Input; + STags[0].ti_Data = NULL; + STags[1].ti_Tag = SYS_Output; + STags[1].ti_Data = StdOutDiff; + STags[2].ti_Tag = SYS_Asynch; + STags[2].ti_Data = TRUE; + STags[3].ti_Tag = SYS_UserShell; + STags[3].ti_Data = TRUE; + STags[4].ti_Tag = TAG_DONE; + /* Start child process */ + if ((System (diff_command_line, STags)) == -1) { + Close (StdOutDiff); + perror_with_exit ("diff: not found"); + } + + /* Open pipe for this side of the communication */ + fds[0] = open (pipe_name, O_RDONLY); + if (fds[0] < 0) { + Close (StdOutDiff); + perror_with_exit ("pipe failed"); + } + + #endif /* !AMIGA */ + current_chunk_size = DIFF_CHUNK_SIZE; diff_result = (char *) xmalloc (current_chunk_size); total = 0; *************** *** 1215,1220 **** --- 1303,1309 ---- *output_placement = diff_result; + #ifndef AMIGA do if ((w = wait (&wstatus)) == -1) perror_with_exit ("wait failed"); *************** *** 1222,1227 **** --- 1311,1322 ---- if (! (WIFEXITED (wstatus) && WEXITSTATUS (wstatus) < 2)) fatal ("subsidiary diff failed"); + #else /* AMIGA */ + /* Close pipe */ + close (fds[0]); + /* Re-install break-handler */ + signal (SIGINT, oldsigint); + #endif /* !AMIGA */ return diff_result + total; } diff -cr ram:diff-2.0/regex.c dh1:diff-2.0/regex.c *** ram:diff-2.0/regex.c Tue Jan 26 21:48:26 1993 --- dh1:diff-2.0/regex.c Thu Nov 12 10:28:08 1992 *************** *** 47,55 **** --- 47,57 ---- `BSTRING', as far as I know, and neither of them use this code. */ #if USG || STDC_HEADERS #include + #ifndef AMIGA #define bcmp(s1, s2, n) memcmp ((s1), (s2), (n)) #define bcopy(s, d, n) memcpy ((d), (s), (n)) #define bzero(s, n) memset ((s), 0, (n)) + #endif /* !AMIGA */ #else #include #endif diff -cr ram:diff-2.0/sdiff.c dh1:diff-2.0/sdiff.c *** ram:diff-2.0/sdiff.c Tue Jan 26 21:48:28 1993 --- dh1:diff-2.0/sdiff.c Fri Jan 08 18:20:14 1993 *************** *** 25,30 **** --- 25,39 ---- #include #include "getopt.h" + #ifdef AMIGA + #include + #include + #include + #include + + extern struct DosLibrary *DOSBase; + #endif /* AMIGA */ + #ifndef SEEK_SET #define SEEK_SET 0 #endif *************** *** 49,69 **** --- 58,93 ---- static char *tmpname; static int volatile tmpmade; + #ifndef AMIGA static pid_t volatile diffpid; + #endif /* !AMIGA */ struct line_filter; static void diffarg (); /* (char *); */ static void execdiff (); /* (int, char const *, char const *, char const *); */ + #ifdef AMIGA + char *xmalloc (); + static void amiga_exit (); + static int amiga_break (); + static void construct_pipe_name (); + static void construct_command_line (); + static char command_line[512]; + static FILE *diff_file = NULL; + static int user_quit = 0; + #endif /* AMIGA */ static int edit (); /* (struct line_filter *left, int lenl, struct line_filter *right, int lenr, FILE *outfile); */ static int interact (); /* (struct line_filter *diff, struct line_filter *left, struct line_filter *right, FILE *outfile); */ + #ifndef AMIGA static void trapsigs (); /* (void); */ /* this lossage until the gnu libc conquers the universe */ #define TMPNAMSIZE 1024 #define PVT_tmpdir "/tmp" static char *private_tempnam (); /* (const char *, const char *, int, int *); */ + #endif /* !AMIGA */ + static int diraccess (); /* Options: */ *************** *** 108,120 **** --- 132,185 ---- exit (2); } + #ifdef AMIGA + static void + amiga_exit () + { + char *buf; + size_t a; + + if (tmpmade) + { + remove (tmpname); + tmpmade = 0; + } + if (diff_file) + { + /* Provide empty pipe! */ + buf = xmalloc (SDIFF_BUFSIZE); + do + a = fread (buf, sizeof (char), SDIFF_BUFSIZE, diff_file); + while (a == SDIFF_BUFSIZE); + fclose (diff_file); + diff_file = NULL; + free (buf); + } + } + + static int + amiga_break () + { + amiga_exit (); + return 20; + } + #endif /* AMIGA */ + static void cleanup () { + #ifndef AMIGA if (0 < diffpid) kill (diffpid, SIGPIPE); if (tmpmade) unlink (tmpname); + #else /* AMIGA */ + if (tmpmade) + { + remove (tmpname); + tmpmade = 0; + } + #endif /* !AMIGA */ } static void *************** *** 215,220 **** --- 280,286 ---- perror_fatal ("output error"); } + #ifndef AMIGA #ifndef HAVE_WAITPID /* Emulate waitpid well enough for sdiff, which has at most two children. */ static pid_t *************** *** 244,249 **** --- 310,316 ---- return pid; } #endif + #endif /* !AMIGA */ static char const * expand_name (name, isdir, other_name) *************** *** 258,263 **** --- 325,331 ---- else { /* Yield NAME/BASE, where BASE is OTHER_NAME's basename. */ + #ifndef AMIGA const char *p = rindex (other_name, '/'), *base = p ? p+1 : other_name; *************** *** 267,272 **** --- 335,366 ---- r[namelen] = '/'; bcopy (base, r + namelen + 1, baselen + 1); return r; + #else /* AMIGA */ + const char *p1, *p2, *base; + size_t namelen, baselen; + char *r; + + p1 = rindex (other_name, '/'); + p2 = rindex (other_name, ':'); + if (p1 == NULL && p2 == NULL) + base = other_name; + else + base = max (p1 + 1 , p2 + 1); + namelen = strlen (name); + baselen = strlen (base); + r = xmalloc (namelen + baselen + 2); + bcopy (name, r, namelen); + if (name[namelen-1] != ':') + { + r[namelen] = '/'; + bcopy (base, r + namelen + 1, baselen + 1); + } + else + { + bcopy (base, r + namelen, baselen + 1); + } + return r; + #endif /* AMIGA */ } } *************** *** 394,399 **** --- 488,505 ---- char *editor = getenv ("EDITOR"); char *differ = getenv ("DIFF"); + #ifdef AMIGA + if (DOSBase->dl_lib.lib_Version < 37) { + fputs ("Need Amiga OS 2.0 (V.37) to execute.\n", stderr); + exit (20); + } + /* Install break and exit traps */ + if (atexit (&amiga_exit)) + fatal ("couldn't set exit trap"); + if (onbreak (&amiga_break)) + fatal ("couldn't set break trap"); + #endif /* AMIGA */ + prog = argv[0]; if (editor) edbin = editor; *************** *** 481,493 **** --- 587,605 ---- if (! out_file) /* easy case: diff does everything for us */ + #ifndef AMIGA execdiff (suppress_common_flag, "-y", argv[optind], argv[optind + 1]); + #else /* AMIGA */ + execdiff (suppress_common_flag, "-y", argv[optind], argv[optind + 1], FALSE, NULL); + #endif /* !AMIGA */ else { FILE *left, *right, *out, *diffout; int diff_fds[2]; int interact_ok; + #ifndef AMIGA pid_t pid; + #endif struct line_filter lfilt; struct line_filter rfilt; struct line_filter diff_filt; *************** *** 502,507 **** --- 614,621 ---- right = ck_fopen (expand_name (argv[optind + 1], rightdir, argv[optind]), "r"); out = ck_fopen (out_file, "w"); + #ifndef AMIGA + if (pipe (diff_fds)) perror_fatal ("pipe"); *************** *** 530,535 **** --- 644,674 ---- close (diff_fds[1]); diffout = ck_fdopen (diff_fds[0], "r"); + #else /* AMIGA */ + + { + BPTR StdOutDiff; + char pipe_name[20]; + + construct_pipe_name (pipe_name); + + StdOutDiff = Open (pipe_name, MODE_NEWFILE); + if (!StdOutDiff) + perror_fatal ("pipe"); + + diff_fds[0] = open (pipe_name, O_RDONLY); + if (diff_fds[0] == -1) + perror_fatal ("pipe"); + + execdiff (0, "--sdiff-merge-assist", argv[optind], argv[optind + 1], TRUE, StdOutDiff); + + } + + diffout = ck_fdopen (diff_fds[0], "r"); + diff_file = diffout; + + #endif /* !AMIGA */ + lf_init (&diff_filt, diffout); lf_init (&lfilt, left); lf_init (&rfilt, right); *************** *** 536,547 **** --- 675,694 ---- interact_ok = interact (&diff_filt, &lfilt, &rfilt, out); + #ifndef AMIGA ck_fclose (diffout); + #else /* AMIGA */ + /* If the user signaled quit, let the exit code clean up the + pipe and close the file */ + if (!user_quit) + ck_fclose (diffout); + #endif /* !AMIGA */ ck_fclose (left); ck_fclose (right); ck_fclose (out); { + #ifndef AMIGA int wstatus; if (waitpid (pid, &wstatus, 0) < 0) *************** *** 561,566 **** --- 708,727 ---- fatal ("Subsidiary diff failed"); exit (WEXITSTATUS (wstatus)); + #else /* AMIGA */ + if (tmpmade) + { + remove (tmpname); + tmpmade = 0; + } + + if (! interact_ok) + exit (2); + + diff_file = NULL; + + exit (0); + #endif /* !AMIGA */ } } return 0; /* Fool -Wall . . . */ *************** *** 589,594 **** --- 750,757 ---- diffargv[diffargs++] = a; } + #ifndef AMIGA + static void execdiff (differences_only, option, file1, file2) int differences_only; *************** *** 608,616 **** --- 771,855 ---- _exit (2); } + #else /* AMIGA */ + + static void + execdiff (differences_only, option, file1, file2, asynch, handle) + int differences_only; + char *option, *file1, *file2; + long asynch; + BPTR handle; + { + struct TagItem STags[5]; + + if (differences_only) + diffarg ("--suppress-common-lines"); + diffarg (option); + diffarg ("--"); + diffarg (file1); + diffarg (file2); + diffarg (0); + + construct_command_line (diffbin, diffargv, command_line); + if (asynch) + { + STags[0].ti_Tag = SYS_Input; + STags[0].ti_Data = NULL; + STags[1].ti_Tag = SYS_Output; + STags[1].ti_Data = handle; + STags[2].ti_Tag = SYS_Asynch; + STags[2].ti_Data = TRUE; + STags[3].ti_Tag = SYS_UserShell; + STags[3].ti_Data = TRUE; + STags[4].ti_Tag = TAG_DONE; + if (System (command_line, STags) == -1) + perror_fatal ("diff not found"); + } + else + { + STags[0].ti_Tag = SYS_Asynch; + STags[0].ti_Data = FALSE; + STags[1].ti_Tag = SYS_UserShell; + STags[1].ti_Data = TRUE; + STags[2].ti_Tag = TAG_DONE; + if (System (command_line, STags) == -1) + perror_fatal ("diff not found"); + exit (0); + } + } + + static void + construct_command_line (binname, argvec, com_line) + char *binname, **argvec, *com_line; + { + int i; + strcpy (com_line, binname); + for (i = 1; argvec[i]; i++) + { + /* Enclose arguments in quotes */ + strcat (com_line, " \""); + strcat (com_line, argvec[i]); + strcat (com_line, "\""); + } + } + + static void + construct_pipe_name (pipe_name) + char *pipe_name; + { + static long invocations = 0; + struct Task *Task; + + Task = FindTask (NULL); + sprintf (pipe_name, "PIPE:%08lX_%ld", Task, invocations); + } + + #endif /* !AMIGA */ + + #ifndef AMIGA /* Signal handling */ static int volatile ignore_signals; *************** *** 655,660 **** --- 894,900 ---- if (signal (*p, SIG_IGN) != SIG_IGN && signal (*p, catchsig) != SIG_IGN) fatal ("signal error"); } + #endif /* !AMIGA */ *************** *** 781,787 **** --- 1021,1031 ---- suppress_common_flag = 0; break; case 'q': + #ifdef AMIGA + user_quit = 1; + #endif return 0; + #ifndef AMIGA case 'e': if (! tmpname && ! (tmpname = private_tempnam (0, "sdiff", 1, 0))) perror_fatal ("temporary file name"); *************** *** 850,855 **** --- 1094,1153 ---- } return 1; } + #else /* AMIGA */ + case 'e': + if (! tmpname && ! (tmpname = tmpnam (NULL))) + perror_fatal ("temporary file name"); + + tmpmade = 1; + + { + FILE *tmp; + + tmp = ck_fopen (tmpname, "w"); + + if (cmd1 == 'l' || cmd1 == 'b') + lf_copy (left, lenl, tmp); + else + lf_skip (left, lenl); + + if (cmd1 == 'r' || cmd1 == 'b') + lf_copy (right, lenr, tmp); + else + lf_skip (right, lenr); + + ck_fclose (tmp); + + { + struct TagItem STags[3]; + + sprintf (command_line, "%s \"%s\"", edbin, tmpname); + STags[0].ti_Tag = SYS_Asynch; + STags[0].ti_Data = FALSE; + STags[1].ti_Tag = SYS_UserShell; + STags[1].ti_Data = TRUE; + STags[2].ti_Tag = TAG_DONE; + if (System (command_line, STags) == -1) + perror_fatal ("Subsidiary editor failed"); + } + + + { + static char *buf; + size_t size; + + tmp = ck_fopen (tmpname, "r"); + + buf = xmalloc (SDIFF_BUFSIZE * sizeof (char)); + while ((size = ck_fread (buf, SDIFF_BUFSIZE, tmp)) != 0) + ck_fwrite (buf, size, outfile); + free (buf); + + ck_fclose (tmp); + } + return 1; + } + #endif /* !AMIGA */ default: give_help (); break; *************** *** 933,938 **** --- 1231,1238 ---- return stat (file, &buf) == 0; } + #ifndef AMIGA + /* These are the characters used in temporary filenames. */ static const char letters[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; *************** *** 1039,1041 **** --- 1339,1343 ---- *lenptr = len; return buf; } + + #endif /* AMIGA */ diff -cr ram:diff-2.0/system.h dh1:diff-2.0/system.h *** ram:diff-2.0/system.h Tue Jan 26 21:48:28 1993 --- dh1:diff-2.0/system.h Thu Nov 12 10:03:18 1992 *************** *** 76,82 **** --- 76,86 ---- #ifdef SYSNDIR #include #else /* !SYSNDIR */ + #ifdef AMIGA + #include + #else /* !AMIGA */ #include + #endif /* AMIGA */ #endif /* SYSNDIR */ #else /* !USG */ #include *************** *** 89,99 **** --- 93,105 ---- #if defined (USG) || defined (STDC_HEADERS) #include + #ifndef AMIGA #define index strchr #define rindex strrchr #define bcopy(s,d,n) memcpy (d,s,n) #define bcmp(s1,s2,n) memcmp (s1,s2,n) #define bzero(s,n) memset (s,0,n) + #endif /* !AMIGA */ #else #include #endif diff -cr ram:diff-2.0/util.c dh1:diff-2.0/util.c *** ram:diff-2.0/util.c Tue Jan 26 21:48:29 1993 --- dh1:diff-2.0/util.c Thu Nov 12 13:38:06 1992 *************** *** 154,159 **** --- 154,160 ---- strcat (name, current_name1); if (paginate_flag) + #ifndef AMIGA { int pipes[2]; int desc; *************** *** 187,192 **** --- 188,199 ---- outfile = fdopen (pipes[1], "w"); } } + #else /* AMIGA */ + { + fputs ("Paginating not implemented on the Amiga. Using stdout instead.\n", stderr); + outfile = stdout; + } + #endif else {