Skip to content

Commit

Permalink
AVRO-2955: Build avromod and avropipe for Windows.
Browse files Browse the repository at this point in the history
Import getopt_long() from FreeBSD.
  • Loading branch information
kiyolee committed Apr 25, 2021
1 parent 66679f8 commit 92c0d40
Show file tree
Hide file tree
Showing 5 changed files with 775 additions and 7 deletions.
11 changes: 8 additions & 3 deletions lang/c/src/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -138,13 +138,18 @@ add_executable(avroappend avroappend.c)
target_link_libraries(avroappend avro-static)
install(TARGETS avroappend RUNTIME DESTINATION bin)

if (NOT WIN32)
#TODO: Port getopt() to Windows to compile avropipe.c and avromod.c
if(MSVC)
add_executable(avropipe avropipe.c getopt/getopt_long.c)
else(MSVC)
add_executable(avropipe avropipe.c)
endif(MSVC)
target_link_libraries(avropipe avro-static)
install(TARGETS avropipe RUNTIME DESTINATION bin)

if(MSVC)
add_executable(avromod avromod.c getopt/getopt_long.c)
else(MSVC)
add_executable(avromod avromod.c)
endif(MSVC)
target_link_libraries(avromod avro-static)
install(TARGETS avromod RUNTIME DESTINATION bin)
endif(NOT WIN32)
18 changes: 16 additions & 2 deletions lang/c/src/avromod.c
Original file line number Diff line number Diff line change
Expand Up @@ -16,11 +16,15 @@
*/

#include <errno.h>
#include <getopt.h>
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#ifdef _WIN32
#include "getopt/getopt.h"
#else
#include <getopt.h>
#endif

#include "avro.h"
#include "avro_private.h"
Expand Down Expand Up @@ -130,6 +134,15 @@ int main(int argc, char **argv)
char *in_filename;
char *out_filename;

#ifdef _MSC_VER
{
const char *cp = argv[0] + strlen(argv[0]);
while (cp > argv[0] && *(cp-1) != '/' && *(cp-1) != '\\' && *(cp-1) != ':')
--cp;
opt_progname = cp;
}
#endif

int ch;
while ((ch = getopt_long(argc, argv, "b:c:", longopts, NULL)) != -1) {
switch (ch) {
Expand Down Expand Up @@ -157,7 +170,8 @@ int main(int argc, char **argv)
in_filename = NULL;
out_filename = argv[0];
} else {
fprintf(stderr, "Can't read from multiple input files.\n");
if (argc > 2)
fprintf(stderr, "Can't read from multiple input files.\n");
usage();
exit(1);
}
Expand Down
16 changes: 14 additions & 2 deletions lang/c/src/avropipe.c
Original file line number Diff line number Diff line change
Expand Up @@ -17,12 +17,15 @@

#include <ctype.h>
#include <errno.h>
#include <getopt.h>
#include <avro/platform.h>
#include <avro/platform.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#ifdef _WIN32
#include "getopt/getopt.h"
#else
#include <getopt.h>
#endif

#include "avro.h"
#include "avro_private.h"
Expand Down Expand Up @@ -400,6 +403,15 @@ int main(int argc, char **argv)
{
char *data_filename;

#ifdef _MSC_VER
{
const char *cp = argv[0] + strlen(argv[0]);
while (cp > argv[0] && *(cp-1) != '/' && *(cp-1) != '\\' && *(cp-1) != ':')
--cp;
opt_progname = cp;
}
#endif

int ch;
while ((ch = getopt_long(argc, argv, "s:", longopts, NULL) ) != -1) {
switch (ch) {
Expand Down
93 changes: 93 additions & 0 deletions lang/c/src/getopt/getopt.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
/* $NetBSD: getopt.h,v 1.4 2000/07/07 10:43:54 ad Exp $ */
/* $FreeBSD: release/12.2.0/include/getopt.h 326192 2017-11-25 17:09:43Z pfg $ */

/*-
* SPDX-License-Identifier: BSD-2-Clause-NetBSD
*
* Copyright (c) 2000 The NetBSD Foundation, Inc.
* All rights reserved.
*
* This code is derived from software contributed to The NetBSD Foundation
* by Dieter Baron and Thomas Klausner.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/

#ifndef _GETOPT_H_
#define _GETOPT_H_

#ifdef __CYGWIN__
#error Not for cygwin.
#endif

#ifdef unix
#include <sys/cdefs.h>
#endif

/*
* GNU-like getopt_long()/getopt_long_only() with 4.4BSD optreset extension.
* getopt() is declared here too for GNU programs.
*/
#define no_argument 0
#define required_argument 1
#define optional_argument 2

struct option {
/* name of long option */
const char *name;
/*
* one of no_argument, required_argument, and optional_argument:
* whether option takes an argument
*/
int has_arg;
/* if not NULL, set *flag to val when option found */
int *flag;
/* if flag not NULL, value to set *flag to; else return value */
int val;
};

#ifdef __FreeBSD__
__BEGIN_DECLS
#endif
int getopt_long(int, char * const *, const char *,
const struct option *, int *);
int getopt_long_only(int, char * const *, const char *,
const struct option *, int *);
#ifndef _GETOPT_DECLARED
#define _GETOPT_DECLARED
int getopt(int, char * const [], const char *);

extern char *optarg; /* getopt(3) external variables */
extern int optind, opterr, optopt;
#endif
#ifndef _OPTRESET_DECLARED
#define _OPTRESET_DECLARED
extern int optreset; /* getopt(3) external variable */
#endif
#ifdef _MSC_VER
extern const char *opt_progname;
#endif
#ifdef __FreeBSD__
__END_DECLS
#endif

#endif /* !_GETOPT_H_ */
Loading

0 comments on commit 92c0d40

Please sign in to comment.