コード例 #1
0
ファイル: cmd_resequence.c プロジェクト: Rick33/freevms
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");
}
コード例 #2
0
ファイル: main.cpp プロジェクト: kotohvost/arvid
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;

}
コード例 #3
0
ファイル: cmd.cpp プロジェクト: kotohvost/arvid
/* 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);
}
コード例 #4
0
ファイル: cmd_include.c プロジェクト: rroart/freevms
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 */
}
コード例 #5
0
ファイル: journaling.c プロジェクト: Rick33/freevms
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));
  }
}
コード例 #6
0
ファイル: cmd_delete.c プロジェクト: Rick33/freevms
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));
}
コード例 #7
0
ファイル: cmd_write.c プロジェクト: Rick33/freevms
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);
}
コード例 #8
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;
	}




}
コード例 #9
0
ファイル: adh-main.c プロジェクト: as2120/ZAchieve
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);
}
コード例 #10
0
Socket::Socket()
{
     if ((sockfd=socket(AF_INET,SOCK_STREAM,0))<0)
     {
          outerr("new socket error in server\n");
          exit(-1);
     }

}
コード例 #11
0
ファイル: journaling.c プロジェクト: Rick33/freevms
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);
}
コード例 #12
0
ファイル: journaling.c プロジェクト: Rick33/freevms
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;
    }
  }
}
コード例 #13
0
ファイル: cmd_write.c プロジェクト: Rick33/freevms
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;
  }
}
コード例 #14
0
ファイル: journaling.c プロジェクト: Rick33/freevms
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);
}
コード例 #15
0
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);
	}
}
コード例 #16
0
ファイル: weather.c プロジェクト: carriercomm/weather-cli
/**
 * 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);
}
コード例 #17
0
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;

}
コード例 #18
0
ファイル: native_text.cpp プロジェクト: Cabriter/abelkhan
 ostream& outerr(file_ptr const& f, string_iterator pos)
 {
     return outerr(f->path, f->position_of(pos).line);
 }
コード例 #19
0
ファイル: cmd_exit.c プロジェクト: Rick33/freevms
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);
}
コード例 #20
0
ファイル: cmd_set.c プロジェクト: rroart/freevms
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");
}
コード例 #21
0
ファイル: cmd_show.c プロジェクト: Rick33/freevms
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");
}
コード例 #22
0
ファイル: main.cpp プロジェクト: kotohvost/arvid
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;
		}
	}
}
コード例 #23
0
ファイル: edt.c プロジェクト: Rick33/freevms
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);
}