// main.cc
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
// Copyright 2005-2010 Google, Inc.
// Author: riley@google.com (Michael Riley)
// Modified: jpr@google.com (Jake Ratkiewicz) to not use new arc-dispatch
//
// \file
// Definitions and functions for invoking and using Far main
// functions that support multiple and extensible arc types.
#include <string>
#include <vector>
using std::vector;
#include <iostream>
#include <fstream>
#include <fst/extensions/far/main.h>
namespace fst {
// Return the 'FarType' value corresponding to a far type name.
FarType FarTypeFromString(const string &str) {
FarType type = FAR_DEFAULT;
if (str == "stlist")
type = FAR_STLIST;
else if (str == "sttable")
type = FAR_STTABLE;
else if (str == "default")
type = FAR_DEFAULT;
return type;
}
// Return the textual name corresponding to a 'FarType;.
string FarTypeToString(FarType type) {
switch (type) {
case FAR_STLIST:
return "stlist";
case FAR_STTABLE:
return "sttable";
case FAR_DEFAULT:
return "default";
default:
return "<unknown>";
}
}
FarEntryType StringToFarEntryType(const string &s) {
if (s == "line") {
return FET_LINE;
} else if (s == "file") {
return FET_FILE;
} else {
FSTERROR() << "Unknown FAR entry type: " << s;
return FET_LINE; // compiler requires return
}
}
FarTokenType StringToFarTokenType(const string &s) {
if (s == "symbol") {
return FTT_SYMBOL;
} else if (s == "byte") {
return FTT_BYTE;
} else if (s == "utf8") {
return FTT_UTF8;
} else {
FSTERROR() << "Unknown FAR entry type: " << s;
return FTT_SYMBOL; // compiler requires return
}
}
string LoadArcTypeFromFar(const string &far_fname) {
FarHeader hdr;
if (far_fname.empty()) {
LOG(ERROR) << "Reading FAR from standard in not supported";
return "";
}
if (!hdr.Read(far_fname)) {
LOG(ERROR) << "Error reading FAR: " << far_fname;
return "";
}
string atype = hdr.ArcType();
if (atype == "unknown") {
LOG(ERROR) << "Empty FST archive: " << far_fname;
return "";
}
return atype;
}
string LoadArcTypeFromFst(const string &fst_fname) {
FstHeader hdr;
ifstream in(fst_fname.c_str(), ifstream::in | ifstream::binary);
if (!hdr.Read(in, fst_fname)) {
LOG(ERROR) << "Error reading FST: " << fst_fname;
return "";
}
return hdr.ArcType();
}
} // namespace fst