+}
+
+hackfile(name, files, ix, nerrors)
+ char *name;
+ Eptr **files;
+ int ix;
+{
+ boolean previewed;
+ int errordest; /* where errors go*/
+
+ previewed = preview(name, nerrors, files, ix);
+
+ errordest = settotouch(name);
+
+ if (errordest != TOSTDOUT)
+ touchedfiles[ix] = TRUE;
+
+ if (previewed && (errordest == TOSTDOUT))
+ return;
+
+ diverterrors(name, errordest, files, ix, previewed, nerrors);
+
+ if (errordest == TOTHEFILE){
+ /*
+ * overwrite the original file
+ */
+ writetouched(1);
+ }
+}
+
+boolean preview(name, nerrors, files, ix)
+ char *name;
+ int nerrors;
+ Eptr **files;
+ int ix;
+{
+ int back;
+ reg Eptr *erpp;
+
+ if (!oktotouch(name))
+ return(false);
+ if (nerrors <= 0)
+ return(false);
+ back = false;
+ if(query){
+ switch(inquire(terse
+ ? "Preview? "
+ : "Do you want to preview the errors first? ")){
+ case Q_YES:
+ case Q_yes:
+ back = true;
+ EITERATE(erpp, files, ix){
+ errorprint(stdout, *erpp, TRUE);
+ }
+ if (!terse)
+ fprintf(stdout, "\n");
+ default:
+ break;
+ }
+ }
+ return(back);
+}
+
+int settotouch(name)
+ char *name;
+{
+ int dest = TOSTDOUT;
+
+ if (query){
+ switch(touchstatus = inquire(terse
+ ? "Touch? "
+ : "Do you want to touch file \"%s\"? ",
+ name)){
+ case Q_NO:
+ case Q_no:
+ return(dest);
+ default:
+ break;
+ }
+ }
+
+ switch(probethisfile(name)){
+ case F_NOTREAD:
+ dest = TOSTDOUT;
+ fprintf(stdout, terse
+ ? "\"%s\" unreadable\n"
+ : "File \"%s\" is unreadable\n",
+ name);
+ break;
+ case F_NOTWRITE:
+ dest = TOSTDOUT;
+ fprintf(stdout, terse
+ ? "\"%s\" unwritable\n"
+ : "File \"%s\" is unwritable\n",
+ name);
+ break;
+ case F_NOTEXIST:
+ dest = TOSTDOUT;
+ fprintf(stdout, terse
+ ? "\"%s\" not found\n"
+ : "Can't find file \"%s\" to insert error messages into.\n",
+ name);
+ break;
+ default:
+ dest = edit(name) ? TOSTDOUT : TOTHEFILE;
+ break;
+ }
+ return(dest);
+}