1 /*- 2 * Copyright (c) 1992, 1993 3 * The Regents of the University of California. All rights reserved. 4 * 5 * This code is derived from software contributed to Berkeley by 6 * Rodney Ruddock of the University of Guelph. 7 * 8 * %sccs.include.redist.c% 9 */ 10 11 #ifndef lint 12 static char sccsid[] = "@(#)r.c 8.1 (Berkeley) 05/31/93"; 13 #endif /* not lint */ 14 15 #include <sys/types.h> 16 #include <sys/stat.h> 17 18 #include <limits.h> 19 #include <a.out.h> 20 #include <errno.h> 21 #include <regex.h> 22 #include <setjmp.h> 23 #include <stdio.h> 24 #include <stdlib.h> 25 #include <string.h> 26 27 #ifdef DBI 28 #include <db.h> 29 #endif 30 31 #include "ed.h" 32 #include "extern.h" 33 34 /* 35 * This sets up things for the central input routine to place the 36 * incoming text at the proper place in the buffer. 37 */ 38 void 39 r(inputt, errnum) 40 FILE *inputt; 41 int *errnum; 42 { 43 FILE *l_fp; 44 long l_num; 45 int l_bang_flag=0; 46 char *l_filename_read=NULL, *l_temp=NULL; 47 48 if (filename_flag == 1) { 49 sigspecial++; 50 l_filename_read = filename_current; 51 l_temp = filename_current; 52 sigspecial--; 53 if (sigint_flag && (!sigspecial)) 54 SIGINT_ACTION; 55 } else { 56 if (End_default) { 57 End = bottom; 58 End_default = 0; 59 } 60 l_temp = filename(inputt, errnum); 61 if (*errnum == 1) 62 l_filename_read = l_temp; 63 else 64 if (*errnum == -2) { 65 while (((ss = getc(inputt)) != '\n') || 66 (ss == EOF)); 67 l_filename_read = filename_current; 68 } else 69 if (*errnum < 0) { 70 filename_flag = 0; 71 return; 72 } 73 *errnum = 0; 74 } 75 76 if (filename_current == NULL) { 77 if (l_filename_read == NULL) { 78 strcpy(help_msg, "no filename given"); 79 *errnum = -1; 80 filename_flag = 0; 81 if (ss) 82 ungetc('\n', inputt); 83 return; 84 } else 85 filename_current = l_filename_read; 86 } 87 88 /* 89 * Determine if the file can be read. If not set the help message to 90 * something descriptive that the user should understand. 91 * We're now allowing ed to read directory and executable files 92 * for as much as it can, if the last character in the file 93 * isn't a '\n' then one will be added and a warning given - the 94 * user (for now) has to figure out how to remove it if they want. 95 * Ed accepts the NUL character now. 96 */ 97 if (l_temp && l_temp[FILENAME_LEN+1]) { /* bang flag */ 98 FILE *popen(); 99 100 if (l_temp[0] == '\0') { 101 strcpy(help_msg, "no command given"); 102 *errnum = -1; 103 return; 104 } 105 if ((l_fp = popen(l_temp, "r")) == NULL) { 106 strcpy(help_msg, "error executing command"); 107 *errnum = -1; 108 filename_flag = 0; 109 if (l_fp != NULL) 110 pclose(l_fp); 111 return; 112 } 113 if (filename_flag == 1) 114 filename_current = NULL; 115 l_bang_flag = 1; 116 } 117 else if ((l_fp = fopen(l_filename_read, "r")) == NULL) { 118 strcpy(help_msg, "permission lacking to read file"); 119 printf("?%s\n", l_filename_read); 120 filename_flag = 0; 121 *errnum = 0; 122 return; 123 } 124 filename_flag = 0; 125 if (!l_bang_flag) 126 fseek(l_fp, (off_t)0, 0); 127 if (g_flag == 0) 128 u_clr_stk(); 129 l_num = input_lines(l_fp, errnum); 130 if (*errnum < 0) 131 return; 132 *errnum = 0; 133 134 if (explain_flag > 0) 135 printf("%ld\n", l_num); 136 if (l_filename_read != filename_current) 137 free(l_filename_read); 138 139 if (l_bang_flag) 140 pclose(l_fp); 141 else 142 fclose(l_fp); 143 /*change_flag = 1; done in input_lines() already */ 144 if (sigint_flag) 145 SIGINT_ACTION; 146 *errnum = 1; 147 } 148