1 /* 2 * Copyright 2017 Sven Verdoolaege 3 * 4 * Use of this software is governed by the MIT license 5 * 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 16 struct options { 17 struct isl_options *isl; 18 char *flow1; 19 char *flow2; 20 }; 21 22 ISL_ARGS_START(struct options, options_args) 23 ISL_ARG_CHILD(struct options, isl, "isl", &isl_options_args, "isl options") 24 ISL_ARG_ARG(struct options, flow1, "flow1", NULL) 25 ISL_ARG_ARG(struct options, flow2, "flow2", NULL) 26 ISL_ARGS_END 27 28 ISL_ARG_DEF(options, struct options, options_args) 29 30 static void die(const char *msg) 31 { 32 fprintf(stderr, "%s\n", msg); 33 exit(EXIT_FAILURE); 34 } 35 36 static 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 BASE 49 #define BASE union_map 50 #include "read_in_string_templ.c" 51 52 /* Given two YAML descriptions of isl_union_flow objects, check whether 53 * they are equivalent. 54 * Return EXIT_SUCCESS if they are and EXIT_FAILURE if they are not 55 * or if anything else went wrong. 56 * 57 * The descriptions are checked field by field, meaning that the fields 58 * are expected to appear in the same order in both inputs. 59 */ 60 int 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