/*
 * @author fenrir (http://fenrir.naruoka.org/)
 * 
 * test.c
 * これを参考にしてください。
 */

#include <string.h>
#include <time.h>

#include "reg_core.h"
#include "reg_util.h"

#define DEBUG 0
#define NODE_MAX 128
#define SUBMATCH_MAX 8
#define STACK_SIZE 128

int main(int argc, char *argv[]){

  if(argc < 3){
    printf("Usage: %s (regexp) (target) (option)\n", argv[0]);
    return -1;
  }

  char buf[128];
  int index;

  /*
   * 正規表現でコマンドラインのオプションを解析してみる
   * (オプションをつけたからといって何もかわるわけではない)
   */
  regexp_t arg_checker;
  reg_precompile(arg_checker, NODE_MAX, SUBMATCH_MAX);
  reg_compile(&arg_checker, "--?([^=]+)=(.+)");
  if(argc > 3){
    int arg_index;
    reg_match_t *arg_match;
    for(arg_index = 3; arg_index < argc; arg_index++){
      if(arg_match = reg_match(&arg_checker, argv[arg_index], STACK_SIZE)){
        for(index = 0; reg_submatch(arg_match, index, buf, sizeof(buf)); index++){
          printf("ARG_OPTION[%d]:\t%s\n", index, buf);
        }
      }
    }
  }


  printf("START:\t%d\n", time(NULL));
  
  regexp_t regexp;
  reg_precompile(regexp, NODE_MAX, SUBMATCH_MAX);
  if(!reg_compile(&regexp, argv[1])){
    /* コンパイルが失敗した場合
     * エラーコードはreg_core.hを参照のこと
     */
    printf("Fail to compile.\nERRNO:\t%d\n", regexp.status);
    return -1;
  }
  
#if DEBUG
  int i;
  printf("NODE_COUNT:\t%d\n", regexp.node_end - regexp.node_top);
  for(i = 0; i < NODE_MAX; i++){reg_node_dump(&(regexp.node_top[i]));}
#endif
  
  
  reg_match_t *match_object;
  if(match_object = reg_match(&regexp, argv[2], STACK_SIZE)){
    printf("MATCHED!!\n");
    
    for(index = 0; reg_submatch(match_object, index, buf, sizeof(buf)); index++){
      printf("SUB_MATCH[%d]:\t%s\n", index, buf);
    }
  }
  
  printf("End:\t%d\n", time(NULL));  
  
  return 0; 
}
