137 lines · c
1/*2 * Copyright 2017 Sven Verdoolaege3 *4 * Use of this software is governed by the MIT license5 *6 * Written by Sven Verdoolaege.7 */8 9#include <stdlib.h>10 11#include <isl/arg.h>12#include <isl/options.h>13#include <isl/union_map.h>14#include <isl/stream.h>15 16struct options {17 struct isl_options *isl;18 char *flow1;19 char *flow2;20};21 22ISL_ARGS_START(struct options, options_args)23ISL_ARG_CHILD(struct options, isl, "isl", &isl_options_args, "isl options")24ISL_ARG_ARG(struct options, flow1, "flow1", NULL)25ISL_ARG_ARG(struct options, flow2, "flow2", NULL)26ISL_ARGS_END27 28ISL_ARG_DEF(options, struct options, options_args)29 30static void die(const char *msg)31{32 fprintf(stderr, "%s\n", msg);33 exit(EXIT_FAILURE);34}35 36static FILE *open_or_die(const char *filename)37{38 FILE *file;39 40 file = fopen(filename, "r");41 if (!file) {42 fprintf(stderr, "Unable to open %s\n", filename);43 exit(EXIT_FAILURE);44 }45 return file;46}47 48#undef BASE49#define BASE union_map50#include "read_in_string_templ.c"51 52/* Given two YAML descriptions of isl_union_flow objects, check whether53 * they are equivalent.54 * Return EXIT_SUCCESS if they are and EXIT_FAILURE if they are not55 * or if anything else went wrong.56 *57 * The descriptions are checked field by field, meaning that the fields58 * are expected to appear in the same order in both inputs.59 */60int main(int argc, char **argv)61{62 isl_bool more;63 isl_ctx *ctx;64 struct options *options;65 FILE *input1, *input2;66 isl_stream *s1, *s2;67 68 options = options_new_with_defaults();69 if (!options)70 return EXIT_FAILURE;71 72 ctx = isl_ctx_alloc_with_options(&options_args, options);73 argc = options_parse(options, argc, argv, ISL_ARG_ALL);74 75 input1 = open_or_die(options->flow1);76 input2 = open_or_die(options->flow2);77 s1 = isl_stream_new_file(ctx, input1);78 s2 = isl_stream_new_file(ctx, input2);79 80 if (isl_stream_yaml_read_start_mapping(s1) < 0)81 isl_die(ctx, isl_error_unknown, "arg1 not a YAML mapping",82 return EXIT_FAILURE);83 if (isl_stream_yaml_read_start_mapping(s2) < 0)84 isl_die(ctx, isl_error_unknown, "arg2 not a YAML mapping",85 return EXIT_FAILURE);86 87 while ((more = isl_stream_yaml_next(s1)) == isl_bool_true) {88 isl_bool more2;89 isl_bool equal;90 isl_union_map *umap1, *umap2;91 92 more2 = isl_stream_yaml_next(s2);93 if (more2 < 0)94 return EXIT_FAILURE;95 if (!more2)96 isl_die(ctx, isl_error_unknown, "arg2 shorter",97 return EXIT_FAILURE);98 if (isl_stream_eat(s1, ISL_TOKEN_IDENT) < 0)99 return EXIT_FAILURE;100 if (isl_stream_eat(s2, ISL_TOKEN_IDENT) < 0)101 return EXIT_FAILURE;102 more = isl_stream_yaml_next(s1);103 more2 = isl_stream_yaml_next(s2);104 if (more < 0 || more2 < 0)105 return EXIT_FAILURE;106 if (!more || !more2)107 isl_die(ctx, isl_error_unknown, "missing value",108 return EXIT_FAILURE);109 110 umap1 = read_union_map(s1);111 umap2 = read_union_map(s2);112 equal = isl_union_map_is_equal(umap1, umap2);113 isl_union_map_free(umap1);114 isl_union_map_free(umap2);115 if (equal < 0)116 return EXIT_FAILURE;117 if (!equal)118 die("field not equal");119 }120 if (more < 0)121 return EXIT_FAILURE;122 123 124 if (isl_stream_yaml_read_end_mapping(s1) < 0)125 return EXIT_FAILURE;126 if (isl_stream_yaml_read_end_mapping(s2) < 0)127 return EXIT_FAILURE;128 129 isl_stream_free(s1);130 isl_stream_free(s2);131 fclose(input1);132 fclose(input2);133 isl_ctx_free(ctx);134 135 return EXIT_SUCCESS;136}137