UnicodeString MessagePattern::autoQuoteApostropheDeep() const { if(!needsAutoQuoting) { return msg; } UnicodeString modified(msg); // Iterate backward so that the insertion indexes do not change. int32_t count=countParts(); for(int32_t i=count; i>0;) { const Part &part=getPart(--i); if(part.getType()==UMSGPAT_PART_TYPE_INSERT_CHAR) { modified.insert(part.index, (UChar)part.value); } } return modified; }
int Samurai::IO::Net::DNS::Name::split() { size_t len = size; char* last = name; for (size_t n = 0; n < len; n++) { if (name[n] == '.') { name[n] = 0; addPart(new Label((const char*) last, (uint8_t) strlen(last))); last = &name[n+1]; } } if (strlen(last)) addPart(new Label((const char*) last, (uint8_t) strlen(last))); return countParts(); }
bool MessageFormatter::processNamedTypes() { #ifdef HAS_MESSAGE_PATTERN auto formatter = formatterObj(); auto pat = MessageFormatAdapter::getMessagePattern(formatter); auto parts_count = pat.countParts(); // See MessageFormat::cacheExplicitFormats() /* * Looking through the pattern, go to each arg_start part type. * The arg-typeof that tells us the argument type (simple, complicated) * then the next part is either the arg_name or arg number * and then if it's simple after that there could be a part-type=arg-type * while substring will tell us number, spellout, etc. * If the next thing isn't an arg-type then assume string. * * The last two "parts" can at most be ARG_LIMIT and MSG_LIMIT * which we need not examine. */ clearError(); MessageFormatter::NamedPartsMap namedParts; MessageFormatter::NumericPartsMap numericParts; for (int32_t i = 0; i < parts_count - 2; i++) { auto p = pat.getPart(i); if (p.getType() != UMSGPAT_PART_TYPE_ARG_START) { continue; } auto name_part = pat.getPart(++i); icu::Formattable::Type type = icu::Formattable::kObject; switch (p.getArgType()) { case UMSGPAT_ARG_TYPE_SIMPLE: { auto type_part = pat.getPart(++i); if (type_part.getType() != UMSGPAT_PART_TYPE_ARG_TYPE) { setError(U_PARSE_ERROR, "Expected UMSGPAT_PART_TYPE_ARG_TYPE part following " "UMSGPAT_ARG_TYPE_SIMPLE part"); return false; } auto type_string = pat.getSubstring(type_part); if (type_string == "number") { type = icu::Formattable::kDouble; auto style_part = pat.getPart(i + 1); if (style_part.getType() == UMSGPAT_PART_TYPE_ARG_STYLE) { auto style_string = pat.getSubstring(style_part); if (style_string == "integer") { type = icu::Formattable::kInt64; } } } else if ((type_string == "date") || (type_string == "time")) { m_usesDate = true; type = icu::Formattable::kDate; } else if ((type_string == "spellout") || (type_string == "ordinal") || (type_string == "duration")) { type = icu::Formattable::kDouble; } break; } case UMSGPAT_ARG_TYPE_PLURAL: case UMSGPAT_ARG_TYPE_CHOICE: type = icu::Formattable::kDouble; break; case UMSGPAT_ARG_TYPE_NONE: case UMSGPAT_ARG_TYPE_SELECT: default: type = icu::Formattable::kString; break; } if (name_part.getType() == UMSGPAT_PART_TYPE_ARG_NAME) { auto argName = pat.getSubstring(name_part); auto it = namedParts.find(argName); if (it != namedParts.end()) { if (it->second != type) { setError(U_ARGUMENT_TYPE_MISMATCH, "Inconsistent types declared for an argument"); return false; } } else { namedParts[argName] = type; } } else if (name_part.getType() == UMSGPAT_PART_TYPE_ARG_NUMBER) { auto argNumber = name_part.getValue(); if (argNumber < 0) { setError(U_INVALID_FORMAT_ERROR, "Found part with negative number"); return false; } auto it = numericParts.find(argNumber); if (it != numericParts.end()) { if (it->second != type) { setError(U_ARGUMENT_TYPE_MISMATCH, "Inconsistent types declared for an argument"); return false; } } else { numericParts[argNumber] = type; } } else { setError(U_INVALID_FORMAT_ERROR, "Invalid part type encountered"); } } m_namedParts = namedParts; m_numericParts = numericParts; return true; #else return false; #endif }
bool Samurai::IO::Net::DNS::Name::isValid() { if (countParts() == 0) return false; return Samurai::IO::Net::DNS::Validator::isValidName((const char*) name, size); }
bool C3ds::load(std::string id, std::string file, float scale) { this->id = id; std::ifstream in; ChunkInfo info; int Offset, SubChunkSize, Value, MatDex, MeshDex, Loop, LOff; short Val; float fVal; bool CopyVal = false; MatDex = -1; MeshDex = -1; in.open(file.c_str(), std::ios::binary); if (in.fail()) return false; in.seekg(0, std::ios::end); fileSize = in.tellg(); in.seekg(0, std::ios::beg); if (data != NULL) delete data; data = new unsigned char[fileSize]; if (data == NULL) { in.close(); return false; } in.read((char*) data, fileSize); in.close(); Offset = 0; info = getChunkInfo(Offset); if (info.ID != 0x4D4D) return false; if (info.Size != fileSize) return false; countParts(fileSize); std::cout << "-- 3DS File has " << nMesh << " Meshes, only loading first --" << std::endl; Offset = 6; while (Offset < fileSize) { info = getChunkInfo(Offset); switch (info.ID) { case 0x0002: // Version memcpy(&Value, &data[Offset + 6], 4); //printf("Chunk 0002 (Version) - %d\nOffset %d\n",Value,info.Size); Offset += info.Size; break; case 0x0011: // RGB1 //printf("Chunk 0011 (RGB1) %d %d %d\nOffset %d\n",data[Offset+6],data[Offset+7],data[Offset+8],info.Size); if (CopyVal) { color = (glRGBA) {data[Offset+6],data[Offset+7],data[Offset+8]}; CopyVal = false; } Offset += info.Size; break; case 0x0012: // RGB2 //printf("Chunk 0012 (RGB2) %d %d %d\nOffset %d\n",data[Offset+6],data[Offset+7],data[Offset+8],info.Size); Offset += info.Size; break; case 0x0030: // Quantity value for parent chunks memcpy(&Val, &data[Offset + 6], 2); //printf("Chunk 0030 (Qty Value) %d\nOffset %d\n",Val,info.Size); Offset += info.Size; break; case 0x0100: // Config (Ignore) //printf("Chunk 0100 (Config)\nOffset %d\n",info.Size); Offset += info.Size; break; case 0x3D3D: // Start of Obj //printf("Chunk 3D3D (Start of Obj)\nOffset %d\n",info.Size); SubChunkSize = info.Size + Offset; // Set end limit for subchunk Offset += 6; break; case 0x3D3E: // Editor config (Ignore) //printf("Chunk 3D3E (Editor Config)\nOffset %d\n",info.Size); Offset += info.Size; break; case 0x4000: // Start of Mesh //printf("Chunk 4000 (Start of Mesh) - %s\nOffset %d\n",&data[Offset+6],info.Size); Offset += 6; while (data[Offset] != 0) // Seek end of string Offset++; Offset++; // One more to move past the NULL MeshDex++; if (MeshDex == 1) Offset = fileSize; break; case 0x4100: // Mesh data //printf("Chunk 4100 (Mesh Data)\nOffset %d\n",info.Size); Offset += 6; break; case 0x4110: // Vertex List memcpy(&Val, &data[Offset + 6], 2); //printf("Chunk 4110 (Vertex List) %d Vertices\nOffset %d\n",Val,info.Size); numVerts = Val; vertex = new FVector[Val + 1]; sphereRadius = 0; for (Loop = 0, LOff = Offset + 8; Loop != Val; ++Loop, LOff += 12) { memcpy(&(vertex[Loop].x), &data[LOff], 4); memcpy(&(vertex[Loop].y), &data[LOff + 4], 4); memcpy(&(vertex[Loop].z), &data[LOff + 8], 4); if (vertex[Loop].magnitude() > sphereRadius) sphereRadius = vertex[Loop].magnitude(); } Offset += info.Size; break; case 0x4111: // Vertex Options //printf("Chunk 4111 (Vertex Options)\nOffset %d\n",info.Size); Offset += info.Size; break; case 0x4120: // Face List memcpy(&Val, &data[Offset + 6], 2); //printf("Chunk 4120 (Face List) %d polys\nOffset %d\n",Val,info.Size); numFaces = Val; face = new Face[Val + 1]; for (Loop = 0, LOff = Offset + 8; Loop != Val; ++Loop, LOff += 8) { memcpy(&(face[Loop].p1), &data[LOff], 2); memcpy(&(face[Loop].p2), &data[LOff + 2], 2); memcpy(&(face[Loop].p3), &data[LOff + 4], 2); } Offset += info.Size; break; case 0x4130: // Material Desc Offset += info.Size; break; case 0x4140: // UV Map List memcpy(&Val, &data[Offset + 6], 2); //printf("Chunk 4120 (UV Map List)\nOffset %d\n",info.Size); numTexCoords = Val; texcoord = new UVTexCoord[Val + 1]; for (Loop = 0, LOff = Offset + 8; Loop != Val; ++Loop, LOff += 8) { memcpy(&(texcoord[Loop].u), &data[LOff], 4); memcpy(&(texcoord[Loop].v), &data[LOff + 4], 4); } Offset += info.Size; break; case 0xA000: // Material Name //printf("Chunk A000 (Material Name) - %s\nOffset %d\n",&data[Offset+6],info.Size); //texture=data[Offset+6]; //lstrcpy(Matl[MatDex].Name,(LPSTR)&data[Offset+6]); Offset += info.Size; break; case 0xA010: // Material - Ambient Color //printf("Chunk A010 (Material - Amb Col)\nOffset %d\n",info.Size); //memcpy(&Val,&data[Offset+6],2); ambientColor = (glRGBA) {data[Offset+6]/255.0f,data[Offset+7]/255.0f,data[Offset+8]/255.0f,data[Offset+9]/255.0f}; Offset += info.Size; break; case 0xA020: // Material - Diffuse Color //printf("Chunk A020 (Material - Dif Col)\nOffset %d\n",info.Size); CopyVal = true; diffuseColor = (glRGBA) {data[Offset+6]/255.0f,data[Offset+7]/255.0f,data[Offset+8]/255.0f,data[Offset+9]/255.0f}; Offset += info.Size; //Offset+=6;//Info.Size; break; case 0xA030: // Material - Spec Color specColor = (glRGBA) {data[Offset+6]/255.0f,data[Offset+7]/255.0f,data[Offset+8]/255.0f,data[Offset+9]/255.0f}; Offset += info.Size; //Offset+=6;//Info.Size; break; case 0xA040: // Material - Shininess //printf("Chunk A040 (Material - Shininess)\nOffset %d\n",info.Size); shininess = data[Offset + 6]; Offset += 6; //Info.Size; break; case 0xA041: // Material - Shine Strength //printf("Chunk A041 (Material - Shine Strength)\nOffset %d\n",info.Size); Offset += 6; //Info.Size; break; case 0xA050: // Material - Transparency //printf("Chunk A050 (Material - Transparency)\nOffset %d\n",info.Size); transparency = data[Offset + 6]; Offset += 6; //Info.Size; break; case 0xA100: // Material - Type (Flat,Gourad, Phong, Metal) memcpy(&Val, &data[Offset + 6], 2); //printf("Chunk A100 (Material Type) %d\nOffset %d\n",Val,info.Size); texSmooth = Val; Offset += info.Size; break; case 0xA200: // Material - Start of Texture Info //printf("Chunk A200 (Material Tex Map)\nOffset %d\n",info.Size); Offset += 6; break; case 0xA300: // Material - Texture Name //printf("Chunk A300 (Material Tex Map Name) %s\nOffset %d\n",&data[Offset+6],info.Size); texture = (char *) &data[Offset + 6]; Offset += info.Size; break; case 0xA351: // Material - Texture Options memcpy(&Val, &data[Offset + 6], 2); //printf("Chunk A351 (Material Tex Options) %d\nOffset %d\n",Val,info.Size); Offset += info.Size; break; case 0xA354: // Material - Texture U Scale memcpy(&fVal, &data[Offset + 6], 4); //printf("Chunk A354 (Material Tex U Scale) %f\nOffset %d\n",fVal,info.Size); TexCoordUScale = fVal; Offset += info.Size; break; case 0xA356: // Material - Texture V Scale memcpy(&fVal, &data[Offset + 6], 4); //printf("Chunk A356 (Material Tex V Scale) %f\nOffset %d\n",fVal,info.Size); TexCoordVScale = fVal; Offset += info.Size; break; case 0xA35A: // Material - Texture V Offset memcpy(&fVal, &data[Offset + 6], 4); //printf("Chunk A35A (Material Tex V Offset) %f\nOffset %d\n",fVal,info.Size); Offset += info.Size; break; case 0xA35C: // Material - Texture V Offset memcpy(&fVal, &data[Offset + 6], 4); //printf("Chunk A35C (Material Tex Rotation) %f\nOffset %d\n",fVal,info.Size); Offset += info.Size; break; case 0xAFFF: // Material Start //printf("Chunk AFFF (Start of Material)\nOffset %d\n",info.Size); MatDex++; Offset += 6; break; default: Offset += info.Size; break; } } std::string path = "resources/images/"; if (!TextureMgr::get().load(texture, path + texture)) { std::cerr << "[Could not load texture '" << texture << "', using none]" << std::endl; texture = ""; } if (TexCoordUScale <= 0.001f || TexCoordVScale <= 0.001f) { TexCoordUScale = 1.0f; TexCoordVScale = 1.0f; } /*for(int i=0;i<numTexCoords;i++) { texcoord[i].u*=TexCoordUScale; texcoord[i].v*=TexCoordVScale; }*/ calcNormals(); //drawelements buffer = new GLuint[4]; glGenBuffersARB(4, buffer); glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, buffer[0]); glBufferDataARB(GL_ELEMENT_ARRAY_BUFFER_ARB, (numFaces) * sizeof(Face), face, GL_STATIC_DRAW_ARB); //glEnableClientState(GL_VERTEX_ARRAY); glBindBufferARB(GL_ARRAY_BUFFER_ARB, buffer[1]); glBufferDataARB(GL_ARRAY_BUFFER_ARB, (numVerts * 3) * sizeof(float), vertex, GL_STATIC_DRAW_ARB); //glEnableClientState(GL_NORMAL_ARRAY); glBindBufferARB(GL_ARRAY_BUFFER_ARB, buffer[2]); glBufferDataARB(GL_ARRAY_BUFFER_ARB, (numVerts * 3) * sizeof(float), normal, GL_STATIC_DRAW_ARB); if (texcoord) { // glEnableClientState(GL_TEXTURE_COORD_ARRAY); glBindBufferARB(GL_ARRAY_BUFFER_ARB, buffer[3]); glBufferDataARB(GL_ARRAY_BUFFER_ARB, (numVerts * 2) * sizeof(float), texcoord, GL_STATIC_DRAW_ARB); } //replace when models have shininess shininess = 128; this->scale = scale; sphereRadius *= (scale * 2); return true; }