static FRESULT create_name ( DIR *dj, /* Pointer to the directory object */ const char **path /* Pointer to pointer to the segment in the path string */ ) { BYTE c, d, ni, si, i, *sfn; const char *p; /* Create file name in directory form */ sfn = dj->fn; mem_set(sfn, ' ', 11); si = i = 0; ni = 8; p = *path; for (;;) { c = p[si++]; if (c <= ' ' || c == '/') break; /* Break on end of segment */ if (c == '.' || i >= ni) { if (ni != 8 || c != '.') break; i = 8; ni = 11; continue; } #ifdef _EXCVT if (c >= 0x80) /* To upper extended char (SBCS) */ c = cvt[c - 0x80]; #endif if (IsDBCS1(c) && i < ni - 1) { /* DBC 1st byte? */ d = p[si++]; /* Get 2nd byte */ sfn[i++] = c; sfn[i++] = d; } else { /* Single byte code */ if (IsLower(c)) c -= 0x20; /* toupper */ sfn[i++] = c; } } *path = &p[si]; /* Rerurn pointer to the next segment */ sfn[11] = (c <= ' ') ? 1 : 0; /* Set last segment flag if end of path */ return FR_OK; }
static int exec(FILE* fp, ENC_INFO* einfo) { #define NCOL 8 int c, val, enc; enc = einfo->num; fprintf(fp, "static const unsigned short Enc%s_CtypeTable[256] = {\n", einfo->name); for (c = 0; c < 256; c++) { val = 0; if (IsNewline(enc, c)) val |= BIT_CTYPE_NEWLINE; if (IsAlpha (enc, c)) val |= (BIT_CTYPE_ALPHA | BIT_CTYPE_ALNUM); if (IsBlank (enc, c)) val |= BIT_CTYPE_BLANK; if (IsCntrl (enc, c)) val |= BIT_CTYPE_CNTRL; if (IsDigit (enc, c)) val |= (BIT_CTYPE_DIGIT | BIT_CTYPE_ALNUM); if (IsGraph (enc, c)) val |= BIT_CTYPE_GRAPH; if (IsLower (enc, c)) val |= BIT_CTYPE_LOWER; if (IsPrint (enc, c)) val |= BIT_CTYPE_PRINT; if (IsPunct (enc, c)) val |= BIT_CTYPE_PUNCT; if (IsSpace (enc, c)) val |= BIT_CTYPE_SPACE; if (IsUpper (enc, c)) val |= BIT_CTYPE_UPPER; if (IsXDigit(enc, c)) val |= BIT_CTYPE_XDIGIT; if (IsWord (enc, c)) val |= BIT_CTYPE_WORD; if (IsAscii (enc, c)) val |= BIT_CTYPE_ASCII; if (c % NCOL == 0) fputs(" ", fp); fprintf(fp, "0x%04x", val); if (c != 255) fputs(",", fp); if (c != 0 && c % NCOL == (NCOL-1)) fputs("\n", fp); else fputs(" ", fp); } fprintf(fp, "};\n"); return 0; }
Painter& Painter::Path(CParser& p) { Pointf current(0, 0); while(!p.IsEof()) { int c = p.GetChar(); p.Spaces(); bool rel = IsLower(c); Pointf t, t1, t2; switch(ToUpper(c)) { case 'M': current = ReadPoint(p, current, rel); Move(current); case 'L': while(p.IsDouble2()) { current = ReadPoint(p, current, rel); Line(current); } break; case 'Z': Close(); break; case 'H': while(p.IsDouble2()) { current.x = p.ReadDouble() + rel * current.x; Line(current); } break; case 'V': while(p.IsDouble2()) { current.y = p.ReadDouble() + rel * current.y; Line(current); } break; case 'C': while(p.IsDouble2()) { t1 = ReadPoint(p, current, rel); t2 = ReadPoint(p, current, rel); current = ReadPoint(p, current, rel); Cubic(t1, t2, current); } break; case 'S': while(p.IsDouble2()) { t2 = ReadPoint(p, current, rel); current = ReadPoint(p, current, rel); Cubic(t2, current); } break; case 'Q': while(p.IsDouble2()) { t1 = ReadPoint(p, current, rel); current = ReadPoint(p, current, rel); Quadratic(t1, current); } break; case 'T': while(p.IsDouble2()) { current = ReadPoint(p, current, rel); Quadratic(current); } break; case 'A': while(p.IsDouble2()) { t1 = ReadPoint(p, Pointf(0, 0), false); double xangle = ReadDouble(p); bool large = ReadBool(p); bool sweep = ReadBool(p); current = ReadPoint(p, current, rel); SvgArc(t1, xangle * M_PI / 180.0, large, sweep, current); } break; default: return *this; } } return *this; }
uint16 str_to_hex_uint16(uint8 *str) { uint8 high_byte_high_4bits, high_byte_low_4bits, low_byte_high_4bits, low_byte_low_4bits; if(IsDigit(*str)) { high_byte_high_4bits = *str - '0'; } else if(IsLower(*str)) { high_byte_high_4bits = *str - 'a' + 10; } else // upper character { high_byte_high_4bits = *str - 'A' + 10; } str++; if(IsDigit(*str)) { high_byte_low_4bits = *str - '0'; } else if(IsLower(*str)) { high_byte_low_4bits = *str - 'a' + 10; } else // upper character { high_byte_low_4bits = *str - 'A' + 10; } str++; if(IsDigit(*str)) { low_byte_high_4bits = *str - '0'; } else if(IsLower(*str)) { low_byte_high_4bits = *str - 'a' + 10; } else // upper character { low_byte_high_4bits = *str - 'A' + 10; } str++; if(IsDigit(*str)) { low_byte_low_4bits = *str - '0'; } else if(IsLower(*str)) { low_byte_low_4bits = *str - 'a' + 10; } else // upper character { low_byte_low_4bits = *str - 'A' + 10; } return (((uint16)high_byte_high_4bits << 12) | ((uint16)high_byte_low_4bits << 8) | (low_byte_high_4bits << 4) | low_byte_low_4bits); }
bool IsLetter (Char c) { return IsLower(c) || IsUpper(c); }
static inline bool IsAlpha(char c) { return IsLower(c) || IsUpper(c); }
void ExhTestCPEngine::ExhTestProperties() { HRESULT hr; // REVIEW LarsH: how do we pass in the location of the UnicodeData.txt file as // a parameter? Env var? StrAnsi staDataFile = L"d:\\lars\\Unicode\\UnicodeData.txt"; FILE *pFileIn = fopen(staDataFile, "r"); if (!pFileIn) FailureFormat("Unable to open Unicode data file %s", staDataFile); CodePtData cpdCurrent, cpdNext; cpdNext.chCodeValue = -1; // uninitialized // TODO LarsH: We should test through 0x10FFFF, but currently there are // some problems with higher characters which have been postponed, // so in order to avoid a humungous error log we'll stick with the first page for now. // Raid #31 #define JUST_FIRST_PAGE #ifdef JUST_FIRST_PAGE for (int ch = 0; ch <= 0xFFFF; ch++) #else for (int ch = 0; ch <= 0x10FFFF; ch++) #endif { if (! (ch % 0x1000)) LogFormat("%x:\n", ch); // Read in the next record unless we've already got this data if (cpdNext.chCodeValue < ch) ParseRecord(pFileIn, &cpdNext); // This is NOT an "else"; it may happen in addition to the above. if (cpdNext.chCodeValue == ch) { // got the right record; copy it over cpdCurrent.chCodeValue = ch; strcpy(cpdCurrent.szCategory, cpdNext.szCategory); wcscpy(cpdCurrent.szwName, cpdNext.szwName); cpdCurrent.nNumericValue = cpdNext.nNumericValue; cpdCurrent.nCombiningClass = cpdNext.nCombiningClass; wcscpy(cpdCurrent.szwDecomposition, cpdNext.szwDecomposition); cpdCurrent.chUpper = cpdNext.chUpper; cpdCurrent.chLower = cpdNext.chLower; cpdCurrent.chTitle = cpdNext.chTitle; } // Treat special ranges specially: if (ch >= 0x3400 && ch <= 0x4db5 || ch >= 0x4e00 && ch <= 0x9fa5) { // CJK Ideographs (Extension A and other) // Most data is same as previous, so don't need to load; // but must set names algorithmically. swprintf(cpdCurrent.szwName, L"CJK UNIFIED IDEOGRAPH-%X", ch); } else if (ch >= 0xac00 && ch <= 0xd7a3) { // Hangul Syllables // Data for 0xAC00 is loaded, and applies to all others, except // name and decomp. HangulDecomposition(ch, cpdCurrent.szwDecomposition); HangulName(cpdCurrent.szwDecomposition, cpdCurrent.szwName); } else if (ch >= 0xd800 && // ch <= 0xdb7f || ch >= 0xdb80 && ch <= 0xdbff || // ch >= 0xdc00 && ch <= 0xdfff || ch >= 0xe000 ch <= 0xf8ff) { // Consecutive ranges: Non-Private Use High Surrogates, // Private Use High Surrogates, Low Surrogates, Private Use Area. // All of these are nameless (UnicodeData File Format v3.0.0) // TODO LarsH: change all this before closing Raid #24. cpdCurrent.szwName[0] = '\0'; } else if (ch == 0xfffe || ch == 0xffff || // explicitly "not Unicode chars" cpdNext.chCodeValue > ch || (cpdNext.chCodeValue < ch && feof(pFileIn))) { // Not assigned in the data file. cpdCurrent.chCodeValue = ch; cpdCurrent.szwName[0] = '\0'; strcpy(cpdCurrent.szCategory, "Cn"); cpdCurrent.nCombiningClass = 0; // Must distinguish between lack of a NumericValue and a zero NumericValue. cpdCurrent.nNumericValue = -1; cpdCurrent.szwDecomposition[0] = '\0'; // Zero is not an anycase equivalent of any character. cpdCurrent.chLower = cpdCurrent.chUpper = cpdCurrent.chTitle = ch; } // ** If looking for a character with a specific combination of properties, // ** you can test it here. This would be better done in SQL. // if (cpdCurrent.szCategory[0] != 'L' && cpdCurrent.chUpper > 0) // LogFormat("*** U+%x fulfills conditions\n"); // continue; // skip all the usual tests if desired // Make sure the property interface methods get the same data. LgGeneralCharCategory cc = ParseCC(cpdCurrent.szCategory); CheckCat(ch, cc); ComBool fLet, fPun, fNum, fSep, fSym, fMar, fOth, fAll; #define CheckBoolProp(prop, var, index, letter) \ { \ hr = m_qpropeng->get_##prop(ch, &var); \ WarnHr(hr); \ if (var != (cpdCurrent.szCategory[index] == letter)) \ FailureFormat("get_" #prop "(U+%x) gave wrong answer", ch); \ } CheckBoolProp(IsLetter, fLet, 0, 'L'); CheckBoolProp(IsPunctuation, fPun, 0, 'P'); CheckBoolProp(IsNumber, fNum, 0, 'N'); CheckBoolProp(IsSeparator, fSep, 0, 'Z'); CheckBoolProp(IsSymbol, fSym, 0, 'S'); CheckBoolProp(IsMark, fMar, 0, 'M'); CheckBoolProp(IsOther, fOth, 0, 'C'); // REVIEW LarsH: is int(ComBool) guaranteed to be 1 if true? I think so. int nCat; if ((nCat = fLet + fPun + fNum + fSep + fSym + fMar + fOth) != 1) FailureFormat("Codepoint U+%x is in %d categories instead of one.", ch, nCat); if (fLet) { ComBool fUpp, fLow, fTit, fMod, fOth; CheckBoolProp(IsUpper, fUpp, 1, 'u'); CheckBoolProp(IsLower, fLow, 1, 'l'); CheckBoolProp(IsTitle, fTit, 1, 't'); CheckBoolProp(IsModifier, fMod, 1, 'm'); CheckBoolProp(IsOtherLetter, fOth, 1, 'o'); if ((nCat = fUpp + fLow + fTit + fMod + fOth) != 1) FailureFormat("Letter U+%x is in %d subcategories instead of one.", ch, nCat); } else { // All should be false. CheckBoolProp(IsUpper, fAll, 0, 'L'); CheckBoolProp(IsLower, fAll, 0, 'L'); CheckBoolProp(IsTitle, fAll, 0, 'L'); CheckBoolProp(IsModifier, fAll, 0, 'L'); CheckBoolProp(IsOtherLetter, fAll, 0, 'L'); } if (fPun) { ComBool fOpe, fClo, fMed; CheckBoolProp(IsOpen, fOpe, 1, 's'); CheckBoolProp(IsClose, fOpe, 1, 'e'); CheckBoolProp(IsWordMedial, fOpe, 1, 'c'); // TODO LarsH: update this if definition in Language.idh changes, e.g. // if the above methods come to be true for Pd, Pi, Pf } else { CheckBoolProp(IsOpen, fAll, 0, 'P'); CheckBoolProp(IsClose, fAll, 0, 'P'); CheckBoolProp(IsWordMedial, fAll, 0, 'P'); } // IsControl should return true if category is Cc, false otherwise: CheckBoolProp(IsControl, fAll, 1, (cpdCurrent.szCategory[0] == 'C' ? 'c' : 0)); #undef CheckBoolProp #define IsLetter() (cpdCurrent.szCategory[0] == 'L') #define IsUpper() (cpdCurrent.szCategory[1] == 'u') #define IsLower() (cpdCurrent.szCategory[1] == 'l') #define IsTitle() (cpdCurrent.szCategory[1] == 't') // We must check IsLetter() etc. because the docs say, if it's not Lu/Ll/Tt, ToUpper() etc. // don't do case conversion, even if the Unicode database gives a conversion. int chUpper = -1, chLower = -1, chTitle = -1; // TODO LarsH: some of these should check different locales // if such data exists in SpecialCasing.txt hr = m_qpropeng->get_ToUpperCh(ch, &chUpper); if (FAILED(hr)) FailureFormat("get_ToUpperCh(0x%x) gave result %s", ch, AsciiHresult(hr)); int chUExp = (IsLetter() && (IsLower() || IsTitle()) && cpdCurrent.chUpper) ? cpdCurrent.chUpper : ch; if (chUpper != chUExp) { FailureFormat("get_ToUpperCh(0x%x {%s}) returned 0x%x instead of 0x%x", ch, cpdCurrent.szCategory, chUpper, chUExp); } hr = m_qpropeng->get_ToLowerCh(ch, &chLower); if (FAILED(hr)) FailureFormat("get_ToLowerCh(0x%x) gave result %s", ch, AsciiHresult(hr)); int chLExp = (IsLetter() && (IsUpper() || IsTitle()) && cpdCurrent.chLower) ? cpdCurrent.chLower : ch; if (chLower != chLExp) { FailureFormat("get_ToLowerCh(0x%x {%s}) returned 0x%x instead of 0x%x", ch, cpdCurrent.szCategory, chLower, chLExp); } hr = m_qpropeng->get_ToTitleCh(ch, &chTitle); if (FAILED(hr)) FailureFormat("get_ToTitleCh(0x%x) gave result %s", ch, AsciiHresult(hr)); #define FIXED_BUG_198 // just for now #ifdef FIXED_BUG_198 int chTExp = (IsLetter() && (IsUpper() || IsLower())) ? (cpdCurrent.chTitle ? cpdCurrent.chTitle : cpdCurrent.chUpper ? cpdCurrent.chUpper : ch) : ch; // ToTitleCh() returns the uppercase if there is no titlecase value defined if (chTitle != chTExp) { FailureFormat("get_ToTitleCh(0x%x {%s}) returned 0x%x instead of 0x%x", ch, cpdCurrent.szCategory, chTitle, chTExp); } #endif // FIXED_BUG_198 // TODO LarsH: test get_ToLower, etc. (BSTR functions) // These should take into account any special casing (SpecialCasing.txt), by testing // different locales (esp. Turkish) and contexts (FINAL/NON_FINAL, MODERN/NON_MODERN). wchar pwz[2]; pwz[0] = (wchar)ch; pwz[1] = '\0'; SmartBstr sbstrFrom(pwz), sbstrTo = L"fish"; // This one properly gives a warning if ch is half of a surrogate pair. if (ch >= 0xd800 && ch <= 0xdfff) // half a surrogate pair { IgnoreWarnings iw; hr = m_qpropeng->ToLower(sbstrFrom, &sbstrTo); TestFailZero(sbstrTo, "ToLower"); if (SUCCEEDED(hr)) FailureFormat("ToLower with 0x%x (half a surrogate pair) should have failed", ch); } else { hr = m_qpropeng->ToLower(sbstrFrom, &sbstrTo); TestFailZero(sbstrTo, "ToLower"); WarnHr(hr); // TODO LarsH: check that the return value from get_ToLower is correct // TODO LarsH: use smart bstrs where possible } // TODO LarsH: test get_ToLowerRgch, etc. (Rgch functions) // TODO LarsH: test IsUserDefinedClass(). Right now there is no way to define // classes, so this will always return false. ComBool fRet; hr = m_qpropeng->get_IsUserDefinedClass(ch, 'A', &fRet); WarnHr(hr); if (fRet) FailureFormat("Character U+%x is a member of class 'A'??", ch); // TODO LarsH: test SoundAlikeKey // REVIEW LarsH: is this bstr causing a memory leak on every iteration of ch? SmartBstr sbstr = L"foo"; // TODO LarsH: Remove this kludge once get_CharacterName(Hangul) is working. if (ch >= 0xac00 && ch <= 0xd7a3) goto skipHangul; hr = m_qpropeng->get_CharacterName(ch, &sbstr); TestFailZero(sbstr, "get_CharacterName"); if (FAILED(hr)) FailureFormat("get_CharacterName(U+%x) failed", ch); else if ( #ifndef FIXED_BUG_24 !(ch >= 0xd800 && ch <= 0xf8ff) && #endif wcscmp(cpdCurrent.szwName, sbstr)) { FailureFormat(L"get_CharacterName(U+%x) returned \"%s\" instead of \"%s\".", ch, sbstr, cpdCurrent.szwName); } // if (sbstr) // SysFreeString(sbstr); #ifdef FIXED_BUG_125 sbstr = L"foo"; hr = m_qpropeng->get_Decomposition(ch, &sbstr); TestFailZero(sbstr, "get_Decomposition"); if (FAILED(hr)) FailureFormat("get_Decomposition(U+%x) failed", ch); // REVIEW LarsH: Does wcscmp understand NULL sbstrs? Apparently... else if (sbstr ? wcscmp(cpdCurrent.szwDecomposition, sbstr) : cpdCurrent.szwDecomposition[0]) { FailureFormat("Got wrong decomposition for U+%x", ch); } // if (sbstr) // SysFreeString(bstr); #endif // FIXED_BUG_125 sbstr = NULL; // TODO LarsH: test DecompositionRgch // That will probably require a separate pass through the whole UnicodeData // file to build up a hash table or sthg... skipHangul: int nNumericValue; { IgnoreWarnings iw; hr = m_qpropeng->get_NumericValue(ch, &nNumericValue); } if (fNum && (cc == kccNd || cc == kccNl || cc == kccNo) && cpdCurrent.nNumericValue > -1) { if (FAILED(hr)) FailureFormat("get_NumericValue(U+%x) failed with hr=%s", ch, AsciiHresult(hr)); else if (nNumericValue != cpdCurrent.nNumericValue) { FailureFormat("get_NumericValue(U+%x) returned %d instead of %d", ch, nNumericValue, cpdCurrent.nNumericValue); } } else if (hr != E_UNEXPECTED) { FailureFormat("get_NumericValue(U+%x {%s}) gave result %s instead of E_UNEXPECTED", ch, cpdCurrent.szCategory, AsciiHresult(hr)); } #define FIXED_BUG_18 1 // Seems to be fixed now. #ifdef FIXED_BUG_18 int nCombClass; hr = m_qpropeng->get_CombiningClass(ch, &nCombClass); WarnHr(hr); if (nCombClass != cpdCurrent.nCombiningClass) { FailureFormat("get_CombiningClass(U+%x) gave %d instead of %d", ch, nCombClass, cpdCurrent.nCombiningClass); } #endif // TODO LarsH: test everything else // TODO LarsH: test get_Comment // TODO LarsH: test GetLineBreakProps if not obsolete // TODO LarsH: test GetLineBreakStatus if not obsolete } }
int CharFilterAlphaToLower(int c) { return IsAlpha(c) ? IsLower(c) ? c : ToLower(c) : 0; }
static std::list<PreserveStyleToken> InternalPreserveStyleTokenize(const string& strStr, size_t From, size_t Length) { FN_RETURN_TYPE(InternalPreserveStyleTokenize) Result; std::vector<bool> Seps(Length, false); for (size_t I = From+1; I+1 < From+Length; I++) { if (IsPreserveStyleTokenSeparator(strStr[I]) && !IsPreserveStyleTokenSeparator(strStr[I-1]) && !IsPreserveStyleTokenSeparator(strStr[I+1])) { Seps[I-From] = true; } } size_t L = From; for (size_t I = From+1; I < From+Length; I++) { if (Seps[I-From]) { PreserveStyleToken T; T.Token = strStr.substr(L, I-L); T.PrependChar = 0; if (L >= From + 1 && Seps[L-1-From]) T.PrependChar = strStr[L-1]; Result.emplace_back(T); L = I+1; I++; continue; } if (!Seps[I-From-1] && IsLower(strStr[I-1]) && IsUpper(strStr[I])) { PreserveStyleToken T; T.Token = strStr.substr(L, I-L); T.PrependChar = 0; if (L >= From + 1 && Seps[L-1-From]) T.PrependChar = strStr[L-1]; Result.emplace_back(T); L = I; } } if (L < From+Length) { PreserveStyleToken T; T.Token = strStr.substr(L, From+Length-L); T.PrependChar = 0; if (L >= From + 1 && Seps[L-1-From]) T.PrependChar = strStr[L-1]; Result.emplace_back(T); } if (Result.size() > 1) { wchar_t PrependChar = std::next(Result.cbegin())->PrependChar; FOR (const auto& i, make_range(std::next(Result.cbegin(), 2), Result.cend())) { if (PrependChar != i.PrependChar) { Result.clear(); PreserveStyleToken T; T.Token = strStr.substr(From, Length); T.PrependChar = 0; T.TypeMask = 1 << UNKNOWN; Result.emplace_back(T); return Result; } } }
int eval_lower(char c) { return (0 != IsLower(c)); }
int m_hash(struct Client *cptr, struct Client *sptr,int parc,char *parv[]) { register int l; register int i; register struct HashEntry* tab; struct HashEntry* table; struct tm* tmptr; int deepest = 0; int deeplink = 0; int showlist = 0; int tothits = 0; int mosthit = 0; int mosthits = 0; int used = 0; int used_now = 0; int totlink = 0; int size = U_MAX; char ch; int out = 0; int link_pop[10]; char result_buf[256]; char hash_log_file[256]; char timebuffer[MAX_DATE_STRING]; if (!MyClient(sptr) || !HasUmode(sptr,UMODE_DEBUG)) { sendto_one(sptr, form_str(ERR_NOPRIVILEGES), me.name, parv[0]); return 0; } if(parc > 1) { if(!irccmp(parv[1],"iphash")) { iphash_stats(cptr,sptr,parc,parv,-1); return 0; } else if(!irccmp(parv[1],"Diphash")) { tmptr = localtime(&CurrentTime); strftime(timebuffer, MAX_DATE_STRING, "%Y%m%d%H%M", tmptr); sprintf(hash_log_file, "%s.%s", hash_log_file_base, timebuffer); if ((out = open(hash_log_file, O_RDWR | O_APPEND | O_CREAT,0664))==-1) sendto_one(sptr, ":%s NOTICE %s :Problem opening %s", me.name, parv[0], hash_log_file); else sendto_one(sptr, ":%s NOTICE %s :Writing hash log to %s", me.name, parv[0], hash_log_file); iphash_stats(cptr,sptr,parc,parv,out); return 0; } ch = *parv[1]; if (IsLower(ch)) { table = clientTable; } else { table = channelTable; size = CH_MAX; } if (ch == 'L' || ch == 'l') { tmptr = localtime(&CurrentTime); strftime(timebuffer, MAX_DATE_STRING, "%Y%m%d%H%M", tmptr); sprintf(hash_log_file, "%s-%cdump.%s", hash_log_file_base, ch, timebuffer); showlist = 1; if ((out = open(hash_log_file, O_RDWR|O_APPEND|O_CREAT,0664))==-1) sendto_one(sptr, ":%s NOTICE %s :Problem opening %s ", me.name, parv[0], hash_log_file); else sendto_one(sptr, ":%s NOTICE %s :Writing hash log to %s ", me.name, parv[0], hash_log_file); } } else { ch = '\0'; table = clientTable; } for (i = 0; i < 10; i++) link_pop[i] = 0; for (i = 0; i < size; i++) { tab = &table[i]; l = tab->links; if (showlist) { /* sendto_one(sptr, "NOTICE %s :Hash Entry:%6d Hits:%7d Links:%6d", parv[0], i, tab->hits, l); */ if(out >= 0) { sprintf(result_buf,"Hash Entry:%6d Hits;%7d Links:%6d\n", i, tab->hits, l); write(out,result_buf,strlen(result_buf)); } } if (l > 0) { if (l < 10) link_pop[l]++; else link_pop[9]++; used_now++; totlink += l; if (l > deepest) { deepest = l; deeplink = i; } } else link_pop[0]++; l = tab->hits; if (l) { used++; tothits += l; if (l > mosthits) { mosthits = l; mosthit = i; } } } if(showlist && (out >= 0)) (void)close(out); switch((int)ch) { case 'V' : case 'v' : { register struct Client* acptr; int bad = 0, listlength = 0; for (acptr = GlobalClientList; acptr; acptr = acptr->next) { if (hash_find_client(acptr->name,acptr) != acptr) { if (ch == 'V') sendto_one(sptr, "NOTICE %s :Bad hash for %s", parv[0], acptr->name); bad++; } listlength++; } sendto_one(sptr,"NOTICE %s :List Length: %d Bad Hashes: %d", parv[0], listlength, bad); } case 'P' : case 'p' : for (i = 0; i < 10; i++) sendto_one(sptr,"NOTICE %s :Entires with %d links : %d", parv[0], i, link_pop[i]); return (0); case 'r' : { register struct Client *acptr; sendto_one(sptr,"NOTICE %s :Rehashing Client List.", parv[0]); clear_client_hash_table(); for (acptr = GlobalClientList; acptr; acptr = acptr->next) add_to_client_hash_table(acptr->name, acptr); break; } case 'R' : { register struct Channel *acptr; sendto_one(sptr,"NOTICE %s :Rehashing Channel List.", parv[0]); clear_channel_hash_table(); for (acptr = channel; acptr; acptr = acptr->nextch) (void)add_to_channel_hash_table(acptr->chname, acptr); break; } case 'H' : if (parc > 2) sendto_one(sptr,"NOTICE %s :%s hash to entry %d", parv[0], parv[2], hash_channel_name(parv[2])); return (0); case 'h' : if (parc > 2) sendto_one(sptr,"NOTICE %s :%s hash to entry %d", parv[0], parv[2], hash_nick_name(parv[2])); return (0); case 'n' : { struct Client *tmp; int max; if (parc <= 2) return (0); l = atoi(parv[2]) % U_MAX; if (parc > 3) max = atoi(parv[3]) % U_MAX; else max = l; for (;l <= max; l++) for (i = 0, tmp = (struct Client *)clientTable[l].list; tmp; i++, tmp = tmp->hnext) { if (parv[1][2] == '1' && tmp != tmp->from) continue; sendto_one(sptr,"NOTICE %s :Node: %d #%d %s", parv[0], l, i, tmp->name); } return (0); } case 'N' : { struct Channel *tmp; int max; if (parc <= 2) return (0); l = atoi(parv[2]) % CH_MAX; if (parc > 3) max = atoi(parv[3]) % CH_MAX; else max = l; for (;l <= max; l++) for (i = 0, tmp = (struct Channel*) channelTable[l].list; tmp; i++, tmp = tmp->hnextch) sendto_one(sptr,"NOTICE %s :Node: %d #%d %s", parv[0], l, i, tmp->chname); return (0); } #ifdef DEBUGMODE case 'S' : sendto_one(sptr,"NOTICE %s :Entries Hashed: %d NonEmpty: %d of %d", parv[0], totlink, used_now, size); if (!used_now) used_now = 1; sendto_one(sptr,"NOTICE %s :Hash Ratio (av. depth): %f %%Full: %f", parv[0], (float)((1.0 * totlink) / (1.0 * used_now)), (float)((1.0 * used_now) / (1.0 * size))); sendto_one(sptr,"NOTICE %s :Deepest Link: %d Links: %d", parv[0], deeplink, deepest); if (!used) used = 1; sendto_one(sptr,"NOTICE %s :Total Hits: %d Unhit: %d Av Hits: %f", parv[0], tothits, size-used, (float)((1.0 * tothits) / (1.0 * used))); sendto_one(sptr,"NOTICE %s :Entry Most Hit: %d Hits: %d", parv[0], mosthit, mosthits); sendto_one(sptr,"NOTICE %s :Client hits %d miss %d", parv[0], clhits, clmiss); sendto_one(sptr,"NOTICE %s :Channel hits %d miss %d", parv[0], chhits, chmiss); return 0; #endif } return 0; }