static void process_XER_data(enum expectation expectation, char *fbuf, size_t size) { PDU_t *st; st = load_object_from(expectation, fbuf, size, AS_XER); if(!st) return; /* Save and re-load as DER */ save_object_as(st, AS_DER); st = load_object_from(expectation, buf, buf_offset, AS_DER); assert(st); save_object_as(st, AS_XER); fprintf(stderr, "=== original ===\n"); fwrite(fbuf, 1, size, stderr); fprintf(stderr, "=== re-encoded ===\n"); fwrite(buf, 1, buf_offset, stderr); fprintf(stderr, "=== end ===\n"); switch(expectation) { case EXP_DIFFERENT: assert(!xer_encoding_equal(fbuf, size, buf, buf_offset)); break; case EXP_BROKEN: assert(!xer_encoding_equal(fbuf, size, buf, buf_offset)); break; case EXP_OK: assert(xer_encoding_equal(fbuf, size, buf, buf_offset)); break; } asn_DEF_PDU.free_struct(&asn_DEF_PDU, st, 0); }
static void process_XER_data(const char *fname, char *fbuf, int size) { PDU_t *st; st = load_object_from(fname, fbuf, size, AS_XER, 0); if(!st) return; /* Save and re-load as PER */ save_object_as(st, AS_PER); compare_with_data_out(fname, buf, buf_offset); st = load_object_from("buffer", buf, buf_offset, AS_PER, 0); assert(st); save_object_as(st, AS_XER); fprintf(stderr, "=== original ===\n"); fwrite(fbuf, 1, size, stderr); fprintf(stderr, "=== re-encoded ===\n"); fwrite(buf, 1, buf_offset, stderr); fprintf(stderr, "=== end ===\n"); if(fname[strlen(fname) - 4] == 'X') assert(!xer_encoding_equal(fbuf, size, buf, buf_offset)); else assert(xer_encoding_equal(fbuf, size, buf, buf_offset)); asn_DEF_PDU.free_struct(&asn_DEF_PDU, st, 0); }
static void process_XER_data(const char *fname, enum expectation expectation, char *fbuf, size_t size) { PDU_t *st; st = load_object_from(fname, expectation, fbuf, size, AS_XER); if(!st) return; /* Save and re-load as PER */ save_object_as(st, expectation, AS_PER); if(expectation == EXP_PER_NOCOMP) return; /* Already checked */ st = load_object_from("buffer", expectation, buf, buf_offset, AS_PER); assert(st); save_object_as(st, expectation, (expectation == EXP_CXER_EXACT || expectation == EXP_CXER_DIFF) ? AS_CXER : AS_XER); fprintf(stderr, "=== original ===\n"); fwrite(fbuf, 1, size, stderr); fprintf(stderr, "=== re-encoded ===\n"); fwrite(buf, 1, buf_offset, stderr); fprintf(stderr, "=== end ===\n"); switch(expectation) { case EXP_DIFFERENT: assert(!xer_encoding_equal(fbuf, size, buf, buf_offset)); break; case EXP_BROKEN: assert(!xer_encoding_equal(fbuf, size, buf, buf_offset)); break; case EXP_CXER_EXACT: buf[buf_offset++] = '\n'; assert(size == buf_offset); assert(memcmp(fbuf, buf, size) == 0); break; case EXP_CXER_DIFF: buf[buf_offset++] = '\n'; assert(size != buf_offset || memcmp(fbuf, buf, size)); break; case EXP_OK: case EXP_PER_NOCOMP: assert(xer_encoding_equal(fbuf, size, buf, buf_offset)); break; } asn_DEF_PDU.free_struct(&asn_DEF_PDU, st, 0); }
static void compare_with_data_out(const char *fname, void *datap, size_t size) { char *data = datap; char outName[256]; unsigned char fbuf[1024]; size_t rd; FILE *f; char lastChar; int mustfail, compare; sprintf(outName, "../data-126/%s", fname); strcpy(outName + strlen(outName) - 3, ".out"); fprintf(stderr, "Comparing PER output with [%s]\n", outName); lastChar = outName[strlen(outName)-5]; mustfail = lastChar == 'P'; compare = lastChar != 'C'; if((compare && !mustfail) && getenv("REGENERATE")) { f = fopen(outName, "w"); fwrite(data, 1, size, f); fclose(f); } else { f = fopen(outName, "r"); assert(f); rd = fread(fbuf, 1, sizeof(fbuf), f); assert(rd); fclose(f); fprintf(stderr, "Trying to decode [%s]\n", outName); load_object_from(outName, fbuf, rd, AS_PER, mustfail); if(mustfail) return; if(compare) { assert(rd == (size_t)size); assert(memcmp(fbuf, data, rd) == 0); fprintf(stderr, "XER->PER recoding .in->.out match.\n"); } else { assert(rd != (size_t)size || memcmp(fbuf, data, rd)); fprintf(stderr, "XER->PER recoding .in->.out diverge.\n"); } } }