text: 
  /*
   * Copyright (C) Niklaus F.Schen.
   */
  #include "mln_lang_bool.h"
  #include <stdio.h>
  
  #ifdef __DEBUG__
  #include <assert.h>
  #define ASSERT(x) assert(x)
  #else
  #define ASSERT(x);
  #endif
  
  static int
  mln_lang_bool_assign(mln_lang_ctx_t *ctx, mln_lang_var_t **ret, mln_lang_var_t *op1, mln_lang_var_t *op2);
  static int
  mln_lang_bool_pluseq(mln_lang_ctx_t *ctx, mln_lang_var_t **ret, mln_lang_var_t *op1, mln_lang_var_t *op2);
  static int
  mln_lang_bool_equal(mln_lang_ctx_t *ctx, mln_lang_var_t **ret, mln_lang_var_t *op1, mln_lang_var_t *op2);
  static int
  mln_lang_bool_nonequal(mln_lang_ctx_t *ctx, mln_lang_var_t **ret, mln_lang_var_t *op1, mln_lang_var_t *op2);
  static int
  mln_lang_bool_plus(mln_lang_ctx_t *ctx, mln_lang_var_t **ret, mln_lang_var_t *op1, mln_lang_var_t *op2);
  static int
  mln_lang_bool_not(mln_lang_ctx_t *ctx, mln_lang_var_t **ret, mln_lang_var_t *op1, mln_lang_var_t *op2);
  
  mln_lang_method_t mln_lang_bool_oprs = {
      mln_lang_bool_assign,
      mln_lang_bool_pluseq,
      NULL,
      NULL,
      NULL,
      NULL,
      NULL,
      NULL,
      NULL,
      NULL,
      NULL,
      NULL,
      NULL,
      NULL,
      mln_lang_bool_equal,
      mln_lang_bool_nonequal,
      NULL,
      NULL,
      NULL,
      NULL,
      NULL,
      NULL,
      mln_lang_bool_plus,
      NULL,
      NULL,
      NULL,
      NULL,
      NULL,
      NULL,
      NULL,
      NULL,
      NULL,
      NULL,
      mln_lang_bool_not,
      NULL,
      NULL
  };
  
  static int
  mln_lang_bool_assign(mln_lang_ctx_t *ctx, mln_lang_var_t **ret, mln_lang_var_t *op1, mln_lang_var_t *op2)
  {
      if (mln_lang_var_value_set(ctx, op1, op2) < 0) {
          mln_lang_errmsg(ctx, "No memory.");
          return -1;
      }
      *ret = mln_lang_var_ref(op1);
      return 0;
  }
  
  static int
  mln_lang_bool_pluseq(mln_lang_ctx_t *ctx, mln_lang_var_t **ret, mln_lang_var_t *op1, mln_lang_var_t *op2)
  {
      mln_s32_t type = mln_lang_var_val_type_get(op1);
      if (type == M_LANG_VAL_TYPE_BOOL) {
          mln_lang_errmsg(ctx, "Operation Not support.");
          return -1;
      }
      mln_lang_method_t *method = mln_lang_methods[type];
      if (method == NULL) {
          mln_lang_errmsg(ctx, "Operation Not support.");
          return -1;
      }
      mln_lang_op handler = method->pluseq_handler;
      if (handler == NULL) {
          mln_lang_errmsg(ctx, "Operation Not support.");
          return -1;
      }
      return handler(ctx, ret, op1, op2);
  }
  
  static int
  mln_lang_bool_equal(mln_lang_ctx_t *ctx, mln_lang_var_t **ret, mln_lang_var_t *op1, mln_lang_var_t *op2)
  {
      if (mln_lang_var_val_type_get(op1) != mln_lang_var_val_type_get(op2) || \
          mln_lang_var_val_get(op1)->data.b != mln_lang_var_val_get(op2)->data.b)
      {
          if ((*ret = mln_lang_var_create_false(ctx, NULL)) == NULL) {
              mln_lang_errmsg(ctx, "No memory.");
              return -1;
          }
      } else {
          if ((*ret = mln_lang_var_create_true(ctx, NULL)) == NULL) {
              mln_lang_errmsg(ctx, "No memory.");
              return -1;
          }
      }
      return 0;
  }
  
  static int
  mln_lang_bool_nonequal(mln_lang_ctx_t *ctx, mln_lang_var_t **ret, mln_lang_var_t *op1, mln_lang_var_t *op2)
  {
      if (mln_lang_var_val_type_get(op1) != mln_lang_var_val_type_get(op2) || \
          mln_lang_var_val_get(op1)->data.b != mln_lang_var_val_get(op2)->data.b)
      {
          if ((*ret = mln_lang_var_create_true(ctx, NULL)) == NULL) {
              mln_lang_errmsg(ctx, "No memory.");
              return -1;
          }
      } else {
          if ((*ret = mln_lang_var_create_false(ctx, NULL)) == NULL) {
              mln_lang_errmsg(ctx, "No memory.");
              return -1;
          }
      }
      return 0;
  }
  
  static int
  mln_lang_bool_plus(mln_lang_ctx_t *ctx, mln_lang_var_t **ret, mln_lang_var_t *op1, mln_lang_var_t *op2)
  {
      mln_s32_t type = mln_lang_var_val_type_get(op2);
      if (type != M_LANG_VAL_TYPE_STRING) {
          mln_lang_errmsg(ctx, "Operation Not support.");
          return -1;
      }
      mln_lang_method_t *method = mln_lang_methods[type];
      if (method == NULL) {
          mln_lang_errmsg(ctx, "Operation Not support.");
          return -1;
      }
      mln_lang_op handler = method->plus_handler;
      if (handler == NULL) {
          mln_lang_errmsg(ctx, "Operation Not support.");
          return -1;
      }
      return handler(ctx, ret, op1, op2);
  }
  
  static int
  mln_lang_bool_not(mln_lang_ctx_t *ctx, mln_lang_var_t **ret, mln_lang_var_t *op1, mln_lang_var_t *op2)
  {
      if (mln_lang_condition_is_true(op1)) {
          if ((*ret = mln_lang_var_create_false(ctx, NULL)) == NULL) {
              mln_lang_errmsg(ctx, "No memory.");
              return -1;
          }
      } else {
          if ((*ret = mln_lang_var_create_true(ctx, NULL)) == NULL) {
              mln_lang_errmsg(ctx, "No memory.");
              return -1;
          }
      }
      return 0;
  }
  
  