#ifdef USE_CHAR #define GETCHAR C = fmt.charAt(i); #else #define GETCHAR c = fmt.charCodeAt(i); #endif var tcache = {}; #define DRAIN(idx) if(start < idx) out.push(["L", fmt.substring(start, idx)]); function tokenize(fmt/*:string*/)/*:ParsedFmt*/ { if(tcache[fmt]) return tcache[fmt]; var out/*:ParsedFmt*/ = []; var start/*:number*/ = 0; #ifdef USE_REGEX var m/*:?Array*/; while((m = REGEX.exec(fmt))) { DRAIN(m.index) start = m.index + m[0].length; if(m[0] === "%%") out.push(["%","%"]); else out.push([m[6], m[0]||"", m[1]||"", m[2]||"", m[3]||"", m[4]||"", m[5]||""]); } #else /* NOT USE_REGEX */ var i/*:number*/ = 0; var infmt/*:boolean*/ = false; var fmtparam/*:string*/ = "", fmtflags/*:string*/ = "", fmtwidth/*:string*/ = "", fmtprec/*:string*/ = "", fmtlen/*:string*/ = ""; #if defined(USE_CHAR) var C/*:string*/ = '?'; #else /* USE_CODE */ var c/*:number*/ = 0; #endif /* USE_CHAR */ #if defined(USE_INDEX) while((i=fmt.indexOf("%", start)) != -1) { DRAIN(i) start = i++; infmt = true; while(infmt) { GETCHAR #ifdef USE_CHAR #include "12_switchchar.js" #else /* USE_CODE */ #include "11_switchcode.js" #endif /* USE_CHAR */ ++i; } } #elif defined(USE_LOOP) var L/*:number*/ = fmt.length; for(; i < L; ++i) { GETCHAR if(!infmt) { #ifdef USE_CHAR if(C !== "%") continue; #else /* USE_CODE */ if(c !== 37) continue; #endif /* USE_CHAR */ DRAIN(i) start = i; infmt = true; continue; } #ifdef USE_CHAR #include "12_switchchar.js" #else /* USE_CODE */ #include "11_switchcode.js" #endif /* USE_CHAR */ } #endif /* USE_INDEX / USE_LOOP */ #endif /* USE_REGEX */ if(start < fmt.length) out.push(["L", fmt.substring(start)]); return (tcache[fmt] = out); }