| 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, format: "%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: filename, modes: "r" ); |
| 41 | if (!file) { |
| 42 | fprintf(stderr, format: "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(args: &options_args, opt: options); |
| 73 | argc = options_parse(opt: options, argc, argv, ISL_ARG_ALL); |
| 74 | |
| 75 | input1 = open_or_die(filename: options->flow1); |
| 76 | input2 = open_or_die(filename: options->flow2); |
| 77 | s1 = isl_stream_new_file(ctx, file: input1); |
| 78 | s2 = isl_stream_new_file(ctx, file: input2); |
| 79 | |
| 80 | if (isl_stream_yaml_read_start_mapping(s: 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(s: 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(s: 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(s: 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(s: s1, type: ISL_TOKEN_IDENT) < 0) |
| 99 | return EXIT_FAILURE; |
| 100 | if (isl_stream_eat(s: s2, type: ISL_TOKEN_IDENT) < 0) |
| 101 | return EXIT_FAILURE; |
| 102 | more = isl_stream_yaml_next(s: s1); |
| 103 | more2 = isl_stream_yaml_next(s: 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(s: s1); |
| 111 | umap2 = read_union_map(s: s2); |
| 112 | equal = isl_union_map_is_equal(umap1, umap2); |
| 113 | isl_union_map_free(umap: umap1); |
| 114 | isl_union_map_free(umap: umap2); |
| 115 | if (equal < 0) |
| 116 | return EXIT_FAILURE; |
| 117 | if (!equal) |
| 118 | die(msg: "field not equal" ); |
| 119 | } |
| 120 | if (more < 0) |
| 121 | return EXIT_FAILURE; |
| 122 | |
| 123 | |
| 124 | if (isl_stream_yaml_read_end_mapping(s: s1) < 0) |
| 125 | return EXIT_FAILURE; |
| 126 | if (isl_stream_yaml_read_end_mapping(s: s2) < 0) |
| 127 | return EXIT_FAILURE; |
| 128 | |
| 129 | isl_stream_free(s: s1); |
| 130 | isl_stream_free(s: s2); |
| 131 | fclose(stream: input1); |
| 132 | fclose(stream: input2); |
| 133 | isl_ctx_free(ctx); |
| 134 | |
| 135 | return EXIT_SUCCESS; |
| 136 | } |
| 137 | |