/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to you under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
 * implied.  See the License for the specific language governing
 * permissions and limitations under the License.
 */

#include <avro.h>
#include <stdio.h>
#include <stdlib.h>

#define check_exit(call) \
	do { \
		int  __rc = call; \
		if (__rc != 0) { \
			fprintf(stderr, "Unexpected error:\n  %s\n  %s\n", \
				avro_strerror(), #call); \
			exit(EXIT_FAILURE); \
		} \
	} while (0)

int main(void)
{
	avro_file_reader_t  reader;

	/* First open the file with the explicit codec. */
	check_exit(avro_file_reader("avro-1279-codec.avro", &reader));
	check_exit(avro_file_reader_close(reader));


	/* Then the file with no codec. */
	check_exit(avro_file_reader("avro-1279-no-codec.avro", &reader));
	check_exit(avro_file_reader_close(reader));

	/* Clean up and exit */
	exit(EXIT_SUCCESS);
}
