static int main_init(int argc, const char *argv[], Source **sp, struct block **lp) { int argi, i; Source *s = NULL; struct block *l; unsigned char restricted_shell, errexit, utf_flag; char *cp; const char *ccp, **wp; struct tbl *vp; struct stat s_stdin; #if !defined(_PATH_DEFPATH) && defined(_CS_PATH) ssize_t k; #endif #if defined(MKSH_EBCDIC) || defined(MKSH_FAUX_EBCDIC) ebcdic_init(); #endif set_ifs(TC_IFSWS); #ifdef __OS2__ os2_init(&argc, &argv); #endif /* do things like getpgrp() et al. */ chvt_reinit(); /* make sure argv[] is sane, for weird OSes */ if (!*argv) { argv = empty_argv; argc = 1; } kshname = argv[0]; /* initialise permanent Area */ ainit(&aperm); /* max. name length: -2147483648 = 11 (+ NUL) */ vtemp = alloc(offsetof(struct tbl, name[0]) + 12, APERM); /* set up base environment */ env.type = E_NONE; ainit(&env.area); /* set up global l->vars and l->funs */ newblock(); /* Do this first so output routines (eg, errorf, shellf) can work */ initio(); /* determine the basename (without '-' or path) of the executable */ ccp = kshname; goto begin_parsing_kshname; while ((i = ccp[argi++])) { if (mksh_cdirsep(i)) { ccp += argi; begin_parsing_kshname: argi = 0; if (*ccp == '-') ++ccp; } } if (!*ccp) ccp = empty_argv[0]; /* * Turn on nohup by default. (AT&T ksh does not have a nohup * option - it always sends the hup). */ Flag(FNOHUP) = 1; /* * Turn on brace expansion by default. AT&T kshs that have * alternation always have it on. */ Flag(FBRACEEXPAND) = 1; /* * Turn on "set -x" inheritance by default. */ Flag(FXTRACEREC) = 1; /* define built-in commands and see if we were called as one */ ktinit(APERM, &builtins, /* currently up to 54 builtins: 75% of 128 = 2^7 */ 7); for (i = 0; mkshbuiltins[i].name != NULL; i++) if (!strcmp(ccp, builtin(mkshbuiltins[i].name, mkshbuiltins[i].func))) Flag(FAS_BUILTIN) = 1; if (!Flag(FAS_BUILTIN)) { /* check for -T option early */ argi = parse_args(argv, OF_FIRSTTIME, NULL); if (argi < 0) return (1); #if defined(MKSH_BINSHPOSIX) || defined(MKSH_BINSHREDUCED) /* are we called as -sh or /bin/sh or so? */ if (!strcmp(ccp, "sh" MKSH_EXE_EXT)) { /* either also turns off braceexpand */ #ifdef MKSH_BINSHPOSIX /* enable better POSIX conformance */ change_flag(FPOSIX, OF_FIRSTTIME, true); #endif #ifdef MKSH_BINSHREDUCED /* enable kludge/compat mode */ change_flag(FSH, OF_FIRSTTIME, true); #endif } #endif } initvar(); inittraps(); coproc_init(); /* set up variable and command dictionaries */ ktinit(APERM, &taliases, 0); ktinit(APERM, &aliases, 0); #ifndef MKSH_NOPWNAM ktinit(APERM, &homedirs, 0); #endif /* define shell keywords */ initkeywords(); init_histvec(); /* initialise tty size before importing environment */ change_winsz(); #ifdef _PATH_DEFPATH def_path = _PATH_DEFPATH; #else #ifdef _CS_PATH if ((k = confstr(_CS_PATH, NULL, 0)) > 0 && confstr(_CS_PATH, cp = alloc(k + 1, APERM), k + 1) == k + 1) def_path = cp; else #endif /* * this is uniform across all OSes unless it * breaks somewhere hard; don't try to optimise, * e.g. add stuff for Interix or remove /usr * for HURD, because e.g. Debian GNU/HURD is * "keeping a regular /usr"; this is supposed * to be a sane 'basic' default PATH */ def_path = MKSH_UNIXROOT "/bin" MKSH_PATHSEPS MKSH_UNIXROOT "/usr/bin" MKSH_PATHSEPS MKSH_UNIXROOT "/sbin" MKSH_PATHSEPS MKSH_UNIXROOT "/usr/sbin"; #endif /* * Set PATH to def_path (will set the path global variable). * (import of environment below will probably change this setting). */ vp = global(TPATH); /* setstr can't fail here */ setstr(vp, def_path, KSH_RETURN_ERROR); #ifndef MKSH_NO_CMDLINE_EDITING /* * Set edit mode to emacs by default, may be overridden * by the environment or the user. Also, we want tab completion * on in vi by default. */ change_flag(FEMACS, OF_SPECIAL, true); #if !MKSH_S_NOVI Flag(FVITABCOMPLETE) = 1; #endif #endif /* import environment */ init_environ(); /* override default PATH regardless of environment */ #ifdef MKSH_DEFPATH_OVERRIDE vp = global(TPATH); setstr(vp, MKSH_DEFPATH_OVERRIDE, KSH_RETURN_ERROR); #endif /* for security */ typeset(TinitIFS, 0, 0, 0, 0); /* assign default shell variable values */ typeset("PATHSEP=" MKSH_PATHSEPS, 0, 0, 0, 0); substitute(initsubs, 0); /* Figure out the current working directory and set $PWD */ vp = global(TPWD); cp = str_val(vp); /* Try to use existing $PWD if it is valid */ set_current_wd((mksh_abspath(cp) && test_eval(NULL, TO_FILEQ, cp, Tdot, true)) ? cp : NULL); if (current_wd[0]) simplify_path(current_wd); /* Only set pwd if we know where we are or if it had a bogus value */ if (current_wd[0] || *cp) /* setstr can't fail here */ setstr(vp, current_wd, KSH_RETURN_ERROR); for (wp = initcoms; *wp != NULL; wp++) { c_builtin(wp); while (*wp != NULL) wp++; } setint_n(global("OPTIND"), 1, 10); kshuid = getuid(); kshgid = getgid(); kshegid = getegid(); safe_prompt = ksheuid ? "$ " : "# "; vp = global("PS1"); /* Set PS1 if unset or we are root and prompt doesn't contain a # */ if (!(vp->flag & ISSET) || (!ksheuid && !strchr(str_val(vp), '#'))) /* setstr can't fail here */ setstr(vp, safe_prompt, KSH_RETURN_ERROR); setint_n((vp = global("BASHPID")), 0, 10); vp->flag |= INT_U; setint_n((vp = global("PGRP")), (mksh_uari_t)kshpgrp, 10); vp->flag |= INT_U; setint_n((vp = global("PPID")), (mksh_uari_t)kshppid, 10); vp->flag |= INT_U; setint_n((vp = global("USER_ID")), (mksh_uari_t)ksheuid, 10); vp->flag |= INT_U; setint_n((vp = global("KSHUID")), (mksh_uari_t)kshuid, 10); vp->flag |= INT_U; setint_n((vp = global("KSHEGID")), (mksh_uari_t)kshegid, 10); vp->flag |= INT_U; setint_n((vp = global("KSHGID")), (mksh_uari_t)kshgid, 10); vp->flag |= INT_U; setint_n((vp = global("RANDOM")), rndsetup(), 10); vp->flag |= INT_U; setint_n((vp_pipest = global("PIPESTATUS")), 0, 10); /* Set this before parsing arguments */ Flag(FPRIVILEGED) = (kshuid != ksheuid || kshgid != kshegid) ? 2 : 0; /* this to note if monitor is set on command line (see below) */ #ifndef MKSH_UNEMPLOYED Flag(FMONITOR) = 127; #endif /* this to note if utf-8 mode is set on command line (see below) */ UTFMODE = 2; if (!Flag(FAS_BUILTIN)) { argi = parse_args(argv, OF_CMDLINE, NULL); if (argi < 0) return (1); } /* process this later only, default to off (hysterical raisins) */ utf_flag = UTFMODE; UTFMODE = 0; if (Flag(FAS_BUILTIN)) { /* auto-detect from environment variables, always */ utf_flag = 3; } else if (Flag(FCOMMAND)) { s = pushs(SSTRINGCMDLINE, ATEMP); if (!(s->start = s->str = argv[argi++])) errorf(Tf_optfoo, "", "", 'c', Treq_arg); while (*s->str) { if (ctype(*s->str, C_QUOTE)) break; s->str++; } if (!*s->str) s->flags |= SF_MAYEXEC; s->str = s->start; #ifdef MKSH_MIDNIGHTBSD01ASH_COMPAT /* compatibility to MidnightBSD 0.1 /bin/sh (kludge) */ if (Flag(FSH) && argv[argi] && !strcmp(argv[argi], "--")) ++argi; #endif if (argv[argi]) kshname = argv[argi++]; } else if (argi < argc && !Flag(FSTDIN)) { s = pushs(SFILE, ATEMP); #ifdef __OS2__ /* * A bug in OS/2 extproc (like shebang) handling makes * it not pass the full pathname of a script, so we need * to search for it. This changes the behaviour of a * simple "mksh foo", but can't be helped. */ s->file = argv[argi++]; if (search_access(s->file, X_OK) != 0) s->file = search_path(s->file, path, X_OK, NULL); if (!s->file || !*s->file) s->file = argv[argi - 1]; #else s->file = argv[argi++]; #endif s->u.shf = shf_open(s->file, O_RDONLY, 0, SHF_MAPHI | SHF_CLEXEC); if (s->u.shf == NULL) { shl_stdout_ok = false; warningf(true, Tf_sD_s, s->file, cstrerror(errno)); /* mandated by SUSv4 */ exstat = 127; unwind(LERROR); } kshname = s->file; } else { Flag(FSTDIN) = 1; s = pushs(SSTDIN, ATEMP); s->file = "<stdin>"; s->u.shf = shf_fdopen(0, SHF_RD | can_seek(0), NULL); if (isatty(0) && isatty(2)) { Flag(FTALKING) = Flag(FTALKING_I) = 1; /* The following only if isatty(0) */ s->flags |= SF_TTY; s->u.shf->flags |= SHF_INTERRUPT; s->file = NULL; } } /* this bizarreness is mandated by POSIX */ if (fstat(0, &s_stdin) >= 0 && S_ISCHR(s_stdin.st_mode) && Flag(FTALKING)) reset_nonblock(0); /* initialise job control */ j_init(); /* do this after j_init() which calls tty_init_state() */ if (Flag(FTALKING)) { if (utf_flag == 2) { #ifndef MKSH_ASSUME_UTF8 /* auto-detect from locale or environment */ utf_flag = 4; #else /* this may not be an #elif */ #if MKSH_ASSUME_UTF8 utf_flag = 1; #else /* always disable UTF-8 (for interactive) */ utf_flag = 0; #endif #endif } #ifndef MKSH_NO_CMDLINE_EDITING x_init(); #endif } #ifdef SIGWINCH sigtraps[SIGWINCH].flags |= TF_SHELL_USES; setsig(&sigtraps[SIGWINCH], x_sigwinch, SS_RESTORE_ORIG|SS_FORCE|SS_SHTRAP); #endif l = e->loc; if (Flag(FAS_BUILTIN)) { l->argc = argc; l->argv = argv; l->argv[0] = ccp; } else { l->argc = argc - argi; /* * allocate a new array because otherwise, when we modify * it in-place, ps(1) output changes; the meaning of argc * here is slightly different as it excludes kshname, and * we add a trailing NULL sentinel as well */ l->argv = alloc2(l->argc + 2, sizeof(void *), APERM); l->argv[0] = kshname; memcpy(&l->argv[1], &argv[argi], l->argc * sizeof(void *)); l->argv[l->argc + 1] = NULL; getopts_reset(1); } /* divine the initial state of the utf8-mode Flag */ ccp = null; switch (utf_flag) { /* auto-detect from locale or environment */ case 4: #if HAVE_SETLOCALE_CTYPE ccp = setlocale(LC_CTYPE, ""); #if HAVE_LANGINFO_CODESET if (!isuc(ccp)) ccp = nl_langinfo(CODESET); #endif if (!isuc(ccp)) ccp = null; #endif /* FALLTHROUGH */ /* auto-detect from environment */ case 3: /* these were imported from environ earlier */ if (ccp == null) ccp = str_val(global("LC_ALL")); if (ccp == null) ccp = str_val(global("LC_CTYPE")); if (ccp == null) ccp = str_val(global("LANG")); UTFMODE = isuc(ccp); break; /* not set on command line, not FTALKING */ case 2: /* unknown values */ default: utf_flag = 0; /* FALLTHROUGH */ /* known values */ case 1: case 0: UTFMODE = utf_flag; break; } /* Disable during .profile/ENV reading */ restricted_shell = Flag(FRESTRICTED); Flag(FRESTRICTED) = 0; errexit = Flag(FERREXIT); Flag(FERREXIT) = 0; /* * Do this before profile/$ENV so that if it causes problems in them, * user will know why things broke. */ if (!current_wd[0] && Flag(FTALKING)) warningf(false, "can't determine current directory"); if (Flag(FLOGIN)) include(MKSH_SYSTEM_PROFILE, 0, NULL, true); if (!Flag(FPRIVILEGED)) { if (Flag(FLOGIN)) include(substitute("$HOME/.profile", 0), 0, NULL, true); if (Flag(FTALKING)) { cp = substitute("${ENV:-" MKSHRC_PATH "}", DOTILDE); if (cp[0] != '\0') include(cp, 0, NULL, true); } } else { include(MKSH_SUID_PROFILE, 0, NULL, true); /* turn off -p if not set explicitly */ if (Flag(FPRIVILEGED) != 1) change_flag(FPRIVILEGED, OF_INTERNAL, false); } if (restricted_shell) { c_builtin(restr_com); /* After typeset command... */ Flag(FRESTRICTED) = 1; } Flag(FERREXIT) = errexit; if (Flag(FTALKING) && s) hist_init(s); else /* set after ENV */ Flag(FTRACKALL) = 1; alarm_init(); *sp = s; *lp = l; return (0); }
void format::button_ok_VwXEvOnButtonClick(wxCommandEvent& event,int index) { FB_Edit * stc = Parent->stc; int idx = Parent->FBNotebook->GetSelection(); Buffer * buff = Parent->bufferList[idx]; if (buff->GetFileType()>0) return; wxString guts=Parent->stc->GetText(),tagstart="",tagend=""; int sel=chc15->GetSelection(); bool dotags=false,dokeyws=false; wxString output=""; StyleInfo * Style = &(Parent->Style); switch(sel) { case 0: dokeyws=true; break; case 1: dokeyws=true; break; case 2: dokeyws=true; break; case 3: dotags=true; tagstart="["; tagend="]"; output="[quote=\"fbide 0.4 bbcode generator\"][size=12]"; break; case 4: dotags=true; tagstart="<"; tagend=">"; output="<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n<html>\n<head>\n<meta http-equiv=\"content-type\" content=\"text/html;charset=iso-8859-1\">\n<title></title>\n</head>\n<body style=\"font-size:12pt; background-color:#"+hex(GetClr(Style->DefaultBgColour))+"; color:#"+hex(GetClr(Style->Info[wxSTC_B_IDENTIFIER].foreground))+"\"><pre>"; break; } wxString curword=""; initkeywords(); int kwtyp=0; bool commenting=false,dontadd=false,quoting=false,bold=false,italic=false; wxString colours[]={hex(GetClr(Style->Info[wxSTC_B_KEYWORD].foreground)), hex(GetClr(Style->Info[wxSTC_B_KEYWORD2].foreground)), hex(GetClr(Style->Info[wxSTC_B_KEYWORD3].foreground)), hex(GetClr(Style->Info[wxSTC_B_KEYWORD4].foreground)), hex(GetClr(Style->Info[wxSTC_B_COMMENT].foreground)), hex(GetClr(Style->Info[wxSTC_B_OPERATOR].foreground)), hex(GetClr(Style->Info[wxSTC_B_STRING].foreground)), hex(GetClr(Style->Info[wxSTC_B_NUMBER].foreground)), hex(GetClr(Style->Info[wxSTC_B_PREPROCESSOR].foreground))}; int teh_len=(int)guts.Len(),real_len=(int)guts.Len(),color=-1; for(int i=0;i<teh_len;i++) { unsigned char j00_n00b=guts.GetChar(i); curword+=j00_n00b; if(j00_n00b!=38&& (j00_n00b>0&&j00_n00b<46)|| j00_n00b==47|| (j00_n00b>57&&j00_n00b<65)|| (j00_n00b>90&&j00_n00b<95)|| j00_n00b==96|| (j00_n00b>122&&j00_n00b<128)) { curword=curword.Left(curword.Len()-1); if(dotags&&!commenting&&!quoting&&(kwtyp=isKeyword(curword))!=0) { if(color!=kwtyp-1) { if(color!=-1) output+=tagstart+(sel==4?"/span":"/color")+tagend; if(bold) output+=tagstart+"/b"+tagend; if(italic) output+=tagstart+"/i"+tagend; output+=tagstart+"b"+tagend+tagstart+(sel==4?"span style=\"color:#":"color=#")+colours[kwtyp-1]+ \ (sel==4?"\"":"")+tagend+curword+(dontadd?"":wxString::Format("%c",j00_n00b)); } else output+=curword+(dontadd?"":wxString::Format("%c",j00_n00b)); color=kwtyp-1; bold=true; italic=false; } else if(dotags&&!commenting&&!quoting&&isNumeric(curword)) { if(color!=7) { if(color!=-1) output+=tagstart+(sel==4?"/span":"/color")+tagend; if(bold) output+=tagstart+"/b"+tagend; if(italic) output+=tagstart+"/i"+tagend; output+=tagstart+(sel==4?"span style=\"color:#":"color=#")+colours[7]+ \ (sel==4?"\"":"")+tagend+curword+(dontadd?"":wxString::Format("%c",j00_n00b)); } else output+=curword+(dontadd?"":wxString::Format("%c",j00_n00b)); color=7; bold=false; italic=false; } else if(dokeyws&&!commenting&&!quoting&&isKeyword(curword)!=0) { switch(sel) { case 0: curword=curword.Left(1).MakeUpper()+curword.Mid(1).MakeLower(); break; case 1: curword=curword.MakeUpper(); break; case 2: curword=curword.MakeLower(); break; } output+=curword+(dontadd?"":wxString::Format("%c",j00_n00b)); } else { if(!commenting&&!quoting) { if(color!=-1) output+=tagstart+(sel==4?"/span":"/color")+tagend; if(bold) output+=tagstart+"/b"+tagend; if(italic) output+=tagstart+"/i"+tagend; color=-1; } bold=false; italic=false; output+=curword+(dontadd?"":wxString::Format("%c",j00_n00b)); } curword=""; int mylen=output.Len(); if(!commenting&&!quoting&&j00_n00b=='\'') { commenting=true; if(dotags) { output=output.Left(mylen-1); if(color!=-1) output+=tagstart+(sel==4?"/span":"/color")+tagend; if(bold) output+=tagstart+"/b"+tagend; if(italic) output+=tagstart+"/i"+tagend; output+=tagstart+"i"+tagend+tagstart+(sel==4?"span style=\"color:#":"color=#")+colours[4]+ \ (sel==4?"\"":"")+tagend; output+=j00_n00b; } } else if((j00_n00b=='\n'||j00_n00b=='\r')&&commenting) { commenting=false; color=-1; bold=false; italic=false; if(dotags) { output=output.Left(mylen-1); output+=tagstart+(sel==4?"/span":"/color")+tagend+tagstart+"/i"+tagend; output+=j00_n00b; } } if(!commenting&&!quoting&&j00_n00b=='\"') { if(dotags) { output=output.Left(mylen-1); if(color!=-1) output+=tagstart+(sel==4?"/span":"/color")+tagend; if(bold) output+=tagstart+"/b"+tagend; if(italic) output+=tagstart+"/i"+tagend; output+=tagstart+(sel==4?"span style=\"color:#":"color=#")+colours[6]+ \ (sel==4?"\"":"")+tagend; output+=j00_n00b; } quoting=true; } else if((j00_n00b=='\"'||j00_n00b=='\n'||j00_n00b=='\r')&"ing) { quoting=false; color=-1; bold=false; italic=false; if(dotags) output+=tagstart+(sel==4?"/span":"/color")+tagend; } if(!commenting&&!quoting&&j00_n00b=='#'&&(i==0||(output.Mid(output.Len()-2,1)=="\n"||output.Mid(output.Len()-2,1)=="\r"))) { output=output.Left(mylen-1); if(color!=-1) output+=tagstart+(sel==4?"/span":"/color")+tagend; if(bold) output+=tagstart+"/b"+tagend; if(italic) output+=tagstart+"/i"+tagend; color=-1; bold=false; italic=false; if(dotags) output+=tagstart+(sel==4?"span style=\"color:#":"color=#")+colours[8]+ \ (sel==4?"\"":"")+tagend; output+=j00_n00b; for(i++;guts.GetChar(i)!='\n'&&i<teh_len;i++) { output+=guts.Mid(i,1); } output+='\n'; if(dotags) output << tagstart+(sel==4?"/span":"/color")+tagend << guts.GetChar(i); } else if(dotags&&!commenting&&!quoting&&j00_n00b=='#') { output=output.Left(mylen-1); output+=tagstart+"b"+tagend+tagstart+(sel==4?"span style=\"color:#":"color=#")+colours[5]+ \ (sel==4?"\"":"")+tagend; output+=j00_n00b; output+=tagstart+(sel==4?"/span":"/color")+tagend+tagstart+"/b"+tagend; } if(dotags&&((j00_n00b>39&&j00_n00b<46)||j00_n00b==47|| (j00_n00b>57&&j00_n00b<64)||j00_n00b==92||j00_n00b==94|| (j00_n00b>122&&j00_n00b<128))&&!commenting&&!quoting) { output=output.Left(mylen-1); output+=tagstart+"b"+tagend+tagstart+(sel==4?"span style=\"color:#":"color=#")+colours[5]+ \ (sel==4?"\"":"")+tagend; output+=j00_n00b; output+=tagstart+(sel==4?"/span":"/color")+tagend+tagstart+"/b"+tagend; } } if(i+1==real_len) { guts+="\n"; teh_len++; dontadd=true; } } if (sel < 3) { buff = stc->buff; buff->SetPositions(stc->GetSelectionStart(), stc->GetSelectionEnd()); buff->SetLine(stc->GetFirstVisibleLine()); buff->SetCaretPos(stc->GetCurrentPos()); stc->SetText(output); stc->ScrollToLine(buff->GetLine()); stc->SetCurrentPos(buff->GetCaretPos()); stc->SetSelectionStart(buff->GetSelectionStart()); stc->SetSelectionEnd(buff->GetSelectionEnd()); } else { if(color!=-1) output+=tagstart+(sel==4?"/span":"/color")+tagend; if(bold) output+=tagstart+"/b"+tagend; if(italic) output+=tagstart+"/i"+tagend; if (sel==4) output+="</pre></body></html>"; else if(sel==3) output+="[/size][/quote]"; Parent->NewSTCPage("",true, 1); stc->SetText(output); } }
int main(int argc, char *argv[]) { int i; int argi; Source *s; struct block *l; int restricted, errexit; char **wp; struct env env; pid_t ppid; /* make sure argv[] is sane */ if (!*argv) { static const char *empty_argv[] = { "ksh", (char *) 0 }; argv = (char **) empty_argv; argc = 1; } kshname = *argv; ainit(&aperm); /* initialize permanent Area */ /* set up base environment */ memset(&env, 0, sizeof(env)); env.type = E_NONE; ainit(&env.area); e = &env; newblock(); /* set up global l->vars and l->funs */ /* Do this first so output routines (eg, errorf, shellf) can work */ initio(); initvar(); initctypes(); inittraps(); coproc_init(); /* set up variable and command dictionaries */ ktinit(&taliases, APERM, 0); ktinit(&aliases, APERM, 0); ktinit(&homedirs, APERM, 0); /* define shell keywords */ initkeywords(); /* define built-in commands */ ktinit(&builtins, APERM, 64); /* must be 2^n (currently 40 builtins) */ for (i = 0; shbuiltins[i].name != NULL; i++) builtin(shbuiltins[i].name, shbuiltins[i].func); for (i = 0; kshbuiltins[i].name != NULL; i++) builtin(kshbuiltins[i].name, kshbuiltins[i].func); init_histvec(); def_path = _PATH_DEFPATH; { size_t len = confstr(_CS_PATH, (char *) 0, 0); char *new; if (len > 0) { confstr(_CS_PATH, new = alloc(len + 1, APERM), len + 1); def_path = new; } }
int main(int argc, char *argv[]) { register int i; int argi; Source *s; struct block *l; int restricted, errexit; char **wp; struct env env; pid_t ppid; #ifdef MEM_DEBUG chmem_set_defaults("ct", 1); /* chmem_push("+c", 1); */ #endif /* MEM_DEBUG */ #ifdef OS2 setmode (0, O_BINARY); setmode (1, O_TEXT); #endif /* make sure argv[] is sane */ if (!*argv) { static const char *empty_argv[] = { "pdksh", (char *) 0 }; argv = (char **)__UNCONST(empty_argv); argc = 1; } kshname = *argv; ainit(&aperm); /* initialize permanent Area */ /* set up base environment */ memset(&env, 0, sizeof(env)); env.type = E_NONE; ainit(&env.area); e = &env; newblock(); /* set up global l->vars and l->funs */ /* Do this first so output routines (eg, errorf, shellf) can work */ initio(); initvar(); initctypes(); inittraps(); #ifdef KSH coproc_init(); #endif /* KSH */ /* set up variable and command dictionaries */ tinit(&taliases, APERM, 0); tinit(&aliases, APERM, 0); tinit(&homedirs, APERM, 0); /* define shell keywords */ initkeywords(); /* define built-in commands */ tinit(&builtins, APERM, 64); /* must be 2^n (currently 40 builtins) */ for (i = 0; shbuiltins[i].name != NULL; i++) builtin(shbuiltins[i].name, shbuiltins[i].func); for (i = 0; kshbuiltins[i].name != NULL; i++) builtin(kshbuiltins[i].name, kshbuiltins[i].func); init_histvec(); def_path = DEFAULT__PATH; #if defined(HAVE_CONFSTR) && defined(_CS_PATH) { size_t len = confstr(_CS_PATH, (char *) 0, 0); char *new; if (len > 0) { confstr(_CS_PATH, new = alloc(len + 1, APERM), len + 1); def_path = new; } }