@ -50,14 +50,14 @@ using df::global::job_next_id;
 
		
	
		
			
				
 
		
	
		
			
				/* Plugin registration */  
		
	
		
			
				
 
		
	
		
			
				static  command_result  workflow_cmd ( Core * c  ,  vector  < string >  &  parameters ) ;  
		
	
		
			
				static  command_result  workflow_cmd ( color_ostream & out  ,  vector  < string >  &  parameters ) ;  
		
	
		
			
				
 
		
	
		
			
				static  void  init_state ( Core * c  ) ;  
		
	
		
			
				static  void  cleanup_state ( Core * c  ) ;  
		
	
		
			
				static  void  init_state ( color_ostream & out  ) ;  
		
	
		
			
				static  void  cleanup_state ( color_ostream & out  ) ;  
		
	
		
			
				
 
		
	
		
			
				DFHACK_PLUGIN ( " workflow " ) ;  
		
	
		
			
				
 
		
	
		
			
				DFhackCExport  command_result  plugin_init  ( Core * c  ,  std : : vector  < PluginCommand >  & commands )  
		
	
		
			
				DFhackCExport  command_result  plugin_init  ( color_ostream & out  ,  std : : vector  < PluginCommand >  & commands )  
		
	
		
			
				{  
		
	
		
			
				    commands . clear ( ) ; 
 
		
	
		
			
				    if  ( ! world  | |  ! ui ) 
 
		
	
	
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
				
			
			@ -118,27 +118,27 @@ DFhackCExport command_result plugin_init (Core *c, std::vector <PluginCommand> &
 
		
	
		
			
				        ) ; 
 
		
	
		
			
				    } 
 
		
	
		
			
				
 
		
	
		
			
				    init_state ( c ) ; 
 
		
	
		
			
				    init_state ( out ) ; 
 
		
	
		
			
				
 
		
	
		
			
				    return  CR_OK ; 
 
		
	
		
			
				}  
		
	
		
			
				
 
		
	
		
			
				DFhackCExport  command_result  plugin_shutdown  (  Core  *  c   )  
		
	
		
			
				DFhackCExport  command_result  plugin_shutdown  ( color_ostream  & out )  
		
	
		
			
				{  
		
	
		
			
				    cleanup_state ( c ) ; 
 
		
	
		
			
				    cleanup_state ( out ) ; 
 
		
	
		
			
				
 
		
	
		
			
				    return  CR_OK ; 
 
		
	
		
			
				}  
		
	
		
			
				
 
		
	
		
			
				DFhackCExport  command_result  plugin_onstatechange ( Core*  c  ,  state_change_event  event )  
		
	
		
			
				DFhackCExport  command_result  plugin_onstatechange ( color_ostream & out  ,  state_change_event  event )  
		
	
		
			
				{  
		
	
		
			
				    switch  ( event )  { 
 
		
	
		
			
				    case  SC_GAME_LOADED : 
 
		
	
		
			
				        cleanup_state ( c ) ; 
 
		
	
		
			
				        init_state ( c ) ; 
 
		
	
		
			
				        cleanup_state ( out ) ; 
 
		
	
		
			
				        init_state ( out ) ; 
 
		
	
		
			
				        break ; 
 
		
	
		
			
				    case  SC_GAME_UNLOADED : 
 
		
	
		
			
				        cleanup_state ( c ) ; 
 
		
	
		
			
				        cleanup_state ( out ) ; 
 
		
	
		
			
				        break ; 
 
		
	
		
			
				    default : 
 
		
	
		
			
				        break ; 
 
		
	
	
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
				
			
			@ -392,12 +392,12 @@ static void setOptionEnabled(ConfigFlags flag, bool on)
 
		
	
		
			
				 *     STATE  INITIALIZATION     * 
 
		
	
		
			
				 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ 
 
		
	
		
			
				
 
		
	
		
			
				static  void  stop_protect ( Core * c  )  
		
	
		
			
				static  void  stop_protect ( color_ostream & out  )  
		
	
		
			
				{  
		
	
		
			
				    pending_recover . clear ( ) ; 
 
		
	
		
			
				
 
		
	
		
			
				    if  ( ! known_jobs . empty ( ) ) 
 
		
	
		
			
				        c- > con  . print ( " Unprotecting %d jobs. \n " ,  known_jobs . size ( ) ) ; 
 
		
	
		
			
				        out . print ( " Unprotecting %d jobs. \n " ,  known_jobs . size ( ) ) ; 
 
		
	
		
			
				
 
		
	
		
			
				    for  ( TKnownJobs : : iterator  it  =  known_jobs . begin ( ) ;  it  ! =  known_jobs . end ( ) ;  + + it ) 
 
		
	
		
			
				        delete  it - > second ; 
 
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
			
			@ -405,31 +405,33 @@ static void stop_protect(Core *c)
 
		
	
		
			
				    known_jobs . clear ( ) ; 
 
		
	
		
			
				}  
		
	
		
			
				
 
		
	
		
			
				static  void  cleanup_state ( Core * c  )  
		
	
		
			
				static  void  cleanup_state ( color_ostream & out  )  
		
	
		
			
				{  
		
	
		
			
				    config  =  PersistentDataItem ( ) ; 
 
		
	
		
			
				
 
		
	
		
			
				    stop_protect ( c ) ; 
 
		
	
		
			
				    stop_protect ( out ) ; 
 
		
	
		
			
				
 
		
	
		
			
				    for  ( size_t  i  =  0 ;  i  <  constraints . size ( ) ;  i + + ) 
 
		
	
		
			
				        delete  constraints [ i ] ; 
 
		
	
		
			
				    constraints . clear ( ) ; 
 
		
	
		
			
				}  
		
	
		
			
				
 
		
	
		
			
				static  void  check_lost_jobs ( Core * c  ,  int  ticks ) ;  
		
	
		
			
				static  ItemConstraint  * get_constraint ( Core * c  ,  const  std : : string  & str ,  PersistentDataItem  * cfg  =  NULL ) ;  
		
	
		
			
				static  void  check_lost_jobs ( color_ostream & out  ,  int  ticks ) ;  
		
	
		
			
				static  ItemConstraint  * get_constraint ( color_ostream & out  ,  const  std : : string  & str ,  PersistentDataItem  * cfg  =  NULL ) ;  
		
	
		
			
				
 
		
	
		
			
				static  void  start_protect ( Core * c  )  
		
	
		
			
				static  void  start_protect ( color_ostream & out  )  
		
	
		
			
				{  
		
	
		
			
				    check_lost_jobs ( c ,  0 ) ; 
 
		
	
		
			
				    check_lost_jobs ( out ,  0 ) ; 
 
		
	
		
			
				
 
		
	
		
			
				    if  ( ! known_jobs . empty ( ) ) 
 
		
	
		
			
				        c- > con  . print ( " Protecting %d jobs. \n " ,  known_jobs . size ( ) ) ; 
 
		
	
		
			
				        out . print ( " Protecting %d jobs. \n " ,  known_jobs . size ( ) ) ; 
 
		
	
		
			
				}  
		
	
		
			
				
 
		
	
		
			
				static  void  init_state ( Core * c  )  
		
	
		
			
				static  void  init_state ( color_ostream & out  )  
		
	
		
			
				{  
		
	
		
			
				    config  =  c - > getWorld ( ) - > GetPersistentData ( " workflow/config " ) ; 
 
		
	
		
			
				    auto  pworld  =  Core : : getInstance ( ) . getWorld ( ) ; 
 
		
	
		
			
				
 
		
	
		
			
				    config  =  pworld - > GetPersistentData ( " workflow/config " ) ; 
 
		
	
		
			
				    if  ( config . isValid ( )  & &  config . ival ( 0 )  = =  - 1 ) 
 
		
	
		
			
				        config . ival ( 0 )  =  0 ; 
 
		
	
		
			
				
 
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
			
			@ -437,14 +439,14 @@ static void init_state(Core *c)
 
		
	
		
			
				
 
		
	
		
			
				    // Parse constraints
 
 
		
	
		
			
				    std : : vector < PersistentDataItem >  items ; 
 
		
	
		
			
				    c- > getWorld ( )  - > GetPersistentData ( & items ,  " workflow/constraints " ) ; 
 
		
	
		
			
				    pworld - > GetPersistentData ( & items ,  " workflow/constraints " ) ; 
 
		
	
		
			
				
 
		
	
		
			
				    for  ( int  i  =  items . size ( ) - 1 ;  i  > =  0 ;  i - - )  { 
 
		
	
		
			
				        if  ( get_constraint ( c ,  items [ i ] . val ( ) ,  & items [ i ] ) ) 
 
		
	
		
			
				        if  ( get_constraint ( out ,  items [ i ] . val ( ) ,  & items [ i ] ) ) 
 
		
	
		
			
				            continue ; 
 
		
	
		
			
				
 
		
	
		
			
				        c- > con  . printerr ( " Lost constraint %s \n " ,  items [ i ] . val ( ) . c_str ( ) ) ; 
 
		
	
		
			
				        c- > getWorld ( )  - > DeletePersistentData ( items [ i ] ) ; 
 
		
	
		
			
				        out . printerr ( " Lost constraint %s \n " ,  items [ i ] . val ( ) . c_str ( ) ) ; 
 
		
	
		
			
				        pworld - > DeletePersistentData ( items [ i ] ) ; 
 
		
	
		
			
				    } 
 
		
	
		
			
				
 
		
	
		
			
				    last_tick_frame_count  =  world - > frame_counter ; 
 
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
			
			@ -453,35 +455,37 @@ static void init_state(Core *c)
 
		
	
		
			
				    if  ( ! enabled ) 
 
		
	
		
			
				        return ; 
 
		
	
		
			
				
 
		
	
		
			
				    start_protect ( c ) ; 
 
		
	
		
			
				    start_protect ( out ) ; 
 
		
	
		
			
				}  
		
	
		
			
				
 
		
	
		
			
				static  void  enable_plugin ( Core * c  )  
		
	
		
			
				static  void  enable_plugin ( color_ostream & out  )  
		
	
		
			
				{  
		
	
		
			
				    auto  pworld  =  Core : : getInstance ( ) . getWorld ( ) ; 
 
		
	
		
			
				
 
		
	
		
			
				    if  ( ! config . isValid ( ) ) 
 
		
	
		
			
				    { 
 
		
	
		
			
				        config  =  c- > getWorld ( )  - > AddPersistentData ( " workflow/config " ) ; 
 
		
	
		
			
				        config  =  pworld - > AddPersistentData ( " workflow/config " ) ; 
 
		
	
		
			
				        config . ival ( 0 )  =  0 ; 
 
		
	
		
			
				    } 
 
		
	
		
			
				
 
		
	
		
			
				    setOptionEnabled ( CF_ENABLED ,  true ) ; 
 
		
	
		
			
				    enabled  =  true ; 
 
		
	
		
			
				    c- > con   < <  " Enabling the plugin. "  < <  endl ; 
 
		
	
		
			
				    out  < <  " Enabling the plugin. "  < <  endl ; 
 
		
	
		
			
				
 
		
	
		
			
				    start_protect ( c ) ; 
 
		
	
		
			
				    start_protect ( out ) ; 
 
		
	
		
			
				}  
		
	
		
			
				
 
		
	
		
			
				/******************************
  
		
	
		
			
				 *      JOB  AUTO - RECOVERY       * 
 
		
	
		
			
				 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ 
 
		
	
		
			
				
 
		
	
		
			
				static  void  forget_job ( Core * c  ,  ProtectedJob  * pj )  
		
	
		
			
				static  void  forget_job ( color_ostream & out  ,  ProtectedJob  * pj )  
		
	
		
			
				{  
		
	
		
			
				    known_jobs . erase ( pj - > id ) ; 
 
		
	
		
			
				    delete  pj ; 
 
		
	
		
			
				}  
		
	
		
			
				
 
		
	
		
			
				static  bool  recover_job ( Core * c  ,  ProtectedJob  * pj )  
		
	
		
			
				static  bool  recover_job ( color_ostream & out  ,  ProtectedJob  * pj )  
		
	
		
			
				{  
		
	
		
			
				    if  ( pj - > isLive ( ) ) 
 
		
	
		
			
				        return  true ; 
 
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
			
			@ -490,18 +494,18 @@ static bool recover_job(Core *c, ProtectedJob *pj)
 
		
	
		
			
				    pj - > holder  =  df : : building : : find ( pj - > building_id ) ; 
 
		
	
		
			
				    if  ( ! pj - > holder ) 
 
		
	
		
			
				    { 
 
		
	
		
			
				        c- > con  . printerr ( " Forgetting job %d (%s): holder building lost. " , 
 
		
	
		
			
				        out . printerr ( " Forgetting job %d (%s): holder building lost. " , 
 
		
	
		
			
				                        pj - > id ,  ENUM_KEY_STR ( job_type ,  pj - > job_copy - > job_type ) ) ; 
 
		
	
		
			
				        forget_job ( c ,  pj ) ; 
 
		
	
		
			
				        forget_job ( out ,  pj ) ; 
 
		
	
		
			
				        return  true ; 
 
		
	
		
			
				    } 
 
		
	
		
			
				
 
		
	
		
			
				    // Check its state and postpone or cancel if invalid
 
 
		
	
		
			
				    if  ( pj - > holder - > jobs . size ( )  > =  10 ) 
 
		
	
		
			
				    { 
 
		
	
		
			
				        c- > con  . printerr ( " Forgetting job %d (%s): holder building has too many jobs. " , 
 
		
	
		
			
				        out . printerr ( " Forgetting job %d (%s): holder building has too many jobs. " , 
 
		
	
		
			
				                        pj - > id ,  ENUM_KEY_STR ( job_type ,  pj - > job_copy - > job_type ) ) ; 
 
		
	
		
			
				        forget_job ( c ,  pj ) ; 
 
		
	
		
			
				        forget_job ( out ,  pj ) ; 
 
		
	
		
			
				        return  true ; 
 
		
	
		
			
				    } 
 
		
	
		
			
				
 
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
			
			@ -522,7 +526,7 @@ static bool recover_job(Core *c, ProtectedJob *pj)
 
		
	
		
			
				    { 
 
		
	
		
			
				        deleteJobStruct ( recovered ) ; 
 
		
	
		
			
				
 
		
	
		
			
				        c- > con  . printerr ( " Inconsistency: job %d (%s) already in list. " , 
 
		
	
		
			
				        out . printerr ( " Inconsistency: job %d (%s) already in list. " , 
 
		
	
		
			
				                        pj - > id ,  ENUM_KEY_STR ( job_type ,  pj - > job_copy - > job_type ) ) ; 
 
		
	
		
			
				        return  true ; 
 
		
	
		
			
				    } 
 
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
			
			@ -534,7 +538,7 @@ static bool recover_job(Core *c, ProtectedJob *pj)
 
		
	
		
			
				    return  true ; 
 
		
	
		
			
				}  
		
	
		
			
				
 
		
	
		
			
				static  void  check_lost_jobs ( Core * c  ,  int  ticks )  
		
	
		
			
				static  void  check_lost_jobs ( color_ostream & out  ,  int  ticks )  
		
	
		
			
				{  
		
	
		
			
				    ProtectedJob : : cur_tick_idx + + ; 
 
		
	
		
			
				    if  ( ticks  <  0 )  ticks  =  0 ; 
 
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
			
			@ -548,7 +552,7 @@ static void check_lost_jobs(Core *c, int ticks)
 
		
	
		
			
				        if  ( pj ) 
 
		
	
		
			
				        { 
 
		
	
		
			
				            if  ( ! job - > flags . bits . repeat ) 
 
		
	
		
			
				                forget_job ( c ,  pj ) ; 
 
		
	
		
			
				                forget_job ( out ,  pj ) ; 
 
		
	
		
			
				            else 
 
		
	
		
			
				                pj - > tick_job ( job ,  ticks ) ; 
 
		
	
		
			
				        } 
 
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
			
			@ -571,7 +575,7 @@ static void check_lost_jobs(Core *c, int ticks)
 
		
	
		
			
				    } 
 
		
	
		
			
				}  
		
	
		
			
				
 
		
	
		
			
				static  void  update_job_data ( Core * c  )  
		
	
		
			
				static  void  update_job_data ( color_ostream & out  )  
		
	
		
			
				{  
		
	
		
			
				    df : : job_list_link  * p  =  world - > job_list . next ; 
 
		
	
		
			
				    for  ( ;  p ;  p  =  p - > next ) 
 
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
			
			@ -583,16 +587,16 @@ static void update_job_data(Core *c)
 
		
	
		
			
				    } 
 
		
	
		
			
				}  
		
	
		
			
				
 
		
	
		
			
				static  void  recover_jobs ( Core * c  )  
		
	
		
			
				static  void  recover_jobs ( color_ostream & out  )  
		
	
		
			
				{  
		
	
		
			
				    for  ( int  i  =  pending_recover . size ( ) - 1 ;  i  > =  0 ;  i - - ) 
 
		
	
		
			
				        if  ( recover_job ( c ,  pending_recover [ i ] ) ) 
 
		
	
		
			
				        if  ( recover_job ( out ,  pending_recover [ i ] ) ) 
 
		
	
		
			
				            vector_erase_at ( pending_recover ,  i ) ; 
 
		
	
		
			
				}  
		
	
		
			
				
 
		
	
		
			
				static  void  process_constraints ( Core * c  ) ;  
		
	
		
			
				static  void  process_constraints ( color_ostream & out  ) ;  
		
	
		
			
				
 
		
	
		
			
				DFhackCExport  command_result  plugin_onupdate ( Core*  c  )  
		
	
		
			
				DFhackCExport  command_result  plugin_onupdate ( color_ostream & out  )  
		
	
		
			
				{  
		
	
		
			
				    if  ( ! enabled ) 
 
		
	
		
			
				        return  CR_OK ; 
 
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
			
			@ -602,7 +606,7 @@ DFhackCExport command_result plugin_onupdate(Core* c)
 
		
	
		
			
				    if  ( ( + + cnt  %  5 )  ! =  0 ) 
 
		
	
		
			
				        return  CR_OK ; 
 
		
	
		
			
				
 
		
	
		
			
				    check_lost_jobs ( c ,  world - > frame_counter  -  last_tick_frame_count ) ; 
 
		
	
		
			
				    check_lost_jobs ( out ,  world - > frame_counter  -  last_tick_frame_count ) ; 
 
		
	
		
			
				    last_tick_frame_count  =  world - > frame_counter ; 
 
		
	
		
			
				
 
		
	
		
			
				    // Proceed every in-game half-day, or when jobs to recover changed
 
 
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
			
			@ -611,7 +615,7 @@ DFhackCExport command_result plugin_onupdate(Core* c)
 
		
	
		
			
				
 
		
	
		
			
				    if  ( pending_recover . size ( )  ! =  last_rlen  | |  check_time ) 
 
		
	
		
			
				    { 
 
		
	
		
			
				        recover_jobs ( c ) ; 
 
		
	
		
			
				        recover_jobs ( out ) ; 
 
		
	
		
			
				        last_rlen  =  pending_recover . size ( ) ; 
 
		
	
		
			
				
 
		
	
		
			
				        // If the half-day passed, proceed to update
 
 
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
			
			@ -619,8 +623,8 @@ DFhackCExport command_result plugin_onupdate(Core* c)
 
		
	
		
			
				        { 
 
		
	
		
			
				            last_frame_count  =  world - > frame_counter ; 
 
		
	
		
			
				
 
		
	
		
			
				            update_job_data ( c ) ; 
 
		
	
		
			
				            process_constraints ( c ) ; 
 
		
	
		
			
				            update_job_data ( out ) ; 
 
		
	
		
			
				            process_constraints ( out ) ; 
 
		
	
		
			
				        } 
 
		
	
		
			
				    } 
 
		
	
		
			
				
 
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
			
			@ -631,7 +635,7 @@ DFhackCExport command_result plugin_onupdate(Core* c)
 
		
	
		
			
				 *    ITEM  COUNT  CONSTRAINT     * 
 
		
	
		
			
				 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ 
 
		
	
		
			
				
 
		
	
		
			
				static  ItemConstraint  * get_constraint ( Core * c  ,  const  std : : string  & str ,  PersistentDataItem  * cfg )  
		
	
		
			
				static  ItemConstraint  * get_constraint ( color_ostream & out  ,  const  std : : string  & str ,  PersistentDataItem  * cfg )  
		
	
		
			
				{  
		
	
		
			
				    std : : vector < std : : string >  tokens ; 
 
		
	
		
			
				    split_string ( & tokens ,  str ,  " / " ) ; 
 
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
			
			@ -643,7 +647,7 @@ static ItemConstraint *get_constraint(Core *c, const std::string &str, Persisten
 
		
	
		
			
				
 
		
	
		
			
				    ItemTypeInfo  item ; 
 
		
	
		
			
				    if  ( ! item . find ( tokens [ 0 ] )  | |  ! item . isValid ( ) )  { 
 
		
	
		
			
				        c- > con  . printerr ( " Cannot find item type: %s \n " ,  tokens [ 0 ] . c_str ( ) ) ; 
 
		
	
		
			
				        out . printerr ( " Cannot find item type: %s \n " ,  tokens [ 0 ] . c_str ( ) ) ; 
 
		
	
		
			
				        return  NULL ; 
 
		
	
		
			
				    } 
 
		
	
		
			
				
 
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
			
			@ -653,7 +657,7 @@ static ItemConstraint *get_constraint(Core *c, const std::string &str, Persisten
 
		
	
		
			
				    df : : dfhack_material_category  mat_mask ; 
 
		
	
		
			
				    std : : string  maskstr  =  vector_get ( tokens , 1 ) ; 
 
		
	
		
			
				    if  ( ! maskstr . empty ( )  & &  ! parseJobMaterialCategory ( & mat_mask ,  maskstr ) )  { 
 
		
	
		
			
				        c- > con  . printerr ( " Cannot decode material mask: %s \n " ,  maskstr . c_str ( ) ) ; 
 
		
	
		
			
				        out . printerr ( " Cannot decode material mask: %s \n " ,  maskstr . c_str ( ) ) ; 
 
		
	
		
			
				        return  NULL ; 
 
		
	
		
			
				    } 
 
		
	
		
			
				
 
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
			
			@ -663,7 +667,7 @@ static ItemConstraint *get_constraint(Core *c, const std::string &str, Persisten
 
		
	
		
			
				    MaterialInfo  material ; 
 
		
	
		
			
				    std : : string  matstr  =  vector_get ( tokens , 2 ) ; 
 
		
	
		
			
				    if  ( ! matstr . empty ( )  & &  ( ! material . find ( matstr )  | |  ! material . isValid ( ) ) )  { 
 
		
	
		
			
				        c- > con  . printerr ( " Cannot find material: %s \n " ,  matstr . c_str ( ) ) ; 
 
		
	
		
			
				        out . printerr ( " Cannot find material: %s \n " ,  matstr . c_str ( ) ) ; 
 
		
	
		
			
				        return  NULL ; 
 
		
	
		
			
				    } 
 
		
	
		
			
				
 
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
			
			@ -671,7 +675,7 @@ static ItemConstraint *get_constraint(Core *c, const std::string &str, Persisten
 
		
	
		
			
				        weight  + =  ( material . index  > =  0  ?  5000  :  1000 ) ; 
 
		
	
		
			
				
 
		
	
		
			
				    if  ( mat_mask . whole  & &  material . isValid ( )  & &  ! material . matches ( mat_mask ) )  { 
 
		
	
		
			
				        c- > con  . printerr ( " Material %s doesn't match mask %s \n " ,  matstr . c_str ( ) ,  maskstr . c_str ( ) ) ; 
 
		
	
		
			
				        out . printerr ( " Material %s doesn't match mask %s \n " ,  matstr . c_str ( ) ,  maskstr . c_str ( ) ) ; 
 
		
	
		
			
				        return  NULL ; 
 
		
	
		
			
				    } 
 
		
	
		
			
				
 
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
			
			@ -693,7 +697,7 @@ static ItemConstraint *get_constraint(Core *c, const std::string &str, Persisten
 
		
	
		
			
				        nct - > config  =  * cfg ; 
 
		
	
		
			
				    else 
 
		
	
		
			
				    { 
 
		
	
		
			
				        nct - > config  =  c- >  getWorld ( ) - > AddPersistentData ( " workflow/constraints " ) ; 
 
		
	
		
			
				        nct - > config  =  Core: : getInstance ( ) .  getWorld ( ) - > AddPersistentData ( " workflow/constraints " ) ; 
 
		
	
		
			
				        nct - > init ( str ) ; 
 
		
	
		
			
				    } 
 
		
	
		
			
				
 
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
			
			@ -701,13 +705,13 @@ static ItemConstraint *get_constraint(Core *c, const std::string &str, Persisten
 
		
	
		
			
				    return  nct ; 
 
		
	
		
			
				}  
		
	
		
			
				
 
		
	
		
			
				static  void  delete_constraint ( Core * c  ,  ItemConstraint  * cv )  
		
	
		
			
				static  void  delete_constraint ( color_ostream & out  ,  ItemConstraint  * cv )  
		
	
		
			
				{  
		
	
		
			
				    int  idx  =  linear_index ( constraints ,  cv ) ; 
 
		
	
		
			
				    if  ( idx  > =  0 ) 
 
		
	
		
			
				        vector_erase_at ( constraints ,  idx ) ; 
 
		
	
		
			
				
 
		
	
		
			
				    c- >  getWorld ( ) - > DeletePersistentData ( cv - > config ) ; 
 
		
	
		
			
				    Core: : getInstance ( ) .  getWorld ( ) - > DeletePersistentData ( cv - > config ) ; 
 
		
	
		
			
				    delete  cv ; 
 
		
	
		
			
				}  
		
	
		
			
				
 
		
	
	
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
				
			
			@ -858,7 +862,7 @@ static void guess_job_material(df::job *job, MaterialInfo &mat, df::dfhack_mater
 
		
	
		
			
				    } 
 
		
	
		
			
				}  
		
	
		
			
				
 
		
	
		
			
				static  void  compute_job_outputs ( Core * c  ,  ProtectedJob  * pj )  
		
	
		
			
				static  void  compute_job_outputs ( color_ostream & out  ,  ProtectedJob  * pj )  
		
	
		
			
				{  
		
	
		
			
				    using  namespace  df : : enums : : job_type ; 
 
		
	
		
			
				
 
		
	
	
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
				
			
			@ -946,7 +950,7 @@ static void compute_job_outputs(Core *c, ProtectedJob *pj)
 
		
	
		
			
				    link_job_constraint ( pj ,  itype ,  isubtype ,  mat_mask ,  mat . type ,  mat . index ) ; 
 
		
	
		
			
				}  
		
	
		
			
				
 
		
	
		
			
				static  void  map_job_constraints ( Core * c  )  
		
	
		
			
				static  void  map_job_constraints ( color_ostream & out  )  
		
	
		
			
				{  
		
	
		
			
				    melt_active  =  false ; 
 
		
	
		
			
				
 
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
			
			@ -968,7 +972,7 @@ static void map_job_constraints(Core *c)
 
		
	
		
			
				        if  ( ! melt_active  & &  pj - > actual_job - > job_type  = =  job_type : : MeltMetalObject ) 
 
		
	
		
			
				            melt_active  =  pj - > isResumed ( ) ; 
 
		
	
		
			
				
 
		
	
		
			
				        compute_job_outputs ( c ,  pj ) ; 
 
		
	
		
			
				        compute_job_outputs ( out ,  pj ) ; 
 
		
	
		
			
				    } 
 
		
	
		
			
				}  
		
	
		
			
				
 
		
	
	
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
				
			
			@ -1046,7 +1050,7 @@ static bool itemInRealJob(df::item *item)
 
		
	
		
			
				               ! =  job_type_class : : Hauling ; 
 
		
	
		
			
				}  
		
	
		
			
				
 
		
	
		
			
				static  void  map_job_items ( Core * c  )  
		
	
		
			
				static  void  map_job_items ( color_ostream & out  )  
		
	
		
			
				{  
		
	
		
			
				    for  ( size_t  i  =  0 ;  i  <  constraints . size ( ) ;  i + + ) 
 
		
	
		
			
				    { 
 
		
	
	
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
				
			
			@ -1159,7 +1163,7 @@ static void map_job_items(Core *c)
 
		
	
		
			
				
 
		
	
		
			
				static  std : : string  shortJobDescription ( df : : job  * job ) ;  
		
	
		
			
				
 
		
	
		
			
				static  void  setJobResumed ( Core * c  ,  ProtectedJob  * pj ,  bool  goal )  
		
	
		
			
				static  void  setJobResumed ( color_ostream & out  ,  ProtectedJob  * pj ,  bool  goal )  
		
	
		
			
				{  
		
	
		
			
				    bool  current  =  pj - > isResumed ( ) ; 
 
		
	
		
			
				
 
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
			
			@ -1167,14 +1171,14 @@ static void setJobResumed(Core *c, ProtectedJob *pj, bool goal)
 
		
	
		
			
				
 
		
	
		
			
				    if  ( goal  ! =  current ) 
 
		
	
		
			
				    { 
 
		
	
		
			
				        c- > con  . print ( " %s %s%s \n " , 
 
		
	
		
			
				        out . print ( " %s %s%s \n " , 
 
		
	
		
			
				                     ( goal  ?  " Resuming "  :  " Suspending " ) , 
 
		
	
		
			
				                     shortJobDescription ( pj - > actual_job ) . c_str ( ) , 
 
		
	
		
			
				                     ( ! goal  | |  pj - > isActuallyResumed ( )  ?  " "  :  "  (delayed) " ) ) ; 
 
		
	
		
			
				    } 
 
		
	
		
			
				}  
		
	
		
			
				
 
		
	
		
			
				static  void  update_jobs_by_constraints ( Core * c  )  
		
	
		
			
				static  void  update_jobs_by_constraints ( color_ostream & out  )  
		
	
		
			
				{  
		
	
		
			
				    for  ( TKnownJobs : : const_iterator  it  =  known_jobs . begin ( ) ;  it  ! =  known_jobs . end ( ) ;  + + it ) 
 
		
	
		
			
				    { 
 
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
			
			@ -1185,7 +1189,7 @@ static void update_jobs_by_constraints(Core *c)
 
		
	
		
			
				        if  ( pj - > actual_job - > job_type  = =  job_type : : MeltMetalObject  & & 
 
		
	
		
			
				            isOptionEnabled ( CF_AUTOMELT ) ) 
 
		
	
		
			
				        { 
 
		
	
		
			
				            setJobResumed ( c ,  pj ,  meltable_count  >  0 ) ; 
 
		
	
		
			
				            setJobResumed ( out ,  pj ,  meltable_count  >  0 ) ; 
 
		
	
		
			
				            continue ; 
 
		
	
		
			
				        } 
 
		
	
		
			
				
 
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
			
			@ -1210,7 +1214,7 @@ static void update_jobs_by_constraints(Core *c)
 
		
	
		
			
				        else  if  ( suspend_weight  > =  0  & &  suspend_weight  > =  resume_weight ) 
 
		
	
		
			
				            goal  =  false ; 
 
		
	
		
			
				
 
		
	
		
			
				        setJobResumed ( c ,  pj ,  goal ) ; 
 
		
	
		
			
				        setJobResumed ( out ,  pj ,  goal ) ; 
 
		
	
		
			
				    } 
 
		
	
		
			
				
 
		
	
		
			
				    for  ( size_t  i  =  0 ;  i  <  constraints . size ( ) ;  i + + ) 
 
		
	
	
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
				
			
			@ -1250,15 +1254,15 @@ static void update_jobs_by_constraints(Core *c)
 
		
	
		
			
				    } 
 
		
	
		
			
				}  
		
	
		
			
				
 
		
	
		
			
				static  void  process_constraints ( Core * c  )  
		
	
		
			
				static  void  process_constraints ( color_ostream & out  )  
		
	
		
			
				{  
		
	
		
			
				    if  ( constraints . empty ( )  & & 
 
		
	
		
			
				        ! isOptionEnabled ( CF_DRYBUCKETS  |  CF_AUTOMELT ) ) 
 
		
	
		
			
				        return ; 
 
		
	
		
			
				
 
		
	
		
			
				    map_job_constraints ( c ) ; 
 
		
	
		
			
				    map_job_items ( c ) ; 
 
		
	
		
			
				    update_jobs_by_constraints ( c ) ; 
 
		
	
		
			
				    map_job_constraints ( out ) ; 
 
		
	
		
			
				    map_job_items ( out ) ; 
 
		
	
		
			
				    update_jobs_by_constraints ( out ) ; 
 
		
	
		
			
				}  
		
	
		
			
				
 
		
	
		
			
				/******************************
  
		
	
	
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
				
			
			@ -1286,7 +1290,7 @@ static std::string shortJobDescription(df::job *job)
 
		
	
		
			
				    return  rv ; 
 
		
	
		
			
				}  
		
	
		
			
				
 
		
	
		
			
				static  void  print_constraint ( Core * c  ,  ItemConstraint  * cv ,  bool  no_job  =  false ,  std : : string  prefix  =  " " )  
		
	
		
			
				static  void  print_constraint ( color_ostream & out  ,  ItemConstraint  * cv ,  bool  no_job  =  false ,  std : : string  prefix  =  " " )  
		
	
		
			
				{  
		
	
		
			
				    Console : : color_value  color ; 
 
		
	
		
			
				    if  ( cv - > request_resume ) 
 
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
			
			@ -1296,24 +1300,24 @@ static void print_constraint(Core *c, ItemConstraint *cv, bool no_job = false, s
 
		
	
		
			
				    else 
 
		
	
		
			
				        color  =  Console : : COLOR_DARKGREY ; 
 
		
	
		
			
				
 
		
	
		
			
				    c- > con  . color ( color ) ; 
 
		
	
		
			
				    c- > con   < <  prefix  < <  " Constraint  "  < <  flush ; 
 
		
	
		
			
				    c- > con  . color ( Console : : COLOR_GREY ) ; 
 
		
	
		
			
				    c- > con   < <  cv - > config . val ( )  < <  "   "  < <  flush ; 
 
		
	
		
			
				    c- > con  . color ( color ) ; 
 
		
	
		
			
				    c- > con   < <  ( cv - > goalByCount ( )  ?  " count  "  :  " amount  " ) 
 
		
	
		
			
				    out . color ( color ) ; 
 
		
	
		
			
				    out  < <  prefix  < <  " Constraint  "  < <  flush ; 
 
		
	
		
			
				    out . color ( Console : : COLOR_GREY ) ; 
 
		
	
		
			
				    out  < <  cv - > config . val ( )  < <  "   "  < <  flush ; 
 
		
	
		
			
				    out . color ( color ) ; 
 
		
	
		
			
				    out  < <  ( cv - > goalByCount ( )  ?  " count  "  :  " amount  " ) 
 
		
	
		
			
				           < <  cv - > goalCount ( )  < <  "  (gap  "  < <  cv - > goalGap ( )  < <  " ) "  < <  endl ; 
 
		
	
		
			
				    c- > con  . reset_color ( ) ; 
 
		
	
		
			
				    out . reset_color ( ) ; 
 
		
	
		
			
				
 
		
	
		
			
				    if  ( cv - > item_count  | |  cv - > item_inuse ) 
 
		
	
		
			
				        c- > con   < <  prefix  < <  "   items: amount  "  < <  cv - > item_amount  < <  " ;  " 
 
		
	
		
			
				        out  < <  prefix  < <  "   items: amount  "  < <  cv - > item_amount  < <  " ;  " 
 
		
	
		
			
				                         < <  cv - > item_count  < <  "  stacks available,  " 
 
		
	
		
			
				                         < <  cv - > item_inuse  < <  "  in use. "  < <  endl ; 
 
		
	
		
			
				
 
		
	
		
			
				    if  ( no_job )  return ; 
 
		
	
		
			
				
 
		
	
		
			
				    if  ( cv - > jobs . empty ( ) ) 
 
		
	
		
			
				        c- > con  . printerr ( "   (no jobs) \n " ) ; 
 
		
	
		
			
				        out . printerr ( "   (no jobs) \n " ) ; 
 
		
	
		
			
				
 
		
	
		
			
				    std : : vector < ProtectedJob * >  unique_jobs ; 
 
		
	
		
			
				    std : : vector < int >  unique_counts ; 
 
		
	
	
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
				
			
			@ -1347,79 +1351,79 @@ static void print_constraint(Core *c, ItemConstraint *cv, bool no_job = false, s
 
		
	
		
			
				        { 
 
		
	
		
			
				            if  ( pj - > want_resumed ) 
 
		
	
		
			
				            { 
 
		
	
		
			
				                c- > con  . color ( Console : : COLOR_YELLOW ) ; 
 
		
	
		
			
				                c- > con   < <  start  < <  "  (delayed) "  < <  endl ; 
 
		
	
		
			
				                out . color ( Console : : COLOR_YELLOW ) ; 
 
		
	
		
			
				                out  < <  start  < <  "  (delayed) "  < <  endl ; 
 
		
	
		
			
				            } 
 
		
	
		
			
				            else 
 
		
	
		
			
				            { 
 
		
	
		
			
				                c- > con  . color ( Console : : COLOR_BLUE ) ; 
 
		
	
		
			
				                c- > con   < <  start  < <  "  (suspended) "  < <  endl ; 
 
		
	
		
			
				                out . color ( Console : : COLOR_BLUE ) ; 
 
		
	
		
			
				                out  < <  start  < <  "  (suspended) "  < <  endl ; 
 
		
	
		
			
				            } 
 
		
	
		
			
				        } 
 
		
	
		
			
				        else 
 
		
	
		
			
				        { 
 
		
	
		
			
				            c- > con  . color ( Console : : COLOR_GREEN ) ; 
 
		
	
		
			
				            c- > con   < <  start  < <  endl ; 
 
		
	
		
			
				            out . color ( Console : : COLOR_GREEN ) ; 
 
		
	
		
			
				            out  < <  start  < <  endl ; 
 
		
	
		
			
				        } 
 
		
	
		
			
				
 
		
	
		
			
				        c- > con  . reset_color ( ) ; 
 
		
	
		
			
				        out . reset_color ( ) ; 
 
		
	
		
			
				
 
		
	
		
			
				        if  ( unique_counts [ i ]  >  1 ) 
 
		
	
		
			
				            c- > con   < <  prefix  < <  "     ( "  < <  unique_counts [ i ]  < <  "  copies) "  < <  endl ; 
 
		
	
		
			
				            out  < <  prefix  < <  "     ( "  < <  unique_counts [ i ]  < <  "  copies) "  < <  endl ; 
 
		
	
		
			
				    } 
 
		
	
		
			
				}  
		
	
		
			
				
 
		
	
		
			
				static  void  print_job ( Core * c  ,  ProtectedJob  * pj )  
		
	
		
			
				static  void  print_job ( color_ostream & out  ,  ProtectedJob  * pj )  
		
	
		
			
				{  
		
	
		
			
				    if  ( ! pj ) 
 
		
	
		
			
				        return ; 
 
		
	
		
			
				
 
		
	
		
			
				    df : : job  * job  =  pj - > isLive ( )  ?  pj - > actual_job  :  pj - > job_copy ; 
 
		
	
		
			
				
 
		
	
		
			
				    printJobDetails ( c ,  job ) ; 
 
		
	
		
			
				    printJobDetails ( out ,  job ) ; 
 
		
	
		
			
				
 
		
	
		
			
				    if  ( job - > job_type  = =  job_type : : MeltMetalObject  & & 
 
		
	
		
			
				        isOptionEnabled ( CF_AUTOMELT ) ) 
 
		
	
		
			
				    { 
 
		
	
		
			
				        if  ( meltable_count  < =  0 ) 
 
		
	
		
			
				            c- > con  . color ( Console : : COLOR_CYAN ) ; 
 
		
	
		
			
				            out . color ( Console : : COLOR_CYAN ) ; 
 
		
	
		
			
				        else  if  ( pj - > want_resumed  & &  ! pj - > isActuallyResumed ( ) ) 
 
		
	
		
			
				            c- > con  . color ( Console : : COLOR_YELLOW ) ; 
 
		
	
		
			
				            out . color ( Console : : COLOR_YELLOW ) ; 
 
		
	
		
			
				        else 
 
		
	
		
			
				            c- > con  . color ( Console : : COLOR_GREEN ) ; 
 
		
	
		
			
				        c- > con   < <  "   Meltable:  "  < <  meltable_count  < <  "  objects. "  < <  endl ; 
 
		
	
		
			
				        c- > con  . reset_color ( ) ; 
 
		
	
		
			
				            out . color ( Console : : COLOR_GREEN ) ; 
 
		
	
		
			
				        out  < <  "   Meltable:  "  < <  meltable_count  < <  "  objects. "  < <  endl ; 
 
		
	
		
			
				        out . reset_color ( ) ; 
 
		
	
		
			
				    } 
 
		
	
		
			
				
 
		
	
		
			
				    for  ( size_t  i  =  0 ;  i  <  pj - > constraints . size ( ) ;  i + + ) 
 
		
	
		
			
				        print_constraint ( c ,  pj - > constraints [ i ] ,  true ,  "    " ) ; 
 
		
	
		
			
				        print_constraint ( out ,  pj - > constraints [ i ] ,  true ,  "    " ) ; 
 
		
	
		
			
				}  
		
	
		
			
				
 
		
	
		
			
				static  command_result  workflow_cmd ( Core * c  ,  vector  < string >  &  parameters )  
		
	
		
			
				static  command_result  workflow_cmd ( color_ostream & out  ,  vector  < string >  &  parameters )  
		
	
		
			
				{  
		
	
		
			
				    CoreSuspender  suspend ( c ) ; 
 
		
	
		
			
				    CoreSuspender  suspend ; 
 
		
	
		
			
				
 
		
	
		
			
				    if  ( ! c- >  isWorldLoaded ( ) )  { 
 
		
	
		
			
				        c- > con  . printerr ( " World is not loaded: please load a game first. \n " ) ; 
 
		
	
		
			
				    if  ( ! Core: : getInstance ( ) .  isWorldLoaded ( ) )  { 
 
		
	
		
			
				        out . printerr ( " World is not loaded: please load a game first. \n " ) ; 
 
		
	
		
			
				        return  CR_FAILURE ; 
 
		
	
		
			
				    } 
 
		
	
		
			
				
 
		
	
		
			
				    if  ( enabled )  { 
 
		
	
		
			
				        check_lost_jobs ( c ,  0 ) ; 
 
		
	
		
			
				        recover_jobs ( c ) ; 
 
		
	
		
			
				        update_job_data ( c ) ; 
 
		
	
		
			
				        map_job_constraints ( c ) ; 
 
		
	
		
			
				        map_job_items ( c ) ; 
 
		
	
		
			
				        check_lost_jobs ( out ,  0 ) ; 
 
		
	
		
			
				        recover_jobs ( out ) ; 
 
		
	
		
			
				        update_job_data ( out ) ; 
 
		
	
		
			
				        map_job_constraints ( out ) ; 
 
		
	
		
			
				        map_job_items ( out ) ; 
 
		
	
		
			
				    } 
 
		
	
		
			
				
 
		
	
		
			
				    df : : building  * workshop  =  NULL ; 
 
		
	
		
			
				    df : : job  * job  =  NULL ; 
 
		
	
		
			
				
 
		
	
		
			
				    if  ( Gui : : dwarfmode_hotkey ( c,  c - >  getTopViewscreen ( ) )  & & 
 
		
	
		
			
				    if  ( Gui : : dwarfmode_hotkey ( Core: :  getTopViewscreen ( ) )  & & 
 
		
	
		
			
				        ui - > main . mode  = =  ui_sidebar_mode : : QueryBuilding ) 
 
		
	
		
			
				    { 
 
		
	
		
			
				        workshop  =  world - > selected_building ; 
 
		
	
		
			
				        job  =  Gui : : getSelectedWorkshopJob ( c ,  true ) ; 
 
		
	
		
			
				        job  =  Gui : : getSelectedWorkshopJob ( out ,  true ) ; 
 
		
	
		
			
				    } 
 
		
	
		
			
				
 
		
	
		
			
				    std : : string  cmd  =  parameters . empty ( )  ?  " list "  :  parameters [ 0 ] ; 
 
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
			
			@ -1429,7 +1433,7 @@ static command_result workflow_cmd(Core *c, vector <string> & parameters)
 
		
	
		
			
				        bool  enable  =  ( cmd  = =  " enable " ) ; 
 
		
	
		
			
				        if  ( enable  & &  ! enabled ) 
 
		
	
		
			
				        { 
 
		
	
		
			
				            enable_plugin ( c ) ; 
 
		
	
		
			
				            enable_plugin ( out ) ; 
 
		
	
		
			
				        } 
 
		
	
		
			
				        else  if  ( ! enable  & &  parameters . size ( )  = =  1 ) 
 
		
	
		
			
				        { 
 
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
			
			@ -1437,10 +1441,10 @@ static command_result workflow_cmd(Core *c, vector <string> & parameters)
 
		
	
		
			
				            { 
 
		
	
		
			
				                enabled  =  false ; 
 
		
	
		
			
				                setOptionEnabled ( CF_ENABLED ,  false ) ; 
 
		
	
		
			
				                stop_protect ( c ) ; 
 
		
	
		
			
				                stop_protect ( out ) ; 
 
		
	
		
			
				            } 
 
		
	
		
			
				
 
		
	
		
			
				            c- > con   < <  " The plugin is disabled. "  < <  endl ; 
 
		
	
		
			
				            out  < <  " The plugin is disabled. "  < <  endl ; 
 
		
	
		
			
				            return  CR_OK ; 
 
		
	
		
			
				        } 
 
		
	
		
			
				
 
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
			
			@ -1455,38 +1459,38 @@ static command_result workflow_cmd(Core *c, vector <string> & parameters)
 
		
	
		
			
				        } 
 
		
	
		
			
				
 
		
	
		
			
				        if  ( enabled ) 
 
		
	
		
			
				            c- > con   < <  " The plugin is enabled. "  < <  endl ; 
 
		
	
		
			
				            out  < <  " The plugin is enabled. "  < <  endl ; 
 
		
	
		
			
				        else 
 
		
	
		
			
				            c- > con   < <  " The plugin is disabled. "  < <  endl ; 
 
		
	
		
			
				            out  < <  " The plugin is disabled. "  < <  endl ; 
 
		
	
		
			
				
 
		
	
		
			
				        if  ( isOptionEnabled ( CF_DRYBUCKETS ) ) 
 
		
	
		
			
				            c- > con   < <  " Option drybuckets is enabled. "  < <  endl ; 
 
		
	
		
			
				            out  < <  " Option drybuckets is enabled. "  < <  endl ; 
 
		
	
		
			
				        if  ( isOptionEnabled ( CF_AUTOMELT ) ) 
 
		
	
		
			
				            c- > con   < <  " Option auto-melt is enabled. "  < <  endl ; 
 
		
	
		
			
				            out  < <  " Option auto-melt is enabled. "  < <  endl ; 
 
		
	
		
			
				
 
		
	
		
			
				        return  CR_OK ; 
 
		
	
		
			
				    } 
 
		
	
		
			
				    else  if  ( cmd  = =  " count "  | |  cmd  = =  " amount " ) 
 
		
	
		
			
				    { 
 
		
	
		
			
				        if  ( ! enabled ) 
 
		
	
		
			
				            enable_plugin ( c ) ; 
 
		
	
		
			
				            enable_plugin ( out ) ; 
 
		
	
		
			
				    } 
 
		
	
		
			
				
 
		
	
		
			
				    if  ( ! enabled ) 
 
		
	
		
			
				        c- > con   < <  " Note: the plugin is not enabled. "  < <  endl ; 
 
		
	
		
			
				        out  < <  " Note: the plugin is not enabled. "  < <  endl ; 
 
		
	
		
			
				
 
		
	
		
			
				    if  ( cmd  = =  " jobs " ) 
 
		
	
		
			
				    { 
 
		
	
		
			
				        if  ( workshop ) 
 
		
	
		
			
				        { 
 
		
	
		
			
				            for  ( size_t  i  =  0 ;  i  <  workshop - > jobs . size ( ) ;  i + + ) 
 
		
	
		
			
				                print_job ( c ,  get_known ( workshop - > jobs [ i ] - > id ) ) ; 
 
		
	
		
			
				                print_job ( out ,  get_known ( workshop - > jobs [ i ] - > id ) ) ; 
 
		
	
		
			
				        } 
 
		
	
		
			
				        else 
 
		
	
		
			
				        { 
 
		
	
		
			
				            for  ( TKnownJobs : : iterator  it  =  known_jobs . begin ( ) ;  it  ! =  known_jobs . end ( ) ;  + + it ) 
 
		
	
		
			
				                if  ( it - > second - > isLive ( ) ) 
 
		
	
		
			
				                    print_job ( c ,  it - > second ) ; 
 
		
	
		
			
				                    print_job ( out ,  it - > second ) ; 
 
		
	
		
			
				        } 
 
		
	
		
			
				
 
		
	
		
			
				        bool  pending  =  false ; 
 
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
			
			@ -1497,11 +1501,11 @@ static command_result workflow_cmd(Core *c, vector <string> & parameters)
 
		
	
		
			
				            { 
 
		
	
		
			
				                if  ( ! pending ) 
 
		
	
		
			
				                { 
 
		
	
		
			
				                    c- > con  . print ( " \n Pending recovery: \n " ) ; 
 
		
	
		
			
				                    out . print ( " \n Pending recovery: \n " ) ; 
 
		
	
		
			
				                    pending  =  true ; 
 
		
	
		
			
				                } 
 
		
	
		
			
				
 
		
	
		
			
				                printJobDetails ( c ,  pending_recover [ i ] - > job_copy ) ; 
 
		
	
		
			
				                printJobDetails ( out ,  pending_recover [ i ] - > job_copy ) ; 
 
		
	
		
			
				            } 
 
		
	
		
			
				        } 
 
		
	
		
			
				
 
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
			
			@ -1510,7 +1514,7 @@ static command_result workflow_cmd(Core *c, vector <string> & parameters)
 
		
	
		
			
				    else  if  ( cmd  = =  " list " ) 
 
		
	
		
			
				    { 
 
		
	
		
			
				        for  ( size_t  i  =  0 ;  i  <  constraints . size ( ) ;  i + + ) 
 
		
	
		
			
				            print_constraint ( c ,  constraints [ i ] ) ; 
 
		
	
		
			
				            print_constraint ( out ,  constraints [ i ] ) ; 
 
		
	
		
			
				
 
		
	
		
			
				        return  CR_OK ; 
 
		
	
		
			
				    } 
 
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
			
			@ -1521,11 +1525,11 @@ static command_result workflow_cmd(Core *c, vector <string> & parameters)
 
		
	
		
			
				
 
		
	
		
			
				        int  limit  =  atoi ( parameters [ 2 ] . c_str ( ) ) ; 
 
		
	
		
			
				        if  ( limit  < =  0 )  { 
 
		
	
		
			
				            c- > con  . printerr ( " Invalid limit value. \n " ) ; 
 
		
	
		
			
				            out . printerr ( " Invalid limit value. \n " ) ; 
 
		
	
		
			
				            return  CR_FAILURE ; 
 
		
	
		
			
				        } 
 
		
	
		
			
				
 
		
	
		
			
				        ItemConstraint  * icv  =  get_constraint ( c ,  parameters [ 1 ] ) ; 
 
		
	
		
			
				        ItemConstraint  * icv  =  get_constraint ( out ,  parameters [ 1 ] ) ; 
 
		
	
		
			
				        if  ( ! icv ) 
 
		
	
		
			
				            return  CR_FAILURE ; 
 
		
	
		
			
				
 
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
			
			@ -1536,8 +1540,8 @@ static command_result workflow_cmd(Core *c, vector <string> & parameters)
 
		
	
		
			
				        else 
 
		
	
		
			
				            icv - > setGoalGap ( - 1 ) ; 
 
		
	
		
			
				
 
		
	
		
			
				        process_constraints ( c ) ; 
 
		
	
		
			
				        print_constraint ( c ,  icv ) ; 
 
		
	
		
			
				        process_constraints ( out ) ; 
 
		
	
		
			
				        print_constraint ( out ,  icv ) ; 
 
		
	
		
			
				        return  CR_OK ; 
 
		
	
		
			
				    } 
 
		
	
		
			
				    else  if  ( cmd  = =  " unlimit " ) 
 
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
			
			@ -1550,11 +1554,11 @@ static command_result workflow_cmd(Core *c, vector <string> & parameters)
 
		
	
		
			
				            if  ( constraints [ i ] - > config . val ( )  ! =  parameters [ 1 ] ) 
 
		
	
		
			
				                continue ; 
 
		
	
		
			
				
 
		
	
		
			
				            delete_constraint ( c ,  constraints [ i ] ) ; 
 
		
	
		
			
				            delete_constraint ( out ,  constraints [ i ] ) ; 
 
		
	
		
			
				            return  CR_OK ; 
 
		
	
		
			
				        } 
 
		
	
		
			
				
 
		
	
		
			
				        c- > con  . printerr ( " Constraint not found: %s \n " ,  parameters [ 1 ] . c_str ( ) ) ; 
 
		
	
		
			
				        out . printerr ( " Constraint not found: %s \n " ,  parameters [ 1 ] . c_str ( ) ) ; 
 
		
	
		
			
				        return  CR_FAILURE ; 
 
		
	
		
			
				    } 
 
		
	
		
			
				    else