This is main.c in view mode; [Download] [Up]
/*
* Copyright (c) 1992, 1995 John E. Davis (davis@space.mit.edu)
* All Rights Reserved.
*/
#include <config.h>
#include <stdio.h>
#include <slang.h>
#ifdef HAVE_STDLIB_H
# include <stdlib.h>
#endif
#ifdef HAVE_UNISTD_H
# include <unistd.h>
#endif
#include <string.h>
#include <setjmp.h>
#ifdef unix
# ifdef SYSV
# include <sys/types.h>
# include <fcntl.h>
# endif
# include <sys/file.h>
#endif
#ifdef msdos
# include <io.h>
# if !defined(__WATCOMC__)
# include <dir.h>
extern unsigned _stklen = 10000U;
# else
# include <direct.h>
# endif
#endif
#ifdef __DECC
#include <unixio.h>
#include <unixlib.h>
#endif
#ifndef O_RDWR
#ifndef VMS
# include <fcntl.h>
#endif
#endif
#include "file.h"
#include "buffer.h"
#include "display.h"
#include "sysdep.h"
#include "sig.h"
#include "misc.h"
#include "keymap.h"
#include "screen.h"
#include "ledit.h"
#include "search.h"
#include "text.h"
#include "hooks.h"
int Jed_Secure_Mode;
char Jed_Root_Dir[256];
typedef struct
{
jmp_buf b;
} jmp_buf_struct;
extern jmp_buf_struct Jump_Buffer, *Jump_Buffer_Ptr;
int Batch = 0;
char *get_cwd(void)
{
static char cwd[256];
#ifdef HAVE_GETCWD
# if defined (__EMX__)
_getcwd2(cwd, 254); /* includes drive specifier */
# else
getcwd(cwd, 254); /* djggp includes drive specifier */
# endif
#else
if(!getwd(cwd)) return "";
#endif
#ifndef VMS
slash2slash(cwd);
fixup_dir(cwd);
#endif
return(cwd);
}
#if 0
void load_init_file(void)
{
FILE *fp;
#ifdef unix
char *file = ".jedrc";
#else
char *file = "jed.rc";
#endif
char initfile[256], *home;
home = getenv("JED_HOME");
#ifndef VMS
if ((home != NULL) || (NULL != (home = getenv("HOME"))))
{
strcpy(initfile, home);
fixup_dir(initfile);
}
else initfile[0] = 0;
#else
if (home == NULL) home = "SYS$LOGIN:";
strcpy(initfile, home);
#endif
strcat(initfile, file);
if ((fp = fopen(initfile,"r")) == NULL) return;
fclose(fp);
SLang_load_file(initfile);
}
#endif
void (*X_Init_Global_Structures_Hook)(void);
int Stdin_Is_TTY;
int Main_Argc;
char **Main_Argv;
int main(int argc, char **argv)
{
char *cmd_hook = ".()command_line_hook", *jl, *jr;
int i, fd;
#ifdef __EMX__
_response(&argc, &argv);
_wildcard(&argc, &argv);
#endif
#ifdef msdos
define_word("0-9a-zA-Z\200-\232\240-\245\341-\353");
#else
define_word("0-9a-zA-Z\277-\326\330-\336\340-\366\370-\376");
#endif
#ifdef HAS_DISPLAY_TABLE
for (i = 0; i < 256; i++) Output_Display_Table[i] = i;
#endif
if ((argc > 1) && !strcmp (argv[1], "-secure"))
{
Jed_Secure_Mode = 1;
argc--;
argv[1] = argv[0];
argv++;
}
/* If this hook is defined, let it peel off what ever arguments
it wants. It should return the number of remaining arguments */
if (X_Argc_Argv_Hook != NULL)
{
i = (*X_Argc_Argv_Hook)(argc, argv) - 1;
argv[i] = argv[0];
argc -= i;
argv += i;
}
if (argc > 1)
{
if (!strcmp(argv[1], "-batch"))
{
Batch = 1;
SLang_Traceback = 1;
}
else if (!strcmp(argv[1], "-script"))
{
Batch = 2;
SLang_Traceback = 1;
}
}
if (Batch == 0)
tt_get_terminfo();
#ifdef unix
#ifdef __GO32__
fd = 2;
#else
if (Batch) fd = 2;
else
{
if ((fd = open("/dev/tty", O_RDWR)) >= 0)
{
dup2(fd, 2); /* tty uses 2 as the descriptor */
}
else fd = 2;
/* exit_error("Unable to open /dev/tty.", 0); */
}
#endif
#else
fd = 2; /* 2 is stderr, assume it is ok */
#endif
#ifndef pc_system
*tt_Blink_Mode = 0; /* so high-intensity background
* characters do not blink */
#endif
init_tty();
init_display(1); /* sets up virtual screen */
init_syntax_tables ();
Jump_Buffer_Ptr = &Jump_Buffer;
/* incase something goes wrong before we even get started... */
if (setjmp(Jump_Buffer_Ptr->b) != 0)
{
/* hmm.... just exit I guess */
exit_error("main: Fatal Error", 0);
return -1;
}
/* This order here is crucial! */
init_keymaps();
if (NULL == (CBuf = make_buffer()))
{
exit_error("main: Allocation Failure", 0);
}
CLine = NULL;
strcpy(CBuf->name, "*scratch*");
*CBuf->file = 0;
strcpy(CBuf->dir, get_cwd());
init_minibuffer();
set_file_modes();
/* what if someone pipes something to jed, allow it */
if (Stdin_Is_TTY == 0) Stdin_Is_TTY = isatty (0);
if (Stdin_Is_TTY == 0) /* 1 if stdin is a terminal, 0 otherwise */
{
set_buffer("*stdin*");
read_file_pointer(fileno(stdin));
bob();
fclose(stdin);
dup2(fd, 0);
}
if (CLine == NULL) make_line(25);
Point = 0;
window_buffer(CBuf);
if (!Batch) tt_cls();
#ifndef VMS
# ifndef msdos
# if !defined (__GO32__) && !defined (__os2__)
init_signals();
# endif
# endif
#endif
#ifdef VMS
jr = "JED_ROOT:";
#else
jr = (char *) getenv("JED_ROOT");
#endif
#ifdef JED_ROOT
if ((jr == NULL) && (file_status(JED_ROOT) == 2))
{
jr = JED_ROOT;
}
#endif
if (jr != NULL)
{
strcpy(Jed_Root_Dir, jr);
strcpy(Jed_Library, jr);
#ifndef VMS
fixup_dir(Jed_Library);
strcat(Jed_Library, "lib");
#else
strcat(Jed_Library, "[lib]");
#endif
}
jl = (char *) getenv("JED_LIBRARY");
if (jl == NULL)
{
if (*Jed_Library == 0)
{
jl = extract_file(argv[0]);
i = (int) (jl - argv[0]);
strncpy(Jed_Library, argv[0], i);
Jed_Library[i] = 0;
}
}
else strcpy(Jed_Library, jl);
SLang_load_file("site");
/* set up command line args */
Main_Argc = argc;
Main_Argv = argv;
if (Batch) Ignore_User_Abort = 0;
if (Batch == 2)
{
if (argc > 2)
SLang_load_file(argv[2]);
}
else
{
if (SLang_is_defined(cmd_hook + 3))
{
SLang_run_hooks(cmd_hook + 3, NULL, NULL);
/* This has the effect of removing the memory that cmd_hook
* is using.
*/
SLang_load_string (cmd_hook);
}
else if (!SLang_Error && (argc > 2))
{
find_file_in_window(argv[2]);
}
}
/* after we have possible loaded key definitions, we can fix up
the minibuffer map. This way user definitions are used. */
if (NULL == (Mini_Map = SLang_create_keymap("Mini_Map", Global_Map))) exit_error("main: malloc error", 0);
SLang_undefine_key("^M", Mini_Map);
SLkm_define_key ("^M", (FVOID_STAR) exit_minibuffer, Mini_Map);
SLkm_define_key ("^I", (FVOID_STAR) mini_complete, Mini_Map);
SLkm_define_key (" ", (FVOID_STAR) mini_complete, Mini_Map);
The_MiniBuffer->keymap = Mini_Map;
/* edit_loop */
if (!Batch) jed(); /* never returns */
exit_error ("Batch End with no exit", 0);
return(-1);
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.