use encoding_rs::{self, Encoding};
macro_rules! from_err {
($from:ty, $to:tt, $var:tt) => {
impl From<$from> for $to {
fn from(e: $from) -> $to {
$to::$var(e)
}
}
};
}
pub fn to_u32(s: &[u8]) -> &[u32] {
assert_eq!(s.len() % 4, 0);
unsafe { ::std::slice::from_raw_parts(s as *const [u8] as *const u32, s.len() / 4) }
}
pub fn read_slice<T>(s: &[u8]) -> T {
unsafe { ::std::ptr::read(&s[..::std::mem::size_of::<T>()] as *const [u8] as *const T) }
}
pub fn read_u32(s: &[u8]) -> u32 {
read_slice(s)
}
pub fn read_u16(s: &[u8]) -> u16 {
read_slice(s)
}
pub fn read_usize(s: &[u8]) -> usize {
read_u32(s) as usize
}
pub fn encoding_from_windows_code_page(cp: usize) -> Option<&'static Encoding> {
match cp {
65001 => Some(encoding_rs::UTF_8),
866 => Some(encoding_rs::IBM866),
28592 => Some(encoding_rs::ISO_8859_2),
28593 => Some(encoding_rs::ISO_8859_3),
28594 => Some(encoding_rs::ISO_8859_4),
28595 => Some(encoding_rs::ISO_8859_5),
28596 => Some(encoding_rs::ISO_8859_6),
28597 => Some(encoding_rs::ISO_8859_7),
28598 => Some(encoding_rs::ISO_8859_8),
28603 => Some(encoding_rs::ISO_8859_13),
28605 => Some(encoding_rs::ISO_8859_15),
20866 => Some(encoding_rs::KOI8_R),
21866 => Some(encoding_rs::KOI8_U),
10000 => Some(encoding_rs::MACINTOSH),
874 => Some(encoding_rs::WINDOWS_874),
1250 => Some(encoding_rs::WINDOWS_1250),
1251 => Some(encoding_rs::WINDOWS_1251),
1252 => Some(encoding_rs::WINDOWS_1252),
1253 => Some(encoding_rs::WINDOWS_1253),
1254 => Some(encoding_rs::WINDOWS_1254),
1255 => Some(encoding_rs::WINDOWS_1255),
1256 => Some(encoding_rs::WINDOWS_1256),
1257 => Some(encoding_rs::WINDOWS_1257),
1258 => Some(encoding_rs::WINDOWS_1258),
1259 | 10007 => Some(encoding_rs::X_MAC_CYRILLIC),
936 | 54936 => Some(encoding_rs::GB18030), 950 => Some(encoding_rs::BIG5),
20932 => Some(encoding_rs::EUC_JP),
50220 => Some(encoding_rs::ISO_2022_JP),
932 => Some(encoding_rs::SHIFT_JIS),
1201 => Some(encoding_rs::UTF_16BE),
1200 => Some(encoding_rs::UTF_16LE),
949 => Some(encoding_rs::EUC_KR),
21010 => Some(encoding_rs::UTF_16LE),
_ => None,
}
}
pub fn push_column(mut col: u32, buf: &mut String) {
if col < 26 {
buf.push((b'A' + col as u8) as char);
} else {
let mut rev = String::new();
while col >= 26 {
let c = col % 26;
rev.push((b'A' + c as u8) as char);
col -= c;
col /= 26;
}
buf.extend(rev.chars().rev());
}
}
pub const FTAB_LEN: usize = 485;
pub const FTAB: [&'static str; FTAB_LEN] = [
"COUNT",
"IF",
"ISNA",
"ISERROR",
"SUM",
"AVERAGE",
"MIN",
"MAX",
"ROW",
"COLUMN",
"NA",
"NPV",
"STDEV",
"DOLLAR",
"FIXED",
"SIN",
"COS",
"TAN",
"ATAN",
"PI",
"SQRT",
"EXP",
"LN",
"LOG10",
"ABS",
"INT",
"SIGN",
"ROUND",
"LOOKUP",
"INDEX",
"REPT",
"MID",
"LEN",
"VALUE",
"TRUE",
"FALSE",
"AND",
"OR",
"NOT",
"MOD",
"DCOUNT",
"DSUM",
"DAVERAGE",
"DMIN",
"DMAX",
"DSTDEV",
"VAR",
"DVAR",
"TEXT",
"LINEST",
"TREND",
"LOGEST",
"GROWTH",
"GOTO",
"HALT",
"RETURN",
"PV",
"FV",
"NPER",
"PMT",
"RATE",
"MIRR",
"IRR",
"RAND",
"MATCH",
"DATE",
"TIME",
"DAY",
"MONTH",
"YEAR",
"WEEKDAY",
"HOUR",
"MINUTE",
"SECOND",
"NOW",
"AREAS",
"ROWS",
"COLUMNS",
"OFFSET",
"ABSREF",
"RELREF",
"ARGUMENT",
"SEARCH",
"TRANSPOSE",
"ERROR",
"STEP",
"TYPE",
"ECHO",
"SET.NAME",
"CALLER",
"DEREF",
"WINDOWS",
"SERIES",
"DOCUMENTS",
"ACTIVE.CELL",
"SELECTION",
"RESULT",
"ATAN2",
"ASIN",
"ACOS",
"CHOOSE",
"HLOOKUP",
"VLOOKUP",
"LINKS",
"INPUT",
"ISREF",
"GET.FORMULA",
"GET.NAME",
"SET.VALUE",
"LOG",
"EXEC",
"CHAR",
"LOWER",
"UPPER",
"PROPER",
"LEFT",
"RIGHT",
"EXACT",
"TRIM",
"REPLACE",
"SUBSTITUTE",
"CODE",
"NAMES",
"DIRECTORY",
"FIND",
"CELL",
"ISERR",
"ISTEXT",
"ISNUMBER",
"ISBLANK",
"T",
"N",
"FOPEN",
"FCLOSE",
"FSIZE",
"FREADLN",
"FREAD",
"FWRITELN",
"FWRITE",
"FPOS",
"DATEVALUE",
"TIMEVALUE",
"SLN",
"SYD",
"DDB",
"GET.DEF",
"REFTEXT",
"TEXTREF",
"INDIRECT",
"REGISTER",
"CALL",
"ADD.BAR",
"ADD.MENU",
"ADD.COMMAND",
"ENABLE.COMMAND",
"CHECK.COMMAND",
"RENAME.COMMAND",
"SHOW.BAR",
"DELETE.MENU",
"DELETE.COMMAND",
"GET.CHART.ITEM",
"DIALOG.BOX",
"CLEAN",
"MDETERM",
"MINVERSE",
"MMULT",
"FILES",
"IPMT",
"PPMT",
"COUNTA",
"CANCEL.KEY",
"FOR",
"WHILE",
"BREAK",
"NEXT",
"INITIATE",
"REQUEST",
"POKE",
"EXECUTE",
"TERMINATE",
"RESTART",
"HELP",
"GET.BAR",
"PRODUCT",
"FACT",
"GET.CELL",
"GET.WORKSPACE",
"GET.WINDOW",
"GET.DOCUMENT",
"DPRODUCT",
"ISNONTEXT",
"GET.NOTE",
"NOTE",
"STDEVP",
"VARP",
"DSTDEVP",
"DVARP",
"TRUNC",
"ISLOGICAL",
"DCOUNTA",
"DELETE.BAR",
"UNREGISTER",
"",
"",
"USDOLLAR",
"FINDB",
"SEARCHB",
"REPLACEB",
"LEFTB",
"RIGHTB",
"MIDB",
"LENB",
"ROUNDUP",
"ROUNDDOWN",
"ASC",
"DBCS",
"RANK",
"",
"",
"ADDRESS",
"DAYS360",
"TODAY",
"VDB",
"ELSE",
"ELSE.IF",
"END.IF",
"FOR.CELL",
"MEDIAN",
"SUMPRODUCT",
"SINH",
"COSH",
"TANH",
"ASINH",
"ACOSH",
"ATANH",
"DGET",
"CREATE.OBJECT",
"VOLATILE",
"LAST.ERROR",
"CUSTOM.UNDO",
"CUSTOM.REPEAT",
"FORMULA.CONVERT",
"GET.LINK.INFO",
"TEXT.BOX",
"INFO",
"GROUP",
"GET.OBJECT",
"DB",
"PAUSE",
"",
"",
"RESUME",
"FREQUENCY",
"ADD.TOOLBAR",
"DELETE.TOOLBAR",
"User",
"RESET.TOOLBAR",
"EVALUATE",
"GET.TOOLBAR",
"GET.TOOL",
"SPELLING.CHECK",
"ERROR.TYPE",
"APP.TITLE",
"WINDOW.TITLE",
"SAVE.TOOLBAR",
"ENABLE.TOOL",
"PRESS.TOOL",
"REGISTER.ID",
"GET.WORKBOOK",
"AVEDEV",
"BETADIST",
"GAMMALN",
"BETAINV",
"BINOMDIST",
"CHIDIST",
"CHIINV",
"COMBIN",
"CONFIDENCE",
"CRITBINOM",
"EVEN",
"EXPONDIST",
"FDIST",
"FINV",
"FISHER",
"FISHERINV",
"FLOOR",
"GAMMADIST",
"GAMMAINV",
"CEILING",
"HYPGEOMDIST",
"LOGNORMDIST",
"LOGINV",
"NEGBINOMDIST",
"NORMDIST",
"NORMSDIST",
"NORMINV",
"NORMSINV",
"STANDARDIZE",
"ODD",
"PERMUT",
"POISSON",
"TDIST",
"WEIBULL",
"SUMXMY2",
"SUMX2MY2",
"SUMX2PY2",
"CHITEST",
"CORREL",
"COVAR",
"FORECAST",
"FTEST",
"INTERCEPT",
"PEARSON",
"RSQ",
"STEYX",
"SLOPE",
"TTEST",
"PROB",
"DEVSQ",
"GEOMEAN",
"HARMEAN",
"SUMSQ",
"KURT",
"SKEW",
"ZTEST",
"LARGE",
"SMALL",
"QUARTILE",
"PERCENTILE",
"PERCENTRANK",
"MODE",
"TRIMMEAN",
"TINV",
"",
"MOVIE.COMMAND",
"GET.MOVIE",
"CONCATENATE",
"POWER",
"PIVOT.ADD.DATA",
"GET.PIVOT.TABLE",
"GET.PIVOT.FIELD",
"GET.PIVOT.ITEM",
"RADIANS",
"DEGREES",
"SUBTOTAL",
"SUMIF",
"COUNTIF",
"COUNTBLANK",
"SCENARIO.GET",
"OPTIONS.LISTS.GET",
"ISPMT",
"DATEDIF",
"DATESTRING",
"NUMBERSTRING",
"ROMAN",
"OPEN.DIALOG",
"SAVE.DIALOG",
"VIEW.GET",
"GETPIVOTDATA",
"HYPERLINK",
"PHONETIC",
"AVERAGEA",
"MAXA",
"MINA",
"STDEVPA",
"VARPA",
"STDEVA",
"VARA",
"BAHTTEXT",
"THAIDAYOFWEEK",
"THAIDIGIT",
"THAIMONTHOFYEAR",
"THAINUMSOUND",
"THAINUMSTRING",
"THAISTRINGLENGTH",
"ISTHAIDIGIT",
"ROUNDBAHTDOWN",
"ROUNDBAHTUP",
"THAIYEAR",
"RTD",
"CUBEVALUE",
"CUBEMEMBER",
"CUBEMEMBERPROPERTY",
"CUBERANKEDMEMBER",
"HEX2BIN",
"HEX2DEC",
"HEX2OCT",
"DEC2BIN",
"DEC2HEX",
"DEC2OCT",
"OCT2BIN",
"OCT2HEX",
"OCT2DEC",
"BIN2DEC",
"BIN2OCT",
"BIN2HEX",
"IMSUB",
"IMDIV",
"IMPOWER",
"IMABS",
"IMSQRT",
"IMLN",
"IMLOG2",
"IMLOG10",
"IMSIN",
"IMCOS",
"IMEXP",
"IMARGUMENT",
"IMCONJUGATE",
"IMAGINARY",
"IMREAL",
"COMPLEX",
"IMSUM",
"IMPRODUCT",
"SERIESSUM",
"FACTDOUBLE",
"SQRTPI",
"QUOTIENT",
"DELTA",
"GESTEP",
"ISEVEN",
"ISODD",
"MROUND",
"ERF",
"ERFC",
"BESSELJ",
"BESSELK",
"BESSELY",
"BESSELI",
"XIRR",
"XNPV",
"PRICEMAT",
"YIELDMAT",
"INTRATE",
"RECEIVED",
"DISC",
"PRICEDISC",
"YIELDDISC",
"TBILLEQ",
"TBILLPRICE",
"TBILLYIELD",
"PRICE",
"YIELD",
"DOLLARDE",
"DOLLARFR",
"NOMINAL",
"EFFECT",
"CUMPRINC",
"CUMIPMT",
"EDATE",
"EOMONTH",
"YEARFRAC",
"COUPDAYBS",
"COUPDAYS",
"COUPDAYSNC",
"COUPNCD",
"COUPNUM",
"COUPPCD",
"DURATION",
"MDURATION",
"ODDLPRICE",
"ODDLYIELD",
"ODDFPRICE",
"ODDFYIELD",
"RANDBETWEEN",
"WEEKNUM",
"AMORDEGRC",
"AMORLINC",
"CONVERT",
"ACCRINT",
"ACCRINTM",
"WORKDAY",
"NETWORKDAYS",
"GCD",
"MULTINOMIAL",
"LCM",
"FVSCHEDULE",
"CUBEKPIMEMBER",
"CUBESET",
"CUBESETCOUNT",
"IFERROR",
"COUNTIFS",
"SUMIFS",
"AVERAGEIF",
"AVERAGEIFS",
];
pub const FTAB_ARGC: [u8; FTAB_LEN] = [
255, 3, 1, 1, 255, 255, 255, 255, 1, 1, 0, 254, 255, 2, 3, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 2, 3, 4, 2, 3, 1, 1, 0, 0, 255, 255, 1, 2, 3, 3, 3, 3, 3, 3, 255, 3, 2, 4, 4, 4, 4, 1, 1, 1, 5, 5, 5, 5, 6, 3, 2, 0, 3, 3, 3, 1, 1, 1, 2, 1, 1, 1, 0, 1, 1, 1, 5, 2, 2, 3, 3, 1, 2, 0, 1, 1, 2, 0, 1, 2, 2, 2, 0, 0, 1, 2, 1, 1, 255, 4, 4, 2, 7, 1, 1, 2, 2, 2, 4, 1, 1, 1, 1, 2, 2, 2, 1, 4, 4, 1, 3, 1, 3, 2, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 2, 2, 2, 2, 1, 1, 3, 4, 5, 3, 2, 2, 2, 255, 255, 1, 4, 5, 5, 5, 5, 1, 3, 4, 3, 1, 1, 1, 1, 1, 2, 6, 6, 255, 2, 4, 1, 0, 0, 2, 2, 3, 2, 1, 1, 1, 4, 255, 1, 2, 1, 2, 2, 3, 1, 3, 4, 255, 255, 3, 3, 2, 1, 3, 1, 1, 0, 0, 2, 3, 3, 4, 2, 2, 3, 3, 2, 2, 1, 1, 3, 0, 0, 5, 3, 0, 7, 0, 1, 0, 3, 255, 255, 1, 1, 1, 1, 1, 1, 3, 11, 1, 0, 2, 3, 5, 4, 4, 1, 0, 5, 5, 1, 0, 0, 1, 2, 2, 1, 255, 1, 1, 2, 3, 3, 1, 1, 1, 2, 3, 3, 3, 2, 255, 5, 1, 5, 4, 2, 2, 2, 3, 3, 1, 3, 3, 3, 1, 1, 2, 4, 3, 2, 4, 3, 3, 3, 4, 1, 3, 1, 3, 1, 2, 3, 3, 4, 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 4, 4, 255, 255, 255, 255, 255, 255, 3, 2, 2, 2, 2, 3, 255, 2, 2, 4, 4, 3, 255, 2, 9, 2, 3, 4, 1, 1, 255, 3, 2, 1, 2, 1, 4, 3, 1, 2, 2, 4, 5, 2, 128, 2, 1, 255, 255, 255, 255, 255, 255, 255, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 255, 255, 3, 3, 4, 2, 1, 2, 2, 2, 2, 2, 2, 1, 1, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 255, 255, 4, 1, 1, 2, 2, 2, 1, 1, 2, 2, 1, 2, 2, 2, 2, 3, 3, 6, 6, 5, 5, 5, 5, 5, 3, 3, 3, 7, 7, 2, 2, 2, 2, 6, 6, 2, 2, 3, 4, 4, 4, 4, 4, 4, 6, 6, 8, 8, 8, 8, 2, 2, 7, 7, 8, 8, 5, 3, 3, 255, 255, 255, 2, 4, 5, 1, 2, 128, 129, 3, 129, ];