Exemplo n.º 1
0
static int
do_cidsysteminfo (CMap *cmap, ifreader *input)
{
  pst_obj   *tok1, *tok2;
  CIDSysInfo csi = {NULL, NULL, -1};
  int        simpledict = 0;
  int        error = 0;

  ifreader_need(input, TOKEN_LEN_MAX*2);
  /*
   * Assuming /CIDSystemInfo 3 dict dup begin .... end def
   * or /CIDSystemInfo << ... >> def
   */
  while ((tok1 = pst_get_token(&(input->cursor), input->endptr)) != NULL) {
    if (PST_MARKTYPE(tok1)) {
      simpledict = 1;
      pst_release_obj(tok1);
      break;
    } else if (MATCH_OP(tok1, "begin")) {
      simpledict = 0;
      pst_release_obj(tok1);
      break;
    } else {
      pst_release_obj(tok1);
      /* continue */
    }
  }
  tok1 = tok2 = NULL;
  while (!error &&
         (tok1 = pst_get_token(&(input->cursor), input->endptr)) != NULL) {
    if (MATCH_OP(tok1, ">>") && simpledict) {
      pst_release_obj(tok1);
      break;
    } else if (MATCH_OP(tok1, "end") && !simpledict) {
      pst_release_obj(tok1);
      break;
    } else if (MATCH_NAME(tok1, "Registry") &&
               (tok2 = pst_get_token(&(input->cursor), input->endptr)) != NULL) {
      if (!PST_STRINGTYPE(tok2))
        error = -1;
      else if (!simpledict &&
                check_next_token(input, "def"))
        error = -1;
      if (!error)
        csi.registry = (char *) pst_getSV(tok2);
    } else if (MATCH_NAME(tok1, "Ordering") &&
               (tok2 = pst_get_token(&(input->cursor), input->endptr)) != NULL) {
      if (!PST_STRINGTYPE(tok2))
        error = -1;
      else if (!simpledict &&
                check_next_token(input, "def"))
        error = -1;
      if (!error)
        csi.ordering = (char *) pst_getSV(tok2);
    } else if (MATCH_NAME(tok1, "Supplement") &&
               (tok2 = pst_get_token(&(input->cursor), input->endptr)) != NULL) {
      if (!PST_INTEGERTYPE(tok2))
        error = -1;
      else if (!simpledict &&
                check_next_token(input, "def"))
        error = -1;
      if (!error)
        csi.supplement = pst_getIV(tok2);
    }
    if (tok2)
      pst_release_obj(tok2);
    if (tok1)
      pst_release_obj(tok1);
    tok1 = tok2 = NULL;
  }
  if (!error &&
       check_next_token(input, "def"))
    error = -1;

  if (!error &&
       csi.registry && csi.ordering &&
       csi.supplement >= 0) {
    CMap_set_CIDSysInfo(cmap, &csi);
  }

  if (csi.registry)
    RELEASE(csi.registry);
  if (csi.ordering)
    RELEASE(csi.ordering);

  return  error;
}
Exemplo n.º 2
0
int
CMap_parse (CMap *cmap, FILE *fp)
{
  pst_obj  *tok1, *tok2;
  ifreader *input;
  int       status = 0, tmpint = -1;

  ASSERT(cmap && fp);

  input = ifreader_create(fp, file_size(fp), INPUT_BUF_SIZE-1);

  while (status >= 0) {
    tok1 = tok2 = NULL;
    ifreader_read(input, INPUT_BUF_SIZE/2);
    tok1 = pst_get_token(&(input->cursor), input->endptr);
    if (tok1 == NULL)
      break;
    else if (MATCH_NAME(tok1, "CMapName")) {
      if ((tok2 = pst_get_token(&(input->cursor), input->endptr)) == NULL ||
	  !(PST_NAMETYPE(tok2) || PST_STRINGTYPE(tok2)) ||
	  check_next_token(input, "def") < 0)
	status = -1;
      else
	CMap_set_name(cmap, pst_data_ptr(tok2));
    } else if (MATCH_NAME(tok1, "CMapType")) {
      if ((tok2 = pst_get_token(&(input->cursor), input->endptr)) == NULL ||
	  !PST_INTEGERTYPE(tok2) ||
	  check_next_token(input, "def") < 0)
	status = -1;
      else
	CMap_set_type(cmap, pst_getIV(tok2));
    } else if (MATCH_NAME(tok1, "WMode")) {
      if ((tok2 = pst_get_token(&(input->cursor), input->endptr)) == NULL ||
	  !PST_INTEGERTYPE(tok2) ||
	  check_next_token(input, "def") < 0)
	status = -1;
      else
	CMap_set_wmode(cmap, pst_getIV(tok2));
    } else if (MATCH_NAME(tok1, "CIDSystemInfo")) {
      status = do_cidsysteminfo(cmap, input);
    } else if (MATCH_NAME(tok1, "Version") ||
	       MATCH_NAME(tok1, "UIDOffset") ||
	       MATCH_NAME(tok1, "XUID")) {
	/* Ignore */
    } else if (PST_NAMETYPE(tok1)) {
      /* Possibly usecmap comes next */
      if ((tok2 = pst_get_token(&(input->cursor), input->endptr)) != NULL &&
	  MATCH_OP(tok2, "usecmap")) {
	int   id;
	CMap *ucmap;
	id = CMap_cache_find(pst_data_ptr(tok1));
	if (id < 0)
	  status = -1;
	else {
	  ucmap = CMap_cache_get(id);
	  CMap_set_usecmap(cmap, ucmap);
	}
      }
    } else if (MATCH_OP(tok1, "begincodespacerange")) {
      status = do_codespacerange(cmap, input, tmpint);
    } else if (MATCH_OP(tok1, "beginnotdefrange")) {
      status = do_notdefrange(cmap, input, tmpint);
    } else if (MATCH_OP(tok1, "beginnotdefchar")) {
      status = do_notdefchar(cmap, input, tmpint);
    } else if (MATCH_OP(tok1, "beginbfrange")) {
      status = do_bfrange(cmap, input, tmpint);
    } else if (MATCH_OP(tok1, "beginbfchar")) {
      status =  do_bfchar(cmap, input, tmpint);
    } else if (MATCH_OP(tok1, "begincidrange")) {
      status = do_cidrange(cmap, input, tmpint);
    } else if (MATCH_OP(tok1, "begincidchar")) {
      status =  do_cidchar(cmap, input, tmpint);
    } else if (PST_INTEGERTYPE(tok1)) {
      tmpint = pst_getIV(tok1);
    } /* else Simply ignore */
    if (tok1)
      pst_release_obj(tok1);
    if (tok2)
      pst_release_obj(tok2);
  }

  ifreader_destroy(input);

  return (status < 0) ? -1 : CMap_is_valid(cmap);
}