static CMap * invert_cmap (CMap *cmap, unsigned char *used_slot) { CMap *icmap; unsigned char *codestr; unsigned char range_min[2] = {0x00, 0x00}; /* CID */ unsigned char range_max[2] = {0xff, 0xfe}; /* CID */ cmap = flatten_cmap(cmap); ASSERT(cmap); icmap = CMap_new(); CMap_set_type(icmap, CMAP_TYPE_CID_TO_CODE); CMap_add_codespacerange(icmap, range_min, range_max, 2); if (cmap->mapTbl) { codestr = NEW(cmap->profile.maxBytesIn, unsigned char); memset(codestr, 0, cmap->profile.maxBytesIn); add_inverse_map(icmap, cmap->mapTbl, codestr, 0, used_slot); /* top node */ RELEASE(codestr); }
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 = texpdf_CMap_cache_find(pst_data_ptr(tok1)); if (id < 0) status = -1; else { ucmap = texpdf_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); }