int SLang_init_slang (void) /*{{{*/ { char name[3]; unsigned int i; SLFUTURE_CONST char **s; static SLFUTURE_CONST char *sys_defines [] = { #if defined(__os2__) "OS2", #endif #if defined(__MSDOS__) "MSDOS", #endif #if defined(__WIN16__) "WIN16", #endif #if defined (__WIN32__) "WIN32", #endif #if defined(__NT__) "NT", #endif #if defined (VMS) "VMS", #endif #ifdef REAL_UNIX_SYSTEM "UNIX", #endif #if SLANG_HAS_FLOAT "SLANG_DOUBLE_TYPE", #endif NULL }; if (-1 == _pSLerr_init ()) return -1; if (-1 == _pSLregister_types ()) return -1; if ((-1 == SLadd_intrin_fun_table(SLang_Basic_Table, NULL)) || (-1 == SLadd_intrin_var_table (Intrin_Vars, NULL)) || (-1 == _pSLang_init_slstrops ()) || (-1 == _pSLang_init_sltime ()) || (-1 == _pSLang_init_sllist ()) || (-1 == _pSLstruct_init ()) #if SLANG_HAS_ASSOC_ARRAYS || (-1 == SLang_init_slassoc ()) #endif #if SLANG_HAS_BOSEOS || (-1 == _pSLang_init_boseos ()) #endif || (-1 == _pSLang_init_exceptions ()) ) return -1; /* More nonsense for the windoze loader */ if ((-1 == SLadd_intrinsic_variable ("_NARGS", &SLang_Num_Function_Args, SLANG_INT_TYPE, 1)) || (-1 == SLadd_intrinsic_variable ("_traceback", &SLang_Traceback, SLANG_INT_TYPE, 0)) || (-1 == SLadd_intrinsic_variable ("_slang_version", &SLang_Version, SLANG_INT_TYPE, 1)) || (-1 == SLadd_intrinsic_variable ("_slang_version_string", &SLang_Version_String, SLANG_STRING_TYPE, 1)) || (-1 == SLadd_intrinsic_variable ("_slang_doc_dir", &SLang_Doc_Dir, SLANG_STRING_TYPE, 1))) return -1; SLadd_global_variable (SLANG_SYSTEM_NAME); s = sys_defines; while (*s != NULL) { if (-1 == SLdefine_for_ifdef (*s)) return -1; s++; } /* give temp global variables $0 --> $9 */ name[2] = 0; name[0] = '$'; for (i = 0; i < 10; i++) { name[1] = (char) (i + '0'); SLadd_global_variable (name); } SLang_init_case_tables (); /* Now add a couple of macros */ SLang_load_string (".(_NARGS 1 - Sprintf error)verror"); SLang_load_string (".(_NARGS 1 - Sprintf message)vmessage"); #if SLANG_HAS_SIGNALS if (-1 == SLang_add_interrupt_hook (_pSLang_check_signals_hook, NULL)) return -1; #endif if ((SLang_Doc_Dir != NULL) && (*SLang_Doc_Dir != 0)) { char *docfile = SLpath_dircat (SLang_Doc_Dir, "slangfun.txt"); /* NULL ok */ (void) add_doc_file (docfile); SLfree (docfile); } if (_pSLang_Error) return -1; return 0; }
static void path_concat (char *a, char *b) { SLang_push_malloced_string (SLpath_dircat (a,b)); }
char *SLpath_find_file_in_path (SLFUTURE_CONST char *path, SLFUTURE_CONST char *name) { unsigned int max_path_len; unsigned int this_path_len; char *file, *dir; SLCONST char *p; unsigned int nth; if ((path == NULL) || (*path == 0) || (name == NULL) || (*name == 0)) return NULL; if (is_relatively_absolute (name)) { if (0 == SLpath_file_exists (name)) return NULL; return SLmake_string (name); } /* Allow "." to mean the current directory on all systems */ if ((path[0] == '.') && (path[1] == 0)) { if (0 == SLpath_file_exists (name)) return NULL; return SLpath_dircat (THIS_DIR_STRING, name); } max_path_len = 0; this_path_len = 0; p = path; while (*p != 0) { if (*p++ == Path_Delimiter) { if (this_path_len > max_path_len) max_path_len = this_path_len; this_path_len = 0; } else this_path_len++; } if (this_path_len > max_path_len) max_path_len = this_path_len; max_path_len++; if (NULL == (dir = (char *)SLmalloc (max_path_len))) return NULL; nth = 0; while (-1 != SLextract_list_element ((char *) path, nth, Path_Delimiter, dir, max_path_len)) { nth++; if (*dir == 0) continue; if (NULL == (file = SLpath_dircat (dir, name))) { SLfree (dir); return NULL; } if (1 == SLpath_file_exists (file)) { SLfree (dir); return file; } SLfree (file); } SLfree (dir); return NULL; }