Patch title: Release 94 bulk changes
Abstract:
File: /pliant/language/startup/startup.c
Key:
    Removed line
    Added line
   
// Copyright  Hubert Tonneau  hubert.tonneau@pliant.cx
//
// This program is free software; you can redistribute it an
// modify it under the terms of the GNU General Public Licen
// as published by the Free Software Foundation.
//
// This program is distributed in the hope that it will be u
// but WITHOUT ANY WARRANTY; without even the implied warran
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public
// version 2 along with this program; if not, write to the F
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA


    static Char *find_root_path(char *buffer) {
      Int lap,i; char *path,*cursor; char stat_buffer[1024];
// Copyright  Hubert Tonneau  hubert.tonneau@pliant.cx
//
// This program is free software; you can redistribute it an
// modify it under the terms of the GNU General Public Licen
// as published by the Free Software Foundation.
//
// This program is distributed in the hope that it will be u
// but WITHOUT ANY WARRANTY; without even the implied warran
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public
// version 2 along with this program; if not, write to the F
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA


    static Char *find_root_path(char *buffer) {
      Int lap,i; char *path,*cursor; char stat_buffer[1024];
      for(lap=0; lap<4; lap++) {
      for(lap=0; lap<5; lap++) {
        if (lap==0) {
          for(i=0; process_env[i]!=0; i++)
        if (lap==0) {
          for(i=0; process_env[i]!=0; i++)
            if(equal2(process_env[i],"PLIANT_ROOT=",12)) {
              cursor=add(process_env[i]+12,buffer);
              cursor=add("/pliant/",cursor);
              path=buffer; } }
        else if (lap==1) {
          for(i=0; process_env[i]!=0; i++)
            if(equal2(process_env[i],"HOME=",5)) {
              cursor=add(process_env[i]+5,buffer);
              cursor=add("/pliant/",cursor);
              path=buffer; } }
            if(equal2(process_env[i],"HOME=",5)) {
              cursor=add(process_env[i]+5,buffer);
              cursor=add("/pliant/",cursor);
              path=buffer; } }
        else if(lap==1)
          path="/pliant/";
        else if(lap==2)
        else if(lap==2)
          path="/pliant/";
        else if(lap==4)
          path="/usr/share/pliant/";
        else
          path="/usr/local/pliant/";
        if(stat(path,&stat_buffer)==0)
          return path; }
      return "/pliant/"; }


#ifdef _DLL_
  #ifdef _GCC_
    // ... is required in order to get around GCC bug
    // it should have rather been void _EXTERNAL_ pliant(int
    void pliant(int argc,char **args,char **env,int debuggin
  #else
    void _EXTERNAL_ pliant(int argc,char **args,char **env,i
  #endif
#else
  #ifdef _EXE_
    int _EXTERNAL_ main(int argc,char **args,char **env)
  #else
    void _EXTERNAL_ startup()
  #endif
#endif
{
  Int verbose_level,nb_methods_indices; Bool initialized;
  #if defined(_WIN32_API_) && !defined(_DLL_) && !defined(_E
    char *args[16]; int argc;
    char *cmdline,*src,*dest;
  #endif
  #if defined(_OS2_API_) && !defined(_DLL_) && !defined(_EXE
    char *args[16]; int argc;
    TIB *tib; PIB *pib; char *src,*dest;
  #endif
  #if defined(_LINUX_API_) || defined(_POSIX_API_)
    #if !defined(_DLL_) && !defined(_EXE_)
      #define args process_args
      #define argc process_argc
    #endif
  #endif
  Address base_address;
  Int decommit_threshold;
  #ifndef _DLL_
    int debugging_level;
    char *pliant_path;
    #ifdef _FIND_ROOT_PATH_
      char pliant_path_buffer[256];
    #endif
  #endif
  Int a,i; uInt u; char *ch,*stop; struct Str temp,temp2; Ch
  struct Str *line; struct List *text; struct Module *module
  struct Str precompile;
  Arrow *c; struct DelayedAction *ea;
  #ifdef _TIMER_
    Int old;
  #endif
          path="/usr/share/pliant/";
        else
          path="/usr/local/pliant/";
        if(stat(path,&stat_buffer)==0)
          return path; }
      return "/pliant/"; }


#ifdef _DLL_
  #ifdef _GCC_
    // ... is required in order to get around GCC bug
    // it should have rather been void _EXTERNAL_ pliant(int
    void pliant(int argc,char **args,char **env,int debuggin
  #else
    void _EXTERNAL_ pliant(int argc,char **args,char **env,i
  #endif
#else
  #ifdef _EXE_
    int _EXTERNAL_ main(int argc,char **args,char **env)
  #else
    void _EXTERNAL_ startup()
  #endif
#endif
{
  Int verbose_level,nb_methods_indices; Bool initialized;
  #if defined(_WIN32_API_) && !defined(_DLL_) && !defined(_E
    char *args[16]; int argc;
    char *cmdline,*src,*dest;
  #endif
  #if defined(_OS2_API_) && !defined(_DLL_) && !defined(_EXE
    char *args[16]; int argc;
    TIB *tib; PIB *pib; char *src,*dest;
  #endif
  #if defined(_LINUX_API_) || defined(_POSIX_API_)
    #if !defined(_DLL_) && !defined(_EXE_)
      #define args process_args
      #define argc process_argc
    #endif
  #endif
  Address base_address;
  Int decommit_threshold;
  #ifndef _DLL_
    int debugging_level;
    char *pliant_path;
    #ifdef _FIND_ROOT_PATH_
      char pliant_path_buffer[256];
    #endif
  #endif
  Int a,i; uInt u; char *ch,*stop; struct Str temp,temp2; Ch
  struct Str *line; struct List *text; struct Module *module
  struct Str precompile;
  Arrow *c; struct DelayedAction *ea;
  #ifdef _TIMER_
    Int old;
  #endif
  #if defined(_LINUX_API_)
    // does not work because must be called before the process is loaded
    // personality(0x0040000); // ADDR_NO_RANDOMIZE
  #endif
  #if defined(_LINUX_API_) || defined(_POSIX_API_)
    #if defined(_DLL_) || defined(_EXE_)
      process_env=env;
      process_args=args;
    #endif
  #endif
  base_address=null;
  decommit_threshold=64*1024;
  verbose_level=1;
  nb_methods_indices=32;
  initialized=false;
  last_module=null;
  Str_map_string(&precompile,"");
  #if defined(_LINUX_API_) && !defined(_DLL_)
    for(argc=0; args[argc]!=null; argc++);
  #endif
  #if defined(_WIN32_API_) && !defined(_DLL_) && !defined(_E
    cmdline=GetCommandLine();
    argc=0;
    for(src=cmdline,dest=src; *src!='\0'; )
      if(*src=='\'') {
        if(dest==cmdline || dest[-1]=='\0') args[argc++]=des
        src++; while(*src!='\'' && *src!='\0') *dest++=*src+
        if(*src!='\0') src++;
      orif(*src==' ')
        *dest++='\0'; src++;
      other
        if(dest==cmdline || dest[-1]=='\0') args[argc++]=des
        *dest++=*src++; }
    *dest='\0'; args[argc]=0;
  #endif
  #if defined(_OS2_API_) && !defined(_DLL_) && !defined(_EXE
    DosGetInfoBlocks(&tib,&pib);
    args[0]=pib->pib_pchcmd; argc=1;
    for(src=pib->pib_pchcmd+string_len(pib->pib_pchcmd)+1,de
      if(*src=='\'') {
        if(dest[-1]=='\0') args[argc++]=dest;
        src++; while(*src!='\'' && *src!='\0') *dest++=*src+
        if(*src!='\0') src++;
      orif(*src==' ')
        *dest++='\0'; src++;
      other
        if(dest[-1]=='\0') args[argc++]=dest;
        *dest++=*src++; }
    *dest='\0'; args[argc]=0;
  #endif
  #ifndef _DLL_
    #ifdef _FIND_ROOT_PATH_
      pliant_path=find_root_path(pliant_path_buffer);
    #else
      pliant_path="/pliant/";
    #endif
    debugging_level=c_debugging_level;
  #endif


  #ifndef _NO_INIT_
  #if defined(_LINUX_API_) || defined(_POSIX_API_)
    #if defined(_DLL_) || defined(_EXE_)
      process_env=env;
      process_args=args;
    #endif
  #endif
  base_address=null;
  decommit_threshold=64*1024;
  verbose_level=1;
  nb_methods_indices=32;
  initialized=false;
  last_module=null;
  Str_map_string(&precompile,"");
  #if defined(_LINUX_API_) && !defined(_DLL_)
    for(argc=0; args[argc]!=null; argc++);
  #endif
  #if defined(_WIN32_API_) && !defined(_DLL_) && !defined(_E
    cmdline=GetCommandLine();
    argc=0;
    for(src=cmdline,dest=src; *src!='\0'; )
      if(*src=='\'') {
        if(dest==cmdline || dest[-1]=='\0') args[argc++]=des
        src++; while(*src!='\'' && *src!='\0') *dest++=*src+
        if(*src!='\0') src++;
      orif(*src==' ')
        *dest++='\0'; src++;
      other
        if(dest==cmdline || dest[-1]=='\0') args[argc++]=des
        *dest++=*src++; }
    *dest='\0'; args[argc]=0;
  #endif
  #if defined(_OS2_API_) && !defined(_DLL_) && !defined(_EXE
    DosGetInfoBlocks(&tib,&pib);
    args[0]=pib->pib_pchcmd; argc=1;
    for(src=pib->pib_pchcmd+string_len(pib->pib_pchcmd)+1,de
      if(*src=='\'') {
        if(dest[-1]=='\0') args[argc++]=dest;
        src++; while(*src!='\'' && *src!='\0') *dest++=*src+
        if(*src!='\0') src++;
      orif(*src==' ')
        *dest++='\0'; src++;
      other
        if(dest[-1]=='\0') args[argc++]=dest;
        *dest++=*src++; }
    *dest='\0'; args[argc]=0;
  #endif
  #ifndef _DLL_
    #ifdef _FIND_ROOT_PATH_
      pliant_path=find_root_path(pliant_path_buffer);
    #else
      pliant_path="/pliant/";
    #endif
    debugging_level=c_debugging_level;
  #endif


  #ifndef _NO_INIT_
    memory_page_reserve(null,1<<20); // walk around Linux 2.6.12 randomisation

    // var.c
    memory_clear(&G,sizeof(G));
    G.execution_phase=phase_startup;
    G.memory_base_address=base_address;
    G.memory_decommit_threshold=decommit_threshold;
    G.debugging_level=debugging_level;
    G.generator_level=2;
    G.verbose_level=verbose_level;
    G.memory_minimal_address=(Address)-1;
    _check_( G.entry_lock_hook=do_nothing; )
    _check_( G.entry_unlock_hook=do_nothing; )


    // var.c
    memory_clear(&G,sizeof(G));
    G.execution_phase=phase_startup;
    G.memory_base_address=base_address;
    G.memory_decommit_threshold=decommit_threshold;
    G.debugging_level=debugging_level;
    G.generator_level=2;
    G.verbose_level=verbose_level;
    G.memory_minimal_address=(Address)-1;
    _check_( G.entry_lock_hook=do_nothing; )
    _check_( G.entry_unlock_hook=do_nothing; )