CGnuPlotBinaryFormat::FmtData CGnuPlotBinaryFormat:: indexFormat(int i) const { if (i < 0 || formats_.empty()) return FmtData(); int i1 = (i % formats_.size()); return formats_[i1]; }
void CGnuPlotBinaryFormat:: addFormat(bool skip, int n, Format fmt) { formats_.push_back(FmtData(skip, n, fmt)); }
// // hwndGV - handle to GridView control // hRoot - root item-handle // type - node in the type-chain // dwOffset - current offset // // returns: size of type // size_w RecurseType(HWND hwndGV, HGRIDITEM hRoot, Type *type, size_w dwOffset, TypeDecl *typeDecl) { GVITEM gvitem = { 0 }; Structure *sptr; size_t i; TCHAR buf[200]; if(type == 0) return 0; size_w dwLength = 0; INUMTYPE switchVal = 0;//1; HWND hwndHV = GetActiveHexView(g_hwndMain); switch(type->ty) { case typeDOSTIME: case typeDOSDATE: case typeFILETIME: case typeTIMET: dwLength = FmtData(hwndGV, hRoot, type, dwOffset, typeDecl); break; case typeCHAR: case typeWCHAR: case typeBYTE: case typeWORD: case typeDWORD: case typeQWORD: case typeFLOAT: case typeDOUBLE: case typeENUM: dwLength = FmtData(hwndGV, hRoot, type, dwOffset, typeDecl); break; case typeUNION: // evaluate the switch_is() ExprNode *switchExpr; if(FindTag(typeDecl->tagList, TOK_SWITCHIS, &switchExpr)) { switchVal = Evaluate(switchExpr); } sptr = type->sptr; for(i = 0; i < sptr->typeDeclList.size(); i++) { TypeDecl *typeDecl = sptr->typeDeclList[i]; ExprNode *caseExpr; size_w tmpLen = 0; if(FindTag(typeDecl->tagList, TOK_CASE, &caseExpr)) { if(Evaluate(caseExpr) == switchVal) tmpLen = InsertTypeGV(hwndGV, hRoot, typeDecl, dwOffset); } else { tmpLen = InsertTypeGV(hwndGV, hRoot, typeDecl, dwOffset); } dwLength = max(dwLength, tmpLen); } break; case typeSTRUCT: sptr = type->sptr; for(i = 0; i < sptr->typeDeclList.size(); i++) { TypeDecl *typeDecl = sptr->typeDeclList[i]; dwLength += InsertTypeGV(hwndGV, hRoot, typeDecl, dwOffset + dwLength); } break; case typeIDENTIFIER: hRoot = InsertIdentifier(hwndGV, hRoot, type, dwOffset, typeDecl); dwLength = RecurseType(hwndGV, hRoot, type->link, dwOffset, typeDecl); break; #if 0 if(fShowFullType) { RenderType(buf, 200, type); gvitem.pszText = buf; } else { _stprintf(buf, TEXT("%hs"), type->sym->name); gvitem.pszText = buf;//type->sym->name; } gvitem.state = 0; if(type->link && type->link->ty != typeARRAY) gvitem.state |= GVIS_EXPANDED; gvitem.iImage = IsStruct(type) ? 1 : 0; if(typeDecl->tagList) gvitem.iImage+=2; gvitem.param = (ULONG_PTR)type;//typeDecl; gvitem.mask = GVIF_PARAM | GVIF_TEXT | GVIF_STATE | GVIF_IMAGE; GridView2_SetItem(hwndGV, hRoot, &gvitem); if(type->link && type->link->ty == typeARRAY) { FormatDataItem(hwndGV, hRoot, type, dwOffset); } if(IsStruct(type)) { gvitem.iSubItem = COLIDX_DATA; gvitem.state = GVIS_READONLY; gvitem.pszText = TEXT("{...}"); gvitem.param = 0; gvitem.mask = GVIF_PARAM | GVIF_TEXT | GVIF_STATE; GridView2_SetItem(hwndGV, hRoot, &gvitem); } if(!fShowFullType) { RenderType(buf, 200, type->link); //_stprintf(buf, TEXT("%hs"), type->sym->name); gvitem.iSubItem = 0;//COLIDX_TYPE; gvitem.state = GVIS_READONLY; gvitem.pszText = buf; gvitem.param = (UINT64)type; gvitem.mask = GVIF_PARAM | GVIF_TEXT | GVIF_STATE; GridView2_SetItem(hwndGV, hRoot, &gvitem); } dwLength = RecurseType(hwndGV, hRoot, type->link, dwOffset, typeDecl); break; #endif case typeTYPEDEF: case typeSIGNED: case typeUNSIGNED: case typeCONST: // return 0; case typePOINTER: dwLength = RecurseType(hwndGV, hRoot, type->link, dwOffset, typeDecl); break; case typeARRAY: Symbol *sym; ExprNode *nameExpr; if(FindTag(typeDecl->tagList, TOK_NAME, &nameExpr)) { if((sym = LookupSymbol(globalTagSymbolList, nameExpr->str)) != 0) { if(sym->type && sym->type->ty == typeENUM) ; else sym = 0; } } else { sym = 0; } UINT64 count; count = 0; Evaluate(GridView_GetParent(hwndGV, hRoot), type->elements, &count, dwOffset, hwndHV, hwndGV); count &= 0xffff; count = min(count,100); for(i = 0; i < count; i++) { HGRIDITEM hItem; TCHAR buf[164]; int len = _stprintf(buf, TEXT("[%d] "), (int)i); if(sym) { Enum *eptr = sym->type->eptr; char *s = 0; for(size_t x = 0; x < eptr->fieldList.size(); x++) { if(i == eptr->fieldList[x]->val) { s = eptr->fieldList[i]->name->name; } } _stprintf(buf + 5, TEXT("- %hs"), s); } gvitem.pszText = buf; gvitem.state = GVIS_READONLY; gvitem.iImage = 0;//rand() % 2; gvitem.param = (ULONG_PTR)type->link; gvitem.iSubItem = COLIDX_NAME; gvitem.mask = GVIF_STATE|GVIF_PARAM|GVIF_TEXT; hItem = GridView2_InsertUniqueChild(hwndGV, hRoot, &gvitem); // used to pass '0' as typeDecl??? why?? because this is an array element we // are recursing through!!!! dwLength += RecurseType(hwndGV, hItem, type->link, dwOffset + dwLength, 0);//typeDecl); } break; default: break; } // add the 'offset' column to all items if(hRoot) { _stprintf(buf, TEXT("%08x"), (DWORD)dwOffset); gvitem.pszText = buf; gvitem.iSubItem = COLIDX_OFFSET; gvitem.state = 0; gvitem.param = dwOffset; gvitem.mask = GVIF_TEXT | GVIF_STATE | GVIF_PARAM; GridView2_SetItem(hwndGV, hRoot, &gvitem); // add the 'comment' column item - only do this for items that aren't array elements if(typeDecl)// && type->ty != typeARRAY) { FILEREF *ref; ref = &typeDecl->postRef; buf[0] = '\0'; FormatWhitespace(ref, buf); gvitem.pszText = buf; gvitem.iSubItem = COLIDX_COMMENT; gvitem.state = 0; gvitem.mask = GVIF_TEXT | GVIF_STATE; GridView2_SetItem(hwndGV, hRoot, &gvitem); } } return dwLength; }
DWORD FmtData(TCHAR *buf, BYTE *HexData, TOKEN baseType, int displaySigned, int displayHex, int bigEndian) { return FmtData(buf, HexData, TokenToType(baseType), displaySigned ? true : false, displayHex ? true : false, bigEndian ? true : false); }