+#ifdef BB_FEATURE_SH_IF_EXPRESSIONS
+/* Built-in handler for 'if' commands */
+static int builtin_if(struct child_prog *child)
+{
+ struct job *cmd = child->family;
+ int status;
+ char* charptr1=cmd->text+3; /* skip over the leading 'if ' */
+
+ /* Now run the 'if' command */
+ debug_printf( "job=%p entering builtin_if ('%s')-- context=%d\n", cmd, charptr1, cmd->job_context);
+ status = run_command_predicate(charptr1);
+ debug_printf( "if test returned ");
+ if (status == 0) {
+ debug_printf( "TRUE\n");
+ cmd->job_context |= IF_TRUE_CONTEXT;
+ } else {
+ debug_printf( "FALSE\n");
+ cmd->job_context |= IF_FALSE_CONTEXT;
+ }
+ debug_printf("job=%p builtin_if set job context to %x\n", cmd, cmd->job_context);
+ shell_context++;
+
+ return status;
+}
+
+/* Built-in handler for 'then' (part of the 'if' command) */
+static int builtin_then(struct child_prog *child)
+{
+ struct job *cmd = child->family;
+ char* charptr1=cmd->text+5; /* skip over the leading 'then ' */
+
+ debug_printf( "job=%p entering builtin_then ('%s')-- context=%d\n", cmd, charptr1, cmd->job_context);
+ if (! (cmd->job_context & (IF_TRUE_CONTEXT|IF_FALSE_CONTEXT))) {
+ shell_context = 0; /* Reset the shell's context on an error */
+ error_msg("%s `then'", syntax_err);
+ return EXIT_FAILURE;
+ }
+
+ cmd->job_context |= THEN_EXP_CONTEXT;
+ debug_printf("job=%p builtin_then set job context to %x\n", cmd, cmd->job_context);
+
+ /* If the if result was FALSE, skip the 'then' stuff */
+ if (cmd->job_context & IF_FALSE_CONTEXT) {
+ return EXIT_SUCCESS;
+ }
+
+ /* Seems the if result was TRUE, so run the 'then' command */
+ debug_printf( "'then' now running '%s'\n", charptr1);
+
+ return(run_command_predicate(charptr1));
+}
+
+/* Built-in handler for 'else' (part of the 'if' command) */
+static int builtin_else(struct child_prog *child)
+{
+ struct job *cmd = child->family;
+ char* charptr1=cmd->text+5; /* skip over the leading 'else ' */
+
+ debug_printf( "job=%p entering builtin_else ('%s')-- context=%d\n", cmd, charptr1, cmd->job_context);
+
+ if (! (cmd->job_context & THEN_EXP_CONTEXT)) {
+ shell_context = 0; /* Reset the shell's context on an error */
+ error_msg("%s `else'", syntax_err);
+ return EXIT_FAILURE;
+ }
+ /* If the if result was TRUE, skip the 'else' stuff */
+ if (cmd->job_context & IF_TRUE_CONTEXT) {
+ return EXIT_SUCCESS;
+ }
+
+ cmd->job_context |= ELSE_EXP_CONTEXT;
+ debug_printf("job=%p builtin_else set job context to %x\n", cmd, cmd->job_context);
+
+ /* Now run the 'else' command */
+ debug_printf( "'else' now running '%s'\n", charptr1);
+ return(run_command_predicate(charptr1));
+}
+
+/* Built-in handler for 'fi' (part of the 'if' command) */
+static int builtin_fi(struct child_prog *child)
+{
+ struct job *cmd = child->family;
+ debug_printf( "job=%p entering builtin_fi ('%s')-- context=%d\n", cmd, "", cmd->job_context);
+ if (! (cmd->job_context & (IF_TRUE_CONTEXT|IF_FALSE_CONTEXT))) {
+ shell_context = 0; /* Reset the shell's context on an error */
+ error_msg("%s `fi'", syntax_err);
+ return EXIT_FAILURE;
+ }
+ /* Clear out the if and then context bits */
+ cmd->job_context &= ~(IF_TRUE_CONTEXT|IF_FALSE_CONTEXT|THEN_EXP_CONTEXT|ELSE_EXP_CONTEXT);
+ debug_printf("job=%p builtin_fi set job context to %x\n", cmd, cmd->job_context);
+ shell_context--;
+ return EXIT_SUCCESS;
+}
+#endif
+