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; }
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); }