void cmd_resequence (char *cp) { Line *line; count = 0; /* If no range given, resequence the whole current buffer */ if (*cp == 0) { for (line = buffer_first_line (cur_position.buffer); line != NULL; line = line_next (line)) { line_reseq (line); count ++; } } /* Otherwise, process the requested lines */ else if (range_multiple (cp, &cp, resequence_range, NULL) >= 0) eoltest (cp); /* Either way, print out summary */ if (count == 0) outerr (0, "no lines resequenced\n"); else outerr (12, "%u line%s resequenced\n", count, (count == 1) ? "" : "s"); }
void init () { char *buf; buf = (char *) MemAlloc (2048); if (! CapInit (buf)) { outerr("cannot read termcap\n",0); exit (1); } if (! v.VInit ()) { outerr("cannot initialize terminal\n",0); exit (1); } if (COLS < 80) { outerr("must be 80 columns on terminal\n",0); exit (1); } KeyInit (keymap, VFlush); v.VOpen(); MemFree ((mem *) buf); /* H is the number of lines at file window */ H = LINES/2-1; }
/* com */ void syscmd (char *s) { register status, sig; if (metas (s)) { if (usecshell) runl(0, cshabsname, cshname, "-f", "-c", s, NULL); else runl(0, shabsname, shname, "-c", s, NULL); return; } status = doexec (s); sig = status & 0177; if (! sig) return; if (sig == 0177) outerr("ptrace: ",0); else if (sig < numsysmsg && sysmsg [sig]) outerr(sysmsg [sig],0); else outerr("Signal %d", sig); if (status & 0200) outerr(" - core dumped\n",0); else outerr("\n",0); }
void cmd_include (char *cp) { char *input_name; FILE *input_file; Line *line; String *string; if (*cp == 0) /* make sure there's a filename there */ { outerr (0, "no filename specified\n"); return; } input_name = cp; /* get input filename */ cp = uptospace (cp); /* it goes up to next space or eol */ if (range_single (cp, &cp, &cur_position) < 0) return; /* decode the range to get what line to insert before */ if (!eoltest (cp)) return; /* Open the file */ input_file = fopen (input_name, "r"); if (input_file == NULL) { outerr (strlen (input_name) + strlen (strerror (errno)), "error opening %s: %s\n", input_name, strerror (errno)); return; } /* Read it into the current buffer just before the current line */ buffer_dirty (cur_position.buffer, 1); /* it will soon be dirty */ cur_position.offset = 0; /* insert before beginning of current line */ read_file (input_file, cur_position.buffer, cur_position.line); /* read file in */ }
void jnl_close (int del) { if (journal_file != NULL) { if (fclose (journal_file) < 0) outerr (strlen (strerror (errno)), "error closing journal file: %s\n", strerror (errno)); journal_file = NULL; } if (del && (journal_name != NULL) && (journal_name[0] != 0) && (unlink (journal_name) < 0)) { outerr (strlen (journal_name) + strlen (strerror (errno)), "error deleting journal file %s: %s\n", journal_name, strerror (errno)); } }
void cmd_delete (char *cp) { first = 1; count = 0; if (range_multiple (cp, &cp, delete_range, &first) >= 0) eoltest (cp); if (count == 0) outerr (0, "no lines deleted\n"); else outerr (12, "%u line%s deleted\n", count, (count == 1) ? "" : "s"); if (cur_position.line != NULL) line_print (cur_position.line); else outfmt (strlen (buffer_name (cur_position.buffer)), "[EOB=%s]\n", buffer_name (cur_position.buffer)); }
static int write_range (void *dummy, Buffer *buffer, Line *line) { if (line != NULL) { /* Make sure the file is open */ if (out_file == NULL) { out_file = os_crenewfile (out_name); if (out_file == NULL) return (1); } /* Write line to the file */ if (fputs (string_getval (line_string (line)), out_file) < 0) { outerr (strlen (out_name) + strlen (strerror (errno)), "error writing file %s: %s\n", out_name, strerror (errno)); return (1); } /* Increment line counter */ linecount ++; } return (0); }
int Iterative_Server::run() { int retsock; if( (retsock=init())<=0) { outerr("server init error, exit"); exit(0); } fprintf(stdout, "the server run:\n"); SocketStream ss; for(;;) { acceptor(retsock,ss); if(waitfor_multievent()==-1) return -1; if(handleConnection()==-1) return -1; if(handleData(ss)==-1) return -1; } }
int main(int argc, const char *const *argv) { struct timeval *tv, tvbuf; adns_query qu; void *qun_v; adns_answer *answer; int r, maxfd; fd_set readfds, writefds, exceptfds; const char *arg; ensure_adns_init(); while ((arg= *++argv)) process_optarg(arg,&argv,0); if (!ov_pipe && !ads) usageerr("no domains given, and -f/--pipe not used; try --help"); for (;;) { for (;;) { qu= ov_asynch ? 0 : outstanding.head ? outstanding.head->qu : 0; r= adns_check(ads,&qu,&answer,&qun_v); if ((r == EAGAIN) || (r == EWOULDBLOCK)) break; if (r == ESRCH) { if (!ov_pipe) goto x_quit; else break; } assert(!r); query_done(qun_v,answer); } maxfd= 0; FD_ZERO(&readfds); FD_ZERO(&writefds); FD_ZERO(&exceptfds); if (ov_pipe) { maxfd= 1; FD_SET(0,&readfds); } tv= 0; adns_beforeselect(ads, &maxfd, &readfds,&writefds,&exceptfds, &tv,&tvbuf,0); ADNS_CLEAR_ERRNO; r= select(maxfd, &readfds,&writefds,&exceptfds, tv); ADNS_CAPTURE_ERRNO; if (r == -1) { if (errno == EINTR) continue; sysfail("select",errno); } adns_afterselect(ads, maxfd, &readfds,&writefds,&exceptfds, 0); if (ov_pipe && FD_ISSET(0,&readfds)) read_stdin(); } x_quit: if (fclose(stdout)) outerr(); quitnow(rcode); }
Socket::Socket() { if ((sockfd=socket(AF_INET,SOCK_STREAM,0))<0) { outerr("new socket error in server\n"); exit(-1); } }
String *jnl_readprompt (const char *prompt) { char *buff, header[16], *p; String *string; uLong strln; /* If recovery file open, read from it, otherwise read from terminal */ if (recover_file == NULL) goto readterminal; if (fgets (header, sizeof header, recover_file) == NULL) goto closerecovery; if (header[0] != '*') goto badrecovery; if (strcmp (header + 1, "EOF\n") == 0) { string = NULL; goto writejournal; } strln = strtoul (header + 1, &p, 10); if (*p != '\n') goto badrecovery; buff = malloc (strln + 1); if (fread (buff, strln, 1, recover_file) == 0) goto closerecovery; string = string_create (strln, buff); buff[strln] = 0; outfmt (strlen (prompt) + strlen (buff), "%s%s\n", prompt, buff); free (buff); goto writejournal; badrecovery: outerr (strlen (header), "bad recovery file format at %s\n", header); closerecovery: fclose (recover_file); recover_file = NULL; /* Read from terminal screen after flushing any output */ readterminal: output (); string = os_readprompt (prompt); /* Write journal record */ writejournal: if (journal_file != NULL) { if (string == NULL) fprintf (journal_file, "*EOF\n"); else { strln = string_getlen (string); fprintf (journal_file, "*%u\n", strln); fwrite (string_getval (string), strln, 1, journal_file); } } /* Return pointer to string (NULL for eof) */ return (string); }
void jnl_flush (void) { if (journal_file != NULL) { if (fflush (journal_file) < 0) { outerr (strlen (strerror (errno)), "error flushing journal file: %s\n", strerror (errno)); fclose (journal_file); journal_file = NULL; } } }
void cmd_write (char *cp) { int rc; Line *line; Position beg_write, end_write; out_file = NULL; linecount = 0; /* Get filename */ out_name = cp; cp = uptospace (cp); if (*cp != 0) { *(cp ++) = 0; cp = skipspaces (cp); } /* Get optional range. If not specified, use the whole current buffer. */ if (*cp != 0) { rc = range_multiple (cp, &cp, write_range, out_name); if (rc == 0) eoltest (cp); } else { for (line = buffer_first_line (cur_position.buffer); line != NULL; line = line_next (line)) { rc = write_range (out_name, cur_position.buffer, line); if (rc != 0) break; } } /* Close output file */ if (out_file == NULL) outerr (0, "no file created\n"); else { if (linecount == 0) outerr (strlen (out_name), "no lines written to %s\n", out_name); else outerr (12 + strlen (out_name), "%u line%s written to %s\n", linecount, (linecount == 1) ? "" : "s", out_name); if (fclose (out_file) < 0) outerr (strlen (out_name) + strlen (strerror (errno)), "error closing file %s: %s\n", out_name, strerror (errno)); out_file = NULL; } }
int jnl_readkeyseq (String *keystring) { char *buff, header[16], *p; int ok; uLong origlen, strln; origlen = string_getlen (keystring); /* If recovery file open, read from it, otherwise read from terminal */ if (recover_file == NULL) goto readterminal; ok = 1; if (fgets (header, sizeof header, recover_file) == NULL) goto closerecovery; if (header[0] != '*') goto badrecovery; if (strcmp (header + 1, "EOF\n") == 0) { ok = 0; goto writejournal; } strln = strtoul (header + 1, &p, 10); if (*p != '\n') goto badrecovery; buff = malloc (strln); if (fread (buff, strln, 1, recover_file) == 0) goto closerecovery; string_concat (keystring, strln, buff); free (buff); goto writejournal; badrecovery: outerr (strlen (header), "bad recovery file format at %s\n", header); closerecovery: fclose (recover_file); recover_file = NULL; /* Read from terminal screen after flushing any output */ readterminal: output (); ok = os_readkeyseq (keystring); /* Write journal record */ writejournal: if (journal_file != NULL) { if (!ok) fprintf (journal_file, "*EOF\n"); else { strln = string_getlen (keystring) - origlen; fprintf (journal_file, "*%u\n", strln); fwrite (string_getval (keystring) + origlen, strln, 1, journal_file); } } return (ok); }
SocketStream::SocketStream():Socket() { readbuf=0; sendbuf=0; readbuf =(char *) malloc( sizeof(char) * MAX); sendbuf =(char *) malloc( sizeof(char) * MAX); if(readbuf==0 || sendbuf==0) { outerr("malloc for buf error"); exit(0); } }
/** * symlinking new icon to actual.gif in .cache/weather/ */ void symlinking_image(char *image) { char *filename_new = SHARED_FOLDER; char *filename_old = 0; getCachePath(&filename_old, APP_NAME); strmcat(&filename_old, "actual.gif"); strmcat(&filename_new, "/%1.gif"); strmreplace(&filename_new, "%1", image); unlink(filename_old); if(symlink(filename_new, filename_old) == -1) outerr("Error symlinking"); freeChar(&filename_new); freeChar(&filename_old); }
int buildConnection(int port) { int sockfd; struct sockaddr_in server,client; if ((sockfd=socket(AF_INET,SOCK_STREAM,0))<0) { outerr("new socket error in server\n"); exit(-1); } bzero(&server,sizeof(server)); server.sin_family=AF_INET; server.sin_port=htons(port); server.sin_addr.s_addr=htonl(INADDR_ANY); bind(sockfd,(struct sockaddr*)&server,sizeof(server)); listen(sockfd,LISTENQUE); return sockfd; }
ostream& outerr(file_ptr const& f, string_iterator pos) { return outerr(f->path, f->position_of(pos).line); }
void cmd_exit (char *cp) { const char *bn, *fn, *ynanswer; Buffer *buffer; int prompt, saveflag, ynflag; String *ynstring; /* Check for -save qualifier - it inhibits deleting the journal file */ saveflag = 0; if ((strncasecmp (cp, "-save", 5) == 0) && (cp[5] <= ' ')) { if ((journal_name == NULL) || (journal_name[0] == 0)) { outerr (0, "there is no journal file to save\n"); return; } saveflag = 1; cp = skipspaces (cp + 5); } /* Maybe use a different name for main buffer */ if (*cp != 0) buffer_setfile (main_buffer, cp); /* Don't bother if recovery mode, we want them to be able to do more. They can re-type exit command */ if (recover_file != NULL) { outerr (0, "EXIT command ignored in recovery mode\n"); return; } /* Check for buffers that have filename of "" (opened -readonly) but were modified */ prompt = 0; for (buffer = NULL; (buffer = buffer_next (buffer)) != NULL;) { fn = buffer_filename (buffer); if (fn == NULL) continue; if (fn[0] != 0) continue; if (buffer_dirty (buffer, -1)) { bn = buffer_name (buffer); if (!prompt) outerr (0, "\n"); outerr (strlen (bn), "buffer %s was modified but has no output file\n", bn); prompt = 1; } } if (prompt) { do { ynstring = jnl_readprompt ("\r\n do you still want to exit (yes or no)? "); if (ynstring == NULL) return; ynflag = -1; ynanswer = string_getval (ynstring); if (strcasecmp (ynanswer, "no") == 0) ynflag = 0; if (strcasecmp (ynanswer, "yes") == 0) ynflag = 1; string_delete (ynstring); } while (ynflag < 0); if (!ynflag) return; } /* Write the entire contents of all the buffers that have files and that have been modified to their respective files */ for (buffer = NULL; (buffer = buffer_next (buffer)) != NULL;) { fn = buffer_filename (buffer); /* get output filename */ if (fn == NULL) continue; /* if none, don't try to write */ bn = buffer_name (buffer); /* ok, write it out */ if (!buffer_dirty (buffer, -1)) { outerr (strlen (fn) + strlen (bn), "not writing %s from =%s because it is unmodified\n", fn, bn); continue; } outerr (strlen (fn) + strlen (bn), "writing %s from =%s: ", fn, bn); if (!write_file (fn, buffer_first_line (buffer), buffer_last_line (buffer))) { outerr (strlen (fn), "output file %s not written, not exiting\n", fn); /* if error, don't exit */ return; } buffer_dirty (buffer, 0); } /* Write successful, maybe delete journal file and terminate process */ jnl_close (!saveflag); output (); exit (0); }
void cmd_set (char *cp) { Buffer *buffer; char c, *p; int i, v; /* Set autoshift count */ if (i = matchkeyword (cp, "autoshift", 1)) { if (cp[i] > ' ') goto usage; cp = skipspaces (cp + i); v = strtol (cp, &p, 10); if ((p == cp) || !eoltest (p)) goto usage; autoshift = v; return; } /* Set lfs to hide or show */ if (i = matchkeyword (cp, "lfs", 1)) { if (cp[i] > ' ') goto usage; cp = skipspaces (cp + i); if (i = matchkeyword (cp, "hide", 1)) showlfs = 0; else if (i = matchkeyword (cp, "show", 1)) showlfs = 1; else goto usage; if (!eoltest (cp + i)) goto usage; return; } /* Set numbers to hide or show */ if (i = matchkeyword (cp, "numbers", 1)) { if (cp[i] > ' ') goto usage; cp = skipspaces (cp + i); if (i = matchkeyword (cp, "auto", 1)) shownums = -1; else if (i = matchkeyword (cp, "hide", 1)) shownums = 0; else if (i = matchkeyword (cp, "show", 1)) shownums = 1; else goto usage; if (!eoltest (cp + i)) goto usage; return; } /* Set search to exact or generic */ if (i = matchkeyword (cp, "search", 1)) { if (cp[i] > ' ') goto usage; cp = skipspaces (cp + i); if (i = matchkeyword (cp, "exact", 1)) { xstrstr = strstr; xstrncmp = strncmp; } else if (i = matchkeyword (cp, "generic", 1)) { xstrstr = strcasestr; xstrncmp = strncasecmp; } else goto usage; if (!eoltest (cp + i)) goto usage; return; } /* Set buffer attributes (-output filename or -readonly) */ if (*cp == '=') { for (p = ++ cp; (c = *cp) != 0; cp ++) if (strchr (bufnamechars, c) == NULL) break; if (cp == p) goto usage; if (*cp > ' ') goto usage; buffer = buffer_create (cp - p, p); cp = skipspaces (cp); if ((cp[7] <= ' ') && (strncasecmp (cp, "-output", 7) == 0)) { cp = skipspaces (cp + 7); p = uptospace (cp); if (*p != 0) goto usage; buffer_setfile (buffer, cp); return; } if ((cp[9] <= ' ') && (strncasecmp (cp, "-readonly", 9) == 0)) { cp = skipspaces (cp + 9); if (*cp != 0) goto usage; buffer_setfile (buffer, NULL); return; } goto usage; } usage: outerr (0, "set autoshift <count>\n\n"); outerr (0, "set lfs {hide | show}\n\n"); outerr (0, "set numbers {auto | hide | show}\n\n"); outerr (0, "set search {exact | generic}\n\n"); outerr (0, "set =<buffer> -output <filename>\n"); outerr (0, " -readonly\n\n"); }
void cmd_show (char *cp) { char c, curbf, dirty, *p; const char *fname, *name; int l, rf; Buffer *buffer; uLong lines; if (*cp == 0) goto usage; do { p = uptospace (cp); /* Show buffer info */ if (strncasecmp ("buffers", cp, p - cp) == 0) { outfmt (0, "\nBuffers:\n"); l = 0; for (buffer = NULL; (buffer = buffer_next (buffer)) != NULL;) { name = buffer_name (buffer); if (strlen (name) > l) l = strlen (name); } for (buffer = NULL; (buffer = buffer_next (buffer)) != NULL;) { name = buffer_name (buffer); fname = buffer_filename (buffer); lines = buffer_linecount (buffer); rf = (buffer_getreadfile (buffer) != NULL); curbf = (buffer == cur_position.buffer) ? '>' : ' '; dirty = buffer_dirty (buffer, -1) ? '*' : ' '; outfmt (strlen (name) + 16, " %c %c %*.*s: %5u%c line%c", curbf, dirty, l, l, name, lines, rf ? '+' : ' ', (lines == 1) ? ' ' : 's'); if (fname != NULL) outfmt (strlen (fname), " => %s", fname); if (buffer == main_buffer) outstr (" (main buffer)"); outchr ('\n'); } continue; } /* Show info about files */ if (strncasecmp ("files", cp, p - cp) == 0) { outfmt (0, "\nFiles:\n"); outfmt (strlen (help_name), " Help: %s\n", help_name); outfmt (strlen (journal_name), " Journal: %s\n", journal_name[0] == 0 ? "<none>" : journal_name); continue; } /* Show keypad definitions */ if (strncasecmp ("keypad", cp, p - cp) == 0) { show_keypad (); continue; } goto usage; } while (*(cp = skipspaces (p)) != 0); return; usage: outerr (0, "specify BUFFERS, FILES, KEYPAD\n"); }
main (int argc, char **argv, char **envp) { register c; if (argc > 2) { outerr("Usage: deco [dirname]\n",0); exit (1); } outerr("Demos Commander, Copyright (C) 1989-1994 Serge Vakulenko\n",0); palette = dflt_palette; EnvInit (envp); uid = getuid (); gid = getgid (); # ifdef GROUPS gidnum = getgroups (sizeof(gidlist)/sizeof(gidlist[0]), (unsigned int *)gidlist); # endif ppid = getppid (); user = username (uid); group = groupname (gid); tty = ttyname (0); machine = getmachine (); #if 0 sigign(); #else signal(SIGTERM, SIG_IGN); signal(SIGQUIT, SIG_IGN); signal(SIGINT, SIG_IGN); # ifdef SIGTSTP signal(SIGTSTP, SIG_IGN); # endif #endif init (); // inithome (); VClear (); /* init class dir */ if (argc > 1) // chdir (argv [1]); left = new dir(argv [1]); else left = new dir; right = new dir; left->d.basecol = 0; right->d.basecol = 40; /*-----------*/ initfile.read(); if (uid == 0) palette.dimfg = 6; v.VSetPalette (palette.fg, palette.bg, palette.revfg, palette.revbg, palette.boldfg, palette.boldbg, palette.boldrevfg, palette.boldrevbg, palette.dimfg, palette.dimbg, palette.dimrevfg, palette.dimrevbg); setdir (left, "."); setdir (right, "."); left->chdir(left->d.cwd); cur = left; draw.draw(cur, left, right); for (;;) { if (! cmdreg) draw.drawcursor(cur); // cmd.drawcmd(cur, &left, &right); VSync (); c = KeyGet (); if (! cmdreg) draw.undrawcursor(cur); switch (c) { case '+': /* select */ case '-': /* unselect */ if (! cpos && ! cmdreg && ! cur->d.status) { if (c == '+') tagall (); else untagall (); draw.draw(cur, left, right); continue; } default: // if (c>=' ' && c<='~' || c>=0300 && c<=0376) { // if (cpos || c!=' ') // cmd.inscmd(c); // continue; // } VBeep (); continue; // case cntrl ('V'): /* quote next char */ // cmd.inscmd(quote ()); // continue; // case cntrl ('J'): /* insert file name */ // if (! cmdreg && ! cur->status) // cmd.namecmd(cur); // continue; // case cntrl ('G'): // cmd.delcmd(); // continue; // case meta ('b'): /* backspace */ // if (cpos) { // cmd.leftcmd(); // cmd.delcmd(); // } // continue; case cntrl ('O'): /* set/unset command mode */ case cntrl ('P'): /* set/unset command mode */ switchcmdreg (); if (! cmdreg) visualwin = 1; draw.draw(cur, left, right); continue; case cntrl ('M'): /* return */ // if (command [0]) { // cmd.exec(cur, &left, &right, 1, 1); // draw.draw(cur, &left, &right); // continue; // } if (cmdreg) { cmdreg = 0; if (! visualwin) { visualwin = 1; setdir (cur==left ? right : left, NULL); setdir (cur, NULL); } draw.draw(cur, left, right); continue; } execute (); continue; case cntrl (']'): /* redraw screen */ VRedraw (); continue; // case cntrl ('B'): /* history */ // if (! visualwin) // VClearBox (1, 0, LINES-2, 80); // cmd.histmenu(cur, &left, &right); // draw.draw(cur, &left, &right); // continue; case meta ('A'): /* f1 */ genhelp (); draw.draw(cur, left, right); continue; case meta ('B'): /* f2 */ udm.menu(); draw.draw(cur, left, right); continue; case meta ('I'): /* f9 */ mymenu.runmenu (cur==left ? 'l' : 'r'); draw.draw(cur, left, right); continue; case meta ('J'): /* f0 */ case cntrl ('C'): /* quit */ quit (); continue; case cntrl ('U'): /* swap panels */ swappanels (); draw.draw(cur, left, right); continue; case cntrl ('F'): /* full screen */ fullscreen (); draw.draw(cur, left, right); continue; case cntrl ('^'): /* cd / */ directory (0, 'r'); if (! cur->d.status) draw.drawdir(cur, 1, left, right); continue; case cntrl ('\\'): /* cd $HOME */ directory (0, 'o'); if (! cur->d.status) draw.drawdir(cur, 1, left, right); continue; // case cntrl ('Y'): /* clear line */ // command [cpos = 0] = 0; // continue; // case cntrl ('X'): /* next history */ // cmd.nextcmd(); // continue; // case cntrl ('E'): /* prev history */ // cmd.prevcmd(); // continue; // case cntrl ('S'): /* char left */ // case cntrl ('A'): /* char left */ // cmd.leftcmd(); // continue; // case cntrl ('D'): /* char right */ // cmd.rightcmd(); // continue; case cntrl ('I'): /* tab */ if (cmdreg) {} // if (command [cpos]) // cmd.endcmd(); // else // cmd.homecmd(); else { switchpanels (); if (fullwin) { draw.drawbanners(); draw.drawdir(cur, 0, left, right); break; } } continue; case cntrl ('W'): /* double width */ if (! cmdreg) { setdwid (); draw.draw(cur, left, right); } continue; // case meta ('G'): /* f7 */ // makedir (); // draw.draw(cur, &left, &right); // continue; case meta ('h'): /* home */ case meta ('e'): /* end */ case meta ('u'): /* up */ case meta ('d'): /* down */ case meta ('l'): /* left */ case meta ('r'): /* right */ case meta ('n'): /* next page */ case meta ('p'): /* prev page */ case cntrl ('K'): /* find file */ case cntrl ('R'): /* reread catalog */ case cntrl ('T'): /* tag file */ case meta ('C'): /* f3 */ case meta ('D'): /* f4 */ case meta ('E'): /* f5 */ case meta ('F'): /* f6 */ case meta ('H'): /* f8 */ case cntrl ('L'): /* status */ if (cmdreg || cur->d.status) {} // docmdreg (c); else doscrreg (c); continue; } } }
int main (int argc, char *argv[]) { setvbuf(stdout, NULL, _IONBF, 0); // need this to see i/o at all char *buf, *init_name, *output_name, *p; const char *cmdpnt; FILE *init_file; int i, len, rdonly, recover, siz; String *cmdstr; uLong sts; if (argc > 0) pn = argv[0]; fprintf (stderr, "Copyright (C) 2001,2002,2003,2004 Mike Rieker, Beverly, MA USA\n" "Version 2004-06-10, EDT comes with ABSOLUTELY NO WARRANTY\n" "EXPECT it to FAIL when someone's HeALTh or PROpeRTy is at RISk\n\n"); fflush (stderr); /* Parse command line */ init_name = NULL; input_name = NULL; journal_file = NULL; journal_name = NULL; output_name = NULL; rdonly = 0; recover = 0; recover_file = NULL; recover_name = NULL; for (i = 1; i < argc; i ++) { /* -init <file> : process the given initialization file */ if (strcasecmp (argv[i], "-init") == 0) { if (++ i >= argc) goto usage; if (argv[i][0] == '-') goto usage; if (init_name != NULL) goto usage; init_name = argv[i]; continue; } /* -journal <file> : write journal to specified file */ /* by default, it gets written to <output_file>.edtj */ if (strcasecmp (argv[i], "-journal") == 0) { if (++ i >= argc) goto usage; if (argv[i][0] == '-') goto usage; journal_name = argv[i]; continue; } /* -noinit : don't process default init file */ if (strcasecmp (argv[i], "-noinit") == 0) { if (init_name != NULL) goto usage; init_name = ""; continue; } /* -output <file> : write output to specified file */ /* by default, it gets written to <input_file> */ if (strcasecmp (argv[i], "-output") == 0) { if (++ i >= argc) goto usage; if (argv[i][0] == '-') goto usage; output_name = argv[i]; continue; } /* -readonly : don't write an output file */ if (strcasecmp (argv[i], "-readonly") == 0) { if (output_name == input_name) output_name = NULL; rdonly = 1; continue; } /* -recover [<file>] : process recovery from file */ /* by default, recovery is processed from <input_file>.edtj */ if (strcasecmp (argv[i], "-recover") == 0) { recover = 1; if (i + 1 == argc) continue; if (argv[i+1][0] == '-') continue; if ((input_name != NULL) || (i + 2 <= argc)) recover_name = argv[++i]; continue; } /* No more options */ if (argv[i][0] == '-') goto usage; /* first and only parameter <file> : input filename */ if (input_name == NULL) { input_name = argv[i]; if (!rdonly) output_name = input_name; continue; } goto usage; } /* Open recovery file */ if (recover && (input_name == NULL)) { fprintf (stderr, "no input file specified to recover\n"); return (-1); } if (recover && (recover_name == NULL)) recover_name = os_makejnlname (input_name); if (recover_name != NULL) { recover_file = fopen (recover_name, "r"); if (recover_file == NULL) { fprintf (stderr, "error opening recovery file %s: %s\n", recover_name, strerror (errno)); return (-1); } } /* Create journal file */ if ((output_name != NULL) && (journal_name == NULL)) journal_name = os_makejnlname (output_name); if (journal_name != NULL) { journal_file = os_crenewfile (journal_name); if (journal_file == NULL) { fprintf (stderr, "error creating journal file %s: %s\n", journal_name, strerror (errno)); return (-1); } } /* Initialize os dependent routines. No using stdin/stdout/stderr from now on. */ os_initialization (); /* If input file was given, read it into a buffer and mark that buffer for writing on exit */ if (input_name != NULL) { p = input_name; if (rdonly) { p = malloc (strlen (input_name) + 12); strcpy (p, "-readonly "); strcat (p, input_name); } cmd_open (p); if (p != input_name) free (p); cur_position.line = buffer_first_line (cur_position.buffer); cur_position.offset = 0; } /* Otherwise, allocate initial 'MAIN' buffer with no lines in it */ else { cur_position.buffer = buffer_create (4, "MAIN"); cur_position.line = NULL; cur_position.offset = 0; } /* Either way, that is the one used by the EXIT command */ main_buffer = cur_position.buffer; if (output_name != NULL) buffer_setfile (main_buffer, output_name); /* Process initialization file */ if (init_name == NULL) init_name = os_defaultinitname (); /* if no -noinit or -init, get default name */ if ((init_name != NULL) && (init_name[0] != 0)) { init_file = fopen (init_name, "r"); /* try to open init file */ if (init_file != NULL) { siz = 256; /* start with 256 byte buffer */ buf = malloc (siz); len = 0; /* don't have anything in it */ while (fgets (buf + len, siz - len, init_file) != NULL) { /* read onto end of what's there */ len += strlen (buf + len); /* get total length */ if (len == 0) break; /* stop if nothing there (eof?) */ if (buf[len-1] != '\n') { /* check for line terminator */ siz += 256; /* didn't get the whole thing, increase buffer */ buf = realloc (buf, siz); /* ... then loop to read more of the line */ } else { buf[--len] = 0; /* got terminator, remove it from buffer */ cmdpnt = skipspaces (buf); /* skip leading spaces */ if (*cmdpnt != 0) ln_command (cmdpnt); /* process command line */ len = 0; /* empty line buffer for next read */ } } fclose (init_file); free (buf); } else if (errno != ENOENT) { outerr (strlen (init_name) + strlen (strerror (errno)), "error opening init file %s: %s\n", init_name, strerror (errno)); exit (-1); } } /* Type out line at current position to begin with */ cmd_type ("."); /* Read and process commands until eof */ i = 0; while (1) { cmdstr = jnl_readprompt ("\r\n*"); if (cmdstr == NULL) { /* prompt then read command line */ if (++ i < 3) outerr (0, "use either EXIT or QUIT to terminate\n"); else { outerr (12, "%d EOF's in a row or fatal terminal error, exiting ...\n", i); cmd_exit (""); exit (-1); } continue; } i = 0; for (cmdpnt = string_getval (cmdstr); *cmdpnt != 0; cmdpnt ++) if (*cmdpnt > ' ') break; if (*cmdpnt == 0) cmd_type (".+1"); /* blank line means 'type .+1' */ else ln_command (cmdpnt); /* process command */ string_delete (cmdstr); /* free the command string off */ } /* Bad command line parameter */ usage: fprintf (stderr, "usage: %s [-init <init_file>] [-journal <journal_output>] [-noinit] [-output <output_file>] [-readonly] [-recover [<journal_input>]] [<input_file>]\n", pn); return (-1); }