home *** CD-ROM | disk | FTP | other *** search
/ Frozen Fish 1: Amiga / FrozenFish-Apr94.iso / bbs / alib / d5xx / d523 / bmake.lha / BMake / source.lzh / recipe.c < prev    next >
C/C++ Source or Header  |  1991-07-28  |  3KB  |  131 lines

  1. /*    recipe.c
  2.  *    (c) Copyright 1991 by Ben Eng, All Rights Reserved
  3.  *
  4.  */
  5.  
  6. #include <clib/exec_protos.h>
  7. #include <clib/dos_protos.h>
  8.  
  9. #include <string.h>
  10. #include <ctype.h>
  11.  
  12. #include "make.h"
  13. #include "depend.h"
  14. #include "cond.h"
  15.  
  16. static
  17. struct List Cstack =
  18. {
  19.     (struct Node *)&Cstack.lh_Tail,    /* lh_Head */
  20.     (struct Node *)NULL,            /* lh_Tail */
  21.     (struct Node *)&Cstack.lh_Head,    /* lh_TailPred */
  22.     (UBYTE)NT_USER,
  23.     (UBYTE)0
  24. };
  25.  
  26.  
  27. static int
  28. changedir( char *newdir )
  29. {
  30.     BPTR oldlock = 0L, newlock = 0L;
  31.  
  32.     while( isspace( *newdir )) newdir++;
  33.     newlock = ( *newdir ) ? Lock( newdir, MODE_OLDFILE ) : Global.oldcwd;
  34.     if( newlock ) {
  35.         oldlock = CurrentDir( newlock );
  36.         if( *newdir && !Global.oldcwd )
  37.             Global.oldcwd = oldlock; /* bug if oldlock is the root */
  38.         else UnLock( oldlock );
  39.         return( 0 );
  40.     }
  41.     logprintf( "Unable to Lock directory %s\n", newdir );    
  42.     return( 1 );
  43. }
  44.  
  45. static void
  46. echo_commandline( struct command *cmd, char *cline )
  47. {
  48.     if( !(cmd->flags & CF_NOECHO ) || Param.debug )
  49.         logprintf( "\t\x9b0;33m%s\x9bm\n", cline );
  50. }
  51.  
  52. /* execute the command List to make a target */
  53. int
  54. recipe( const char *goalname, struct List *cmdlist )
  55. {
  56.     char special_cmd[ 10 ];
  57.     struct command *cmd;
  58.     char *expansion = NULL;
  59.     char *next;
  60.     int retval = 0, state;
  61.  
  62.     if( !cmdlist ) return( 0 ); /* no command list */
  63.  
  64.     if( Param.touch_mode ) {
  65.         logprintf( "\ttouch(%s)\n", goalname );
  66.         if( !Param.pretend_mode ) touch( goalname );
  67.         return( 0 );
  68.     }
  69.  
  70.     expansion = (char *)malloc( Param.MaxLine );
  71.  
  72.     for( cmd = (struct command *) cmdlist->lh_Head;    cmd->node.ln_Succ;
  73.         cmd = cmd->node.ln_Succ ) {
  74.         if( next = cmd->cmd )
  75.             while( isspace( *next )) next++;
  76.         if( next && *next ) {
  77.             if( expand_macros( expansion, next, Param.MaxLine )) {
  78.                 logprintf( "Error expanding macros on commandline:\n"
  79.                     "\t%s\n", next );
  80.                 break;
  81.             };
  82.             next = expansion;
  83.             while( isspace( *next )) next++;
  84.  
  85.             next = parse_str( special_cmd, next, sizeof(special_cmd));
  86.             if( !stricmp( special_cmd, "if" )) {
  87.                 echo_commandline( cmd, expansion );
  88.                 if( retval = drctv_if( next, &Cstack )) break;
  89.                 continue;
  90.             }
  91.             else if( !stricmp( special_cmd, "else" )) {
  92.                 echo_commandline( cmd, expansion );
  93.                 if( retval = drctv_else( next, &Cstack )) break;
  94.                 continue;
  95.             }
  96.             else if( !stricmp( special_cmd, "endif" )) {
  97.                 echo_commandline( cmd, expansion );
  98.                 if( retval = drctv_endif( next, &Cstack )) break;
  99.                 continue;
  100.             }
  101.  
  102.             state = get_directive_state( &Cstack );
  103.             if( state == STATE_IF_F || state == STATE_EL_T ) continue;
  104.  
  105.             echo_commandline( cmd, expansion );
  106.  
  107.             if( !stricmp( special_cmd, "cd" )) {
  108.                 if( retval = changedir( next )) break;
  109.                 continue;
  110.             }
  111.             else if( strchr( expansion, '=' )) {
  112.                 if( retval = process_macroline( expansion ) ? 0 : 1 ) break;
  113.                 continue;
  114.             }
  115.  
  116.             retval = (Param.pretend_mode ) ? 0 :xsystem( expansion );
  117.             if( retval ) {
  118.                 char *s = (cmd->flags & CF_IGNORE ) ? "(Ignored)" : "" ;
  119.                 logprintf( "command returned error %d %s\n", retval, s );
  120.                 if( !(cmd->flags & CF_IGNORE )) break;
  121.             }
  122.         }
  123.     }
  124.     if( !retval && get_directive_state( &Cstack )) {
  125.         logprintf( "Missing endif conditional command for %s\n", goalname );
  126.         retval = 1;
  127.     }
  128.     if( expansion ) free( expansion );
  129.     return( retval );
  130. }
  131.