int __cdecl main()

in blingfiretools/fa_fsm2fsm/fa_fsm2fsm.cpp [154:352]


int __cdecl main (int argc, char** argv)
{
    __PROG__ = argv [0];

    --argc, ++argv;

    ::FAIOSetup ();

    // parse a command line
    process_args (argc, argv);

    try {

      // select in/out streams
      std::istream * pIs = &std::cin;
      std::ifstream ifs;

      std::ostream * pOs = &std::cout;
      std::ofstream ofs;

      std::ostream * pTrBrOs = NULL;
      std::ofstream trbr_ofs;

      if (NULL != pInFile) {
          ifs.open (pInFile, std::ios::in);
          FAAssertStream (&ifs, pInFile);
          pIs = &ifs;
      }
      if (NULL != pOutFile) {
          ofs.open (pOutFile, std::ios::out);
          pOs = &ofs;
      }
      if (NULL != pTrBrFile) {
          trbr_ofs.open (pTrBrFile, std::ios::out);
          pTrBrOs = &trbr_ofs;
      }

      DebugLogAssert (pIs);
      DebugLogAssert (pOs);

      // create all possible automata
      FARSNfa_ar_judy rs_nfa (&g_alloc);
      FARSNfa_wo_ro rs_nfa_wo_ro (&g_alloc);
      FARSDfa_ro rs_dfa (&g_alloc);
      FARSDfa_ro moore_dfa (&g_alloc);
      FAState2Ow moore_ows (&g_alloc);
      FARSDfa_ro moore_mdfa_dfa (&g_alloc);
      FAState2Ows moore_mdfa_ows (&g_alloc);
      FAMealyNfa mealy_nfa_ows (&g_alloc);

      // read in specified automaton
      if (0 == strcmp (pInType, "rs-nfa")) {
        g_io.Read (*pIs, &rs_nfa);
      } else if (0 == strcmp (pInType, "rs-dfa")) {
        g_io.Read (*pIs, &rs_dfa);
      } else if (0 == strcmp (pInType, "moore-dfa")) {
        g_io.Read (*pIs, &moore_dfa, &moore_ows);
      } else if (0 == strcmp (pInType, "moore-mdfa")) {
        g_io.Read (*pIs, &moore_mdfa_dfa, &moore_mdfa_ows);
      }

      // make convertions
      const FARSNfaA * pOutNfa = NULL;
      const FARSDfaA * pOutDfa = NULL;
      const FAState2OwA * pState2Ow = NULL;
      const FAState2OwsA * pState2Ows = NULL;
      const FAMealyNfaA * pMealyOws = NULL;

      if (0 == strcmp (pInType, "rs-nfa") && 
          0 == strcmp (pOutType, "rs-nfa")) {

          pOutNfa = &rs_nfa;

      } else if (0 == strcmp (pInType, "rs-dfa") && 
                 0 == strcmp (pOutType, "rs-dfa")) {

          pOutDfa = &rs_dfa;

      } else if (0 == strcmp (pInType, "moore-dfa") && 
                 0 == strcmp (pOutType, "moore-dfa")) {

          pOutDfa = &moore_dfa;
          pState2Ow = &moore_ows;

      } else if (0 == strcmp (pInType, "moore-mdfa") && 
                 0 == strcmp (pOutType, "moore-mdfa")) {

          pOutDfa = &moore_mdfa_dfa;
          pState2Ows = &moore_mdfa_ows;

      } else if (0 == strcmp (pInType, "rs-dfa") && 
                 0 == strcmp (pOutType, "moore-dfa")) {

          FARSDfa2MooreDfa rs2moore (&g_alloc);

          rs2moore.SetRSDfa (&rs_dfa);
          rs2moore.SetMooreDfa (&moore_dfa);
          rs2moore.SetState2Ow (&moore_ows);
          rs2moore.SetOwsRange (g_OwBase, g_OwMax);
          rs2moore.SetKeepOws (g_keep_ows);

          rs2moore.Process ();

          pOutDfa = &moore_dfa;
          pState2Ow = &moore_ows;

      } else if (0 == strcmp (pInType, "rs-dfa") && 
                 0 == strcmp (pOutType, "moore-mdfa")) {

          FARSDfa2MooreDfa rs2moore (&g_alloc);

          rs2moore.SetRSDfa (&rs_dfa);
          rs2moore.SetMooreDfa (&moore_mdfa_dfa);
          rs2moore.SetState2Ows (&moore_mdfa_ows);
          rs2moore.SetOwsRange (g_OwBase, g_OwMax);
          rs2moore.SetKeepOws (g_keep_ows);

          rs2moore.Process ();

          pOutDfa = &moore_mdfa_dfa;
          pState2Ows = &moore_mdfa_ows;

      } else if (0 == strcmp (pInType, "rs-dfa") && 
                 0 == strcmp (pOutType, "mealy-nfa")) {

          FADfa2MealyNfa dfa2mealy (&g_alloc);

          dfa2mealy.SetInDfa (&rs_dfa);
          dfa2mealy.SetOutNfa (&rs_nfa_wo_ro, &mealy_nfa_ows);

          dfa2mealy.Process ();

          pOutNfa = &rs_nfa_wo_ro;
          pMealyOws = &mealy_nfa_ows;

      } else if (0 == strcmp (pInType, "rs-nfa") && 
                 0 == strcmp (pOutType, "mealy-nfa")) {

          FATrBrNfa2MealyNfa nfa2mealy (&g_alloc);

          nfa2mealy.SetEpsilonIw (FAFsmConst::IW_EPSILON);
          nfa2mealy.SetInNfa (&rs_nfa);
          nfa2mealy.SetOutNfa (&rs_nfa, &mealy_nfa_ows);
          nfa2mealy.SetTrBrBaseIw (g_OwBase);
          nfa2mealy.SetTrBrMaxIw (g_OwMax);

          nfa2mealy.Process ();

          pOutNfa = &rs_nfa;
          pMealyOws = &mealy_nfa_ows;

          if (pTrBrOs) {

            const FAMultiMapA * pOw2TrBrs = nfa2mealy.GetOw2TrBrMap ();

            if (!::FAIsEmpty (pOw2TrBrs)) {
                g_map_io.Print (*pTrBrOs, pOw2TrBrs);
            }
          }

      } else {

          std::cerr << "ERROR: \"Unsupported convertion type\""
                    << " in program " << __PROG__ << '\n';
          return 1;
      }

      // write down specified automaton
      if (0 == strcmp (pOutType, "rs-nfa")) {
        g_io.Print (*pOs, pOutNfa);
      } else if (0 == strcmp (pOutType, "rs-dfa")) {
        g_io.Print (*pOs, pOutDfa);
      } else if (0 == strcmp (pOutType, "moore-dfa")) {
        g_io.Print (*pOs, pOutDfa, pState2Ow);
      } else if (0 == strcmp (pOutType, "moore-mdfa")) {
        g_io.Print (*pOs, pOutDfa, pState2Ows);
      } else if (0 == strcmp (pOutType, "mealy-nfa")) {
        g_io.Print (*pOs, pOutNfa, pMealyOws);
      }

    } catch (const FAException & e) {

        const char * const pErrMsg = e.GetErrMsg ();
        const char * const pFile = e.GetSourceName ();
        const int Line = e.GetSourceLine ();

        std::cerr << "ERROR: " << pErrMsg << " in " << pFile \
            << " at line " << Line << " in program " << __PROG__ << '\n';

        return 2;

    } catch (...) {

        std::cerr << "ERROR: Unknown error in program " << __PROG__ << '\n';
        return 1;
    }

    return 0;
}