home *** CD-ROM | disk | FTP | other *** search
/ Kyūkyoku!! X68000 Emulator / X68000Book.dat / mac / OLS / X68000 / Ko-Window / kow142s.lzh / wsrv / exec.c < prev    next >
C/C++ Source or Header  |  1995-11-20  |  3KB  |  147 lines

  1. /*    Modified by Å¼è}î┤öÄöV    */
  2. /*:vi:se ts=8 sw=8:*/
  3.  
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <sys_doslib.h>
  7. #include <microstr.h>
  8.  
  9. #include "super.h"
  10. #include "exec.h"
  11.  
  12. #ifndef    TRUE
  13.     #define    TRUE    1
  14.     #define    FALSE    0
  15. #endif
  16.  
  17. extern int    LOADEXEC();
  18.  
  19. extern void    (*PutCVtable[])();
  20. unsigned char    *FCB;
  21.  
  22. static int    DefaultPut,
  23.         DefaultPrint,
  24.         DefaultConCtrl,
  25.         DefaultIOCSPut,
  26.         DefaultIOCSPrt;
  27.  
  28. void
  29. PutCVtInit()
  30. {
  31.     extern void    PutEntry(),
  32.             PrintEntry(),
  33.             ConCtrlEntry(),
  34.             IOCSPutEntry(),
  35.             IOCSPrtEntry();
  36.     extern void    xPutEntry(),
  37.             xPrintEntry(),
  38.             xConCtrlEntry(),
  39.             xIOCSPutEntry(),
  40.             xIOCSPrtEntry();
  41.     if( !DefaultPut ){
  42.         extern int    BGmode;
  43. /*        InSuper();*/
  44.         if( BGmode ){
  45.             DefaultPut= INTVCS( 0xFF02, (char*)PutEntry );
  46.             DefaultIOCSPrt= INTVCS( 0x121, (char*)IOCSPrtEntry );
  47.             DefaultIOCSPut= INTVCS( 0x120, (char*)IOCSPutEntry );
  48.             DefaultPrint= INTVCS( 0xFF09, (char*)PrintEntry );
  49.             DefaultConCtrl= INTVCS( 0xFF23, (char*)ConCtrlEntry );
  50.         }else{
  51.             DefaultPut= INTVCS( 0xFF02, (char*)xPutEntry );
  52.             DefaultIOCSPrt= INTVCS( 0x121, (char*)xIOCSPrtEntry );
  53.             DefaultIOCSPut= INTVCS( 0x120, (char*)xIOCSPutEntry );
  54.             DefaultPrint= INTVCS( 0xFF09, (char*)xPrintEntry );
  55.             DefaultConCtrl= INTVCS( 0xFF23, (char*)xConCtrlEntry );
  56.         }
  57.         FCB= GETFCB( 1 );
  58. /*        OutSuper();*/
  59.     }
  60. }
  61.  
  62. void
  63. PutCVtQuit()
  64. {
  65.     if( DefaultPut ){
  66. /*        InSuper();*/
  67.         INTVCS( 0xFF23, (char*)DefaultConCtrl );
  68.         INTVCS( 0x121, (char*)DefaultIOCSPrt );
  69.         INTVCS( 0x120, (char*)DefaultIOCSPut );
  70.         INTVCS( 0xFF09, (char*)DefaultPrint );
  71.         INTVCS( 0xFF02, (char*)DefaultPut );
  72.         DefaultPut= NULL;
  73. /*        OutSuper();*/
  74.     }
  75. }
  76.  
  77. short    threadflag;
  78. int    old_open_pr;
  79.  
  80. int
  81. WindowLoadExec( exec, param, envptr, put )
  82. unsigned char    *exec, *param, *envptr;
  83. void        (*put)();
  84. {
  85.     int        n, exflag= ((int)exec) & 0x03000000;
  86.     struct COMLINE    comline;
  87.     unsigned char    buf[256];
  88.  
  89.     extern int    BGmode;
  90.     extern int    ErrorEntry( void );
  91.     extern int    DefaultErrorEntry ;    /* 1993 Taka2 */
  92.  
  93.     {
  94.         unsigned char    *ptr,
  95.                 *str= buf,
  96.                 *dot= NULL;
  97.         for( ptr= exec ; *ptr ; ptr++ ){
  98.             *str++= (*ptr == '/' ? '\\' : *ptr);
  99.             if( *ptr == '.' )
  100.                 dot= ptr;
  101.         }
  102.         if( dot && !n_fstrcmpi( ".win", dot ) )
  103.             exflag= 0x03000000;
  104.         for( *str++= ' ', ptr= param ; *str++= *ptr++ ;);
  105.         if( PATHCHK( buf, &comline, 0 ) < 0 )
  106.             return    -2;
  107.     }
  108.     if( put ){
  109.         FCB= GETFCB( 1 );
  110.         PutCVtable[0]= put;
  111.     }
  112.     if( BGmode ){
  113.         extern void    threadflagcall();
  114.         threadflag= FALSE;
  115.         old_open_pr= INTVCS( 0xfff8, (void*)threadflagcall );
  116.     }
  117.     if ( put == NULL ) {
  118.         INTVCS( 0x2E, (char*)DefaultErrorEntry );  /* 1993 Taka2 */
  119.     }
  120.     n= LOADEXEC( buf + exflag, &comline, envptr );
  121.     if ( put == NULL ) {
  122.         INTVCS( 0x2E, (char*)ErrorEntry );    /* 1993 Taka2 */
  123.     }
  124.     if( BGmode ){
  125.         INTVCS( 0xfff8, (void*)old_open_pr );
  126.         if( threadflag && put && n >= 0 && (n&0x1f)< 32 )
  127.             PutCVtable[ n & 0x1f ]= put;
  128.     }
  129.     return    n;
  130. }
  131.  
  132. unsigned char *
  133. SearchPath( path, file )
  134. unsigned char    *path,
  135.         *file;
  136. {
  137.     struct COMLINE    comline;
  138.     unsigned char    *ptr,
  139.             *str= path;
  140.     for( ptr= file ; *ptr ; ptr++ )
  141.         *str++= *ptr == '/' ? '\\' : *ptr;
  142.     *str= '\0';
  143.     if( PATHCHK( path, &comline, 0 ) < 0 )
  144.         return    NULL;
  145.     return    path;
  146. }
  147.