static void createcat (lua_State *L, const char *catname, int (catf) (int)) { TTree *t = newcharset(L); int i; for (i = 0; i <= UCHAR_MAX; i++) if (catf(i)) setchar(treebuffer(t), i); lua_setfield(L, -2, catname); }
//-------------------------------------------------------------- NS_IMETHODIMP nsMyObserver::Notify( const char* aCharset, nsDetectionConfident aConf) { nsresult rv = NS_OK; if(mWeakRefParser) { nsCAutoString existingCharset; PRInt32 existingSource; mWeakRefParser->GetDocumentCharset(existingCharset, existingSource); if (existingSource >= kCharsetFromAutoDetection) return NS_OK; } if(!mCharset.Equals(aCharset)) { if(mNotifyByReload) { rv = mWebShellSvc->SetRendering( PR_FALSE); rv = mWebShellSvc->StopDocumentLoad(); rv = mWebShellSvc->ReloadDocument(aCharset, kCharsetFromAutoDetection); } else { nsDependentCString newcharset(aCharset); if (mWeakRefParser) { mWeakRefParser->SetDocumentCharset(newcharset, kCharsetFromAutoDetection); nsCOMPtr<nsIContentSink> contentSink = mWeakRefParser->GetContentSink(); if (contentSink) contentSink->SetDocumentCharset(newcharset); } if(mWeakRefDocument) mWeakRefDocument->SetDocumentCharacterSet(newcharset); } } return NS_OK; }
static int lp_set (lua_State *L) { size_t l; const char *s = luaL_checklstring(L, 1, &l); TTree *tree = newcharset(L); while (l--) { setchar(treebuffer(tree), (byte)(*s)); s++; } return 1; }
static int lp_range (lua_State *L) { int arg; int top = lua_gettop(L); TTree *tree = newcharset(L); for (arg = 1; arg <= top; arg++) { int c; size_t l; const char *r = luaL_checklstring(L, arg, &l); luaL_argcheck(L, l == 2, arg, "range must have two characters"); for (c = (byte)r[0]; c <= (byte)r[1]; c++) setchar(treebuffer(tree), c); } return 1; }
/* ** choice operator; optimizations: ** charset / charset => charset ** true / x => true, x / false => x, false / x => x ** (x / true is not equivalent to true) */ static int lp_choice (lua_State *L) { Charset st1, st2; TTree *t1 = getpatt(L, 1, NULL); TTree *t2 = getpatt(L, 2, NULL); if (tocharset(t1, &st1) && tocharset(t2, &st2)) { TTree *t = newcharset(L); loopset(i, treebuffer(t)[i] = st1.cs[i] | st2.cs[i]); } else if (nofail(t1) || t2->tag == TFalse) lua_pushvalue(L, 1); /* true / x => true, x / false => x */ else if (t1->tag == TFalse) lua_pushvalue(L, 2); /* false / x => x */ else newroot2sib(L, TChoice); return 1; }
/* ** [t1 - t2] == Seq (Not t2) t1 ** If t1 and t2 are charsets, make their difference. */ static int lp_sub (lua_State *L) { Charset st1, st2; int s1, s2; TTree *t1 = getpatt(L, 1, &s1); TTree *t2 = getpatt(L, 2, &s2); if (tocharset(t1, &st1) && tocharset(t2, &st2)) { TTree *t = newcharset(L); loopset(i, treebuffer(t)[i] = st1.cs[i] & ~st2.cs[i]); } else { TTree *tree = newtree(L, 2 + s1 + s2); tree->tag = TSeq; /* sequence of... */ tree->u.ps = 2 + s2; sib1(tree)->tag = TNot; /* ...not... */ memcpy(sib1(sib1(tree)), t2, s2 * sizeof(TTree)); /* ...t2 */ memcpy(sib2(tree), t1, s1 * sizeof(TTree)); /* ... and t1 */ joinktables(L, 1, sib1(tree), 2); } return 1; }