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;
}
示例#2
0
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();
}
示例#3
0
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
}
示例#4
0
bool Samurai::IO::Net::DNS::Name::isValid() {
	if (countParts() == 0) return false;
	return Samurai::IO::Net::DNS::Validator::isValidName((const char*) name, size);
}
示例#5
0
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;
}