From 8c6cba77adeaf19f6dcad39c7a587322ab8f366e Mon Sep 17 00:00:00 2001 From: rust3028 Date: Wed, 28 Sep 2016 18:49:32 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B0=20=D0=B2=D0=B8=D0=BD=D0=B4=D0=BE=D0=B2=D0=B0=D1=8F?= =?UTF-8?q?=20=D1=81=D0=B1=D0=BE=D1=80=D0=BA=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- balong-usbdload.c | 18 +- parts.c | 6 + winbuild/Release/balong_usbdload.exe | Bin 86016 -> 92160 bytes .../balong_usbdload/balong_usbdload.vcxproj | 8 +- .../balong_usbdload.vcxproj.filters | 16 +- .../balong_usbdload.vcxproj.user | 8 - winbuild/balong_usbdload/getopt.c | 563 ++++++++++++++++++ winbuild/balong_usbdload/getopt.h | 95 +++ winbuild/balong_usbdload/wingetopt.c | 76 --- winbuild/balong_usbdload/wingetopt.h | 32 - 10 files changed, 697 insertions(+), 125 deletions(-) delete mode 100644 winbuild/balong_usbdload/balong_usbdload.vcxproj.user create mode 100644 winbuild/balong_usbdload/getopt.c create mode 100644 winbuild/balong_usbdload/getopt.h delete mode 100644 winbuild/balong_usbdload/wingetopt.c delete mode 100644 winbuild/balong_usbdload/wingetopt.h diff --git a/balong-usbdload.c b/balong-usbdload.c index b41ed60..873c2d7 100644 --- a/balong-usbdload.c +++ b/balong-usbdload.c @@ -17,7 +17,7 @@ #else //%%%% #include -#include "wingetopt.h" +#include "getopt.h" #include "printf.h" #endif @@ -247,7 +247,11 @@ char devname[50]=""; DWORD bytes_written, bytes_read; #endif +#ifndef WIN32 bzero(fileflag,sizeof(fileflag)); +#else +memset(fileflag, 0, sizeof(fileflag)); +#endif while ((opt = getopt(argc, argv, "hp:ft:ms:b")) != -1) { switch (opt) { @@ -255,9 +259,13 @@ while ((opt = getopt(argc, argv, "hp:ft:ms:b")) != -1) { printf("\n Утилита предназначена для аварийной USB-загрузки устройств на чипете Balong V7\n\n\ %s [ключи] <имя файла для загрузки>\n\n\ - Допустимы следующие ключи:\n\n\ --p - последовательный порт для общения с загрузчиком (по умолчанию /dev/ttyUSB0\n\ --f - грузить usbloader только до fastboot (без запуска линукса)\n\ + Допустимы следующие ключи:\n\n" +#ifndef WIN32 +"-p - последовательный порт для общения с загрузчиком (по умолчанию /dev/ttyUSB0)\n" +#else +"-p - последовательный порт для общения с загрузчиком\n" +#endif +"-f - грузить usbloader только до fastboot (без запуска линукса)\n\ -b - аналогично -f, дополнительно отключить проверку дефектных блоков при стирании\n\ -t - взять таблицу разделов из указанного файла\n\ -m - показать таблицу разделов загрузчика и завершить работу\n\ @@ -368,7 +376,7 @@ for(bl=0;bl<2;bl++) { //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% // патч таблицы разделов if (tflag) { - pt=fopen(ptfile,"r"); + pt=fopen(ptfile,"rb"); if (pt == 0) { printf("\n Не найден файл %s - замена таблицы разделов невозможна\n",ptfile); return; diff --git a/parts.c b/parts.c index 70a0af4..b4e335b 100644 --- a/parts.c +++ b/parts.c @@ -1,8 +1,14 @@ #include #include +#ifndef WIN32 #include #include #include +#else +#include +#include "printf.h" +#endif + #include "parts.h" // сигнатура заголовка таблицы diff --git a/winbuild/Release/balong_usbdload.exe b/winbuild/Release/balong_usbdload.exe index 6865fda6a69013d269eef25b1204e238e17a8cf7..3ed1737139ab6cdeb1aab3ef7b8eb8a4f42c6df2 100644 GIT binary patch delta 39572 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 GBmWO|gn_sK diff --git a/winbuild/balong_usbdload/balong_usbdload.vcxproj b/winbuild/balong_usbdload/balong_usbdload.vcxproj index e4821b2..cd6f363 100644 --- a/winbuild/balong_usbdload/balong_usbdload.vcxproj +++ b/winbuild/balong_usbdload/balong_usbdload.vcxproj @@ -83,11 +83,15 @@ - + + + + + - + diff --git a/winbuild/balong_usbdload/balong_usbdload.vcxproj.filters b/winbuild/balong_usbdload/balong_usbdload.vcxproj.filters index 04c989a..0609eb7 100644 --- a/winbuild/balong_usbdload/balong_usbdload.vcxproj.filters +++ b/winbuild/balong_usbdload/balong_usbdload.vcxproj.filters @@ -18,7 +18,13 @@ Source Files - + + Source Files + + + Source Files + + Source Files @@ -26,7 +32,13 @@ Header Files - + + Header Files + + + Header Files + + Header Files diff --git a/winbuild/balong_usbdload/balong_usbdload.vcxproj.user b/winbuild/balong_usbdload/balong_usbdload.vcxproj.user deleted file mode 100644 index ba58eb3..0000000 --- a/winbuild/balong_usbdload/balong_usbdload.vcxproj.user +++ /dev/null @@ -1,8 +0,0 @@ - - - - -p6 usblsafe.bin - $(TargetDir) - WindowsLocalDebugger - - \ No newline at end of file diff --git a/winbuild/balong_usbdload/getopt.c b/winbuild/balong_usbdload/getopt.c new file mode 100644 index 0000000..5fa19b1 --- /dev/null +++ b/winbuild/balong_usbdload/getopt.c @@ -0,0 +1,563 @@ +/* $OpenBSD: getopt_long.c,v 1.23 2007/10/31 12:34:57 chl Exp $ */ +/* $NetBSD: getopt_long.c,v 1.15 2002/01/31 22:43:40 tv Exp $ */ + +/* + * Copyright (c) 2002 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Sponsored in part by the Defense Advanced Research Projects + * Agency (DARPA) and Air Force Research Laboratory, Air Force + * Materiel Command, USAF, under agreement number F39502-99-1-0512. + */ +/*- + * 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. + */ + +#include +#include +#include +#include +#include +#include + +#include "getopt.h" + +#define REPLACE_GETOPT /* use this getopt as the system getopt(3) */ + +#ifdef REPLACE_GETOPT +int opterr = 1; /* if error message should be printed */ +int optind = 1; /* index into parent argv vector */ +int optopt = '?'; /* character checked for validity */ +#undef optreset /* see getopt.h */ +#define optreset __mingw_optreset +int optreset; /* reset getopt */ +char *optarg; /* argument associated with option */ +#endif + +#define PRINT_ERROR ((opterr) && (*options != ':')) + +#define FLAG_PERMUTE 0x01 /* permute non-options to the end of argv */ +#define FLAG_ALLARGS 0x02 /* treat non-options as args to option "-1" */ +#define FLAG_LONGONLY 0x04 /* operate as getopt_long_only */ + +/* return values */ +#define BADCH (int)'?' +#define BADARG ((*options == ':') ? (int)':' : (int)'?') +#define INORDER (int)1 + +#ifndef __CYGWIN__ +#define __progname __argv[0] +#else +extern char __declspec(dllimport) *__progname; +#endif + +#ifdef __CYGWIN__ +static char EMSG[] = ""; +#else +#define EMSG "" +#endif + +static int getopt_internal(int, char * const *, const char *, + const struct option *, int *, int); +static int parse_long_options(char * const *, const char *, + const struct option *, int *, int); +static int gcd(int, int); +static void permute_args(int, int, int, char * const *); + +static char *place = EMSG; /* option letter processing */ + +/* XXX: set optreset to 1 rather than these two */ +static int nonopt_start = -1; /* first non option argument (for permute) */ +static int nonopt_end = -1; /* first option after non options (for permute) */ + +/* Error messages */ +static const char recargchar[] = "option requires an argument -- %c"; +static const char recargstring[] = "option requires an argument -- %s"; +static const char ambig[] = "ambiguous option -- %.*s"; +static const char noarg[] = "option doesn't take an argument -- %.*s"; +static const char illoptchar[] = "unknown option -- %c"; +static const char illoptstring[] = "unknown option -- %s"; + +static void +_vwarnx(const char *fmt,va_list ap) +{ + (void)fprintf(stderr,"%s: ",__progname); + if (fmt != NULL) + (void)vfprintf(stderr,fmt,ap); + (void)fprintf(stderr,"\n"); +} + +static void +warnx(const char *fmt,...) +{ + va_list ap; + va_start(ap,fmt); + _vwarnx(fmt,ap); + va_end(ap); +} + +/* + * Compute the greatest common divisor of a and b. + */ +static int +gcd(int a, int b) +{ + int c; + + c = a % b; + while (c != 0) { + a = b; + b = c; + c = a % b; + } + + return (b); +} + +/* + * Exchange the block from nonopt_start to nonopt_end with the block + * from nonopt_end to opt_end (keeping the same order of arguments + * in each block). + */ +static void +permute_args(int panonopt_start, int panonopt_end, int opt_end, + char * const *nargv) +{ + int cstart, cyclelen, i, j, ncycle, nnonopts, nopts, pos; + char *swap; + + /* + * compute lengths of blocks and number and size of cycles + */ + nnonopts = panonopt_end - panonopt_start; + nopts = opt_end - panonopt_end; + ncycle = gcd(nnonopts, nopts); + cyclelen = (opt_end - panonopt_start) / ncycle; + + for (i = 0; i < ncycle; i++) { + cstart = panonopt_end+i; + pos = cstart; + for (j = 0; j < cyclelen; j++) { + if (pos >= panonopt_end) + pos -= nnonopts; + else + pos += nopts; + swap = nargv[pos]; + /* LINTED const cast */ + ((char **) nargv)[pos] = nargv[cstart]; + /* LINTED const cast */ + ((char **)nargv)[cstart] = swap; + } + } +} + +/* + * parse_long_options -- + * Parse long options in argc/argv argument vector. + * Returns -1 if short_too is set and the option does not match long_options. + */ +static int +parse_long_options(char * const *nargv, const char *options, + const struct option *long_options, int *idx, int short_too) +{ + char *current_argv, *has_equal; + size_t current_argv_len; + int i, ambiguous, match; + +#define IDENTICAL_INTERPRETATION(_x, _y) \ + (long_options[(_x)].has_arg == long_options[(_y)].has_arg && \ + long_options[(_x)].flag == long_options[(_y)].flag && \ + long_options[(_x)].val == long_options[(_y)].val) + + current_argv = place; + match = -1; + ambiguous = 0; + + optind++; + + if ((has_equal = strchr(current_argv, '=')) != NULL) { + /* argument found (--option=arg) */ + current_argv_len = has_equal - current_argv; + has_equal++; + } else + current_argv_len = strlen(current_argv); + + for (i = 0; long_options[i].name; i++) { + /* find matching long option */ + if (strncmp(current_argv, long_options[i].name, + current_argv_len)) + continue; + + if (strlen(long_options[i].name) == current_argv_len) { + /* exact match */ + match = i; + ambiguous = 0; + break; + } + /* + * If this is a known short option, don't allow + * a partial match of a single character. + */ + if (short_too && current_argv_len == 1) + continue; + + if (match == -1) /* partial match */ + match = i; + else if (!IDENTICAL_INTERPRETATION(i, match)) + ambiguous = 1; + } + if (ambiguous) { + /* ambiguous abbreviation */ + if (PRINT_ERROR) + warnx(ambig, (int)current_argv_len, + current_argv); + optopt = 0; + return (BADCH); + } + if (match != -1) { /* option found */ + if (long_options[match].has_arg == no_argument + && has_equal) { + if (PRINT_ERROR) + warnx(noarg, (int)current_argv_len, + current_argv); + /* + * XXX: GNU sets optopt to val regardless of flag + */ + if (long_options[match].flag == NULL) + optopt = long_options[match].val; + else + optopt = 0; + return (BADARG); + } + if (long_options[match].has_arg == required_argument || + long_options[match].has_arg == optional_argument) { + if (has_equal) + optarg = has_equal; + else if (long_options[match].has_arg == + required_argument) { + /* + * optional argument doesn't use next nargv + */ + optarg = nargv[optind++]; + } + } + if ((long_options[match].has_arg == required_argument) + && (optarg == NULL)) { + /* + * Missing argument; leading ':' indicates no error + * should be generated. + */ + if (PRINT_ERROR) + warnx(recargstring, + current_argv); + /* + * XXX: GNU sets optopt to val regardless of flag + */ + if (long_options[match].flag == NULL) + optopt = long_options[match].val; + else + optopt = 0; + --optind; + return (BADARG); + } + } else { /* unknown option */ + if (short_too) { + --optind; + return (-1); + } + if (PRINT_ERROR) + warnx(illoptstring, current_argv); + optopt = 0; + return (BADCH); + } + if (idx) + *idx = match; + if (long_options[match].flag) { + *long_options[match].flag = long_options[match].val; + return (0); + } else + return (long_options[match].val); +#undef IDENTICAL_INTERPRETATION +} + +/* + * getopt_internal -- + * Parse argc/argv argument vector. Called by user level routines. + */ +static int +getopt_internal(int nargc, char * const *nargv, const char *options, + const struct option *long_options, int *idx, int flags) +{ + char *oli; /* option letter list index */ + int optchar, short_too; + static int posixly_correct = -1; + + if (options == NULL) + return (-1); + + /* + * XXX Some GNU programs (like cvs) set optind to 0 instead of + * XXX using optreset. Work around this braindamage. + */ + if (optind == 0) + optind = optreset = 1; + + /* + * Disable GNU extensions if POSIXLY_CORRECT is set or options + * string begins with a '+'. + * + * CV, 2009-12-14: Check POSIXLY_CORRECT anew if optind == 0 or + * optreset != 0 for GNU compatibility. + */ + if (posixly_correct == -1 || optreset != 0) + posixly_correct = (getenv("POSIXLY_CORRECT") != NULL); + if (*options == '-') + flags |= FLAG_ALLARGS; + else if (posixly_correct || *options == '+') + flags &= ~FLAG_PERMUTE; + if (*options == '+' || *options == '-') + options++; + + optarg = NULL; + if (optreset) + nonopt_start = nonopt_end = -1; +start: + if (optreset || !*place) { /* update scanning pointer */ + optreset = 0; + if (optind >= nargc) { /* end of argument vector */ + place = EMSG; + if (nonopt_end != -1) { + /* do permutation, if we have to */ + permute_args(nonopt_start, nonopt_end, + optind, nargv); + optind -= nonopt_end - nonopt_start; + } + else if (nonopt_start != -1) { + /* + * If we skipped non-options, set optind + * to the first of them. + */ + optind = nonopt_start; + } + nonopt_start = nonopt_end = -1; + return (-1); + } + if (*(place = nargv[optind]) != '-' || + (place[1] == '\0' && strchr(options, '-') == NULL)) { + place = EMSG; /* found non-option */ + if (flags & FLAG_ALLARGS) { + /* + * GNU extension: + * return non-option as argument to option 1 + */ + optarg = nargv[optind++]; + return (INORDER); + } + if (!(flags & FLAG_PERMUTE)) { + /* + * If no permutation wanted, stop parsing + * at first non-option. + */ + return (-1); + } + /* do permutation */ + if (nonopt_start == -1) + nonopt_start = optind; + else if (nonopt_end != -1) { + permute_args(nonopt_start, nonopt_end, + optind, nargv); + nonopt_start = optind - + (nonopt_end - nonopt_start); + nonopt_end = -1; + } + optind++; + /* process next argument */ + goto start; + } + if (nonopt_start != -1 && nonopt_end == -1) + nonopt_end = optind; + + /* + * If we have "-" do nothing, if "--" we are done. + */ + if (place[1] != '\0' && *++place == '-' && place[1] == '\0') { + optind++; + place = EMSG; + /* + * We found an option (--), so if we skipped + * non-options, we have to permute. + */ + if (nonopt_end != -1) { + permute_args(nonopt_start, nonopt_end, + optind, nargv); + optind -= nonopt_end - nonopt_start; + } + nonopt_start = nonopt_end = -1; + return (-1); + } + } + + /* + * Check long options if: + * 1) we were passed some + * 2) the arg is not just "-" + * 3) either the arg starts with -- we are getopt_long_only() + */ + if (long_options != NULL && place != nargv[optind] && + (*place == '-' || (flags & FLAG_LONGONLY))) { + short_too = 0; + if (*place == '-') + place++; /* --foo long option */ + else if (*place != ':' && strchr(options, *place) != NULL) + short_too = 1; /* could be short option too */ + + optchar = parse_long_options(nargv, options, long_options, + idx, short_too); + if (optchar != -1) { + place = EMSG; + return (optchar); + } + } + + if ((optchar = (int)*place++) == (int)':' || + (optchar == (int)'-' && *place != '\0') || + (oli = strchr(options, optchar)) == NULL) { + /* + * If the user specified "-" and '-' isn't listed in + * options, return -1 (non-option) as per POSIX. + * Otherwise, it is an unknown option character (or ':'). + */ + if (optchar == (int)'-' && *place == '\0') + return (-1); + if (!*place) + ++optind; + if (PRINT_ERROR) + warnx(illoptchar, optchar); + optopt = optchar; + return (BADCH); + } + if (long_options != NULL && optchar == 'W' && oli[1] == ';') { + /* -W long-option */ + if (*place) /* no space */ + /* NOTHING */; + else if (++optind >= nargc) { /* no arg */ + place = EMSG; + if (PRINT_ERROR) + warnx(recargchar, optchar); + optopt = optchar; + return (BADARG); + } else /* white space */ + place = nargv[optind]; + optchar = parse_long_options(nargv, options, long_options, + idx, 0); + place = EMSG; + return (optchar); + } + if (*++oli != ':') { /* doesn't take argument */ + if (!*place) + ++optind; + } else { /* takes (optional) argument */ + optarg = NULL; + if (*place) /* no white space */ + optarg = place; + else if (oli[1] != ':') { /* arg not optional */ + if (++optind >= nargc) { /* no arg */ + place = EMSG; + if (PRINT_ERROR) + warnx(recargchar, optchar); + optopt = optchar; + return (BADARG); + } else + optarg = nargv[optind]; + } + place = EMSG; + ++optind; + } + /* dump back option letter */ + return (optchar); +} + +#ifdef REPLACE_GETOPT +/* + * getopt -- + * Parse argc/argv argument vector. + * + * [eventually this will replace the BSD getopt] + */ +int +getopt(int nargc, char * const *nargv, const char *options) +{ + + /* + * We don't pass FLAG_PERMUTE to getopt_internal() since + * the BSD getopt(3) (unlike GNU) has never done this. + * + * Furthermore, since many privileged programs call getopt() + * before dropping privileges it makes sense to keep things + * as simple (and bug-free) as possible. + */ + return (getopt_internal(nargc, nargv, options, NULL, NULL, 0)); +} +#endif /* REPLACE_GETOPT */ + +/* + * getopt_long -- + * Parse argc/argv argument vector. + */ +int +getopt_long(int nargc, char * const *nargv, const char *options, + const struct option *long_options, int *idx) +{ + + return (getopt_internal(nargc, nargv, options, long_options, idx, + FLAG_PERMUTE)); +} + +/* + * getopt_long_only -- + * Parse argc/argv argument vector. + */ +int +getopt_long_only(int nargc, char * const *nargv, const char *options, + const struct option *long_options, int *idx) +{ + + return (getopt_internal(nargc, nargv, options, long_options, idx, + FLAG_PERMUTE|FLAG_LONGONLY)); +} \ No newline at end of file diff --git a/winbuild/balong_usbdload/getopt.h b/winbuild/balong_usbdload/getopt.h new file mode 100644 index 0000000..8d526ab --- /dev/null +++ b/winbuild/balong_usbdload/getopt.h @@ -0,0 +1,95 @@ +#ifndef __GETOPT_H__ +/** + * DISCLAIMER + * This file has no copyright assigned and is placed in the Public Domain. + * This file is a part of the w64 mingw-runtime package. + * + * The w64 mingw-runtime package and its code is distributed in the hope that it + * will be useful but WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESSED OR + * IMPLIED ARE HEREBY DISCLAIMED. This includes but is not limited to + * warranties of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + */ + +#define __GETOPT_H__ + +/* All the headers include this file. */ +#include + +#ifdef __cplusplus +extern "C" { +#endif + +extern int optind; /* index of first non-option in argv */ +extern int optopt; /* single option character, as parsed */ +extern int opterr; /* flag to enable built-in diagnostics... */ + /* (user may set to zero, to suppress) */ + +extern char *optarg; /* pointer to argument of current option */ + +extern int getopt(int nargc, char * const *nargv, const char *options); + +#ifdef _BSD_SOURCE +/* + * BSD adds the non-standard `optreset' feature, for reinitialisation + * of `getopt' parsing. We support this feature, for applications which + * proclaim their BSD heritage, before including this header; however, + * to maintain portability, developers are advised to avoid it. + */ +# define optreset __mingw_optreset +extern int optreset; +#endif +#ifdef __cplusplus +} +#endif +/* + * POSIX requires the `getopt' API to be specified in `unistd.h'; + * thus, `unistd.h' includes this header. However, we do not want + * to expose the `getopt_long' or `getopt_long_only' APIs, when + * included in this manner. Thus, close the standard __GETOPT_H__ + * declarations block, and open an additional __GETOPT_LONG_H__ + * specific block, only when *not* __UNISTD_H_SOURCED__, in which + * to declare the extended API. + */ +#endif /* !defined(__GETOPT_H__) */ + +#if !defined(__UNISTD_H_SOURCED__) && !defined(__GETOPT_LONG_H__) +#define __GETOPT_LONG_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +struct option /* specification for a long form option... */ +{ + const char *name; /* option name, without leading hyphens */ + int has_arg; /* does it take an argument? */ + int *flag; /* where to save its status, or NULL */ + int val; /* its associated status value */ +}; + +enum /* permitted values for its `has_arg' field... */ +{ + no_argument = 0, /* option never takes an argument */ + required_argument, /* option always requires an argument */ + optional_argument /* option may take an argument */ +}; + +extern int getopt_long(int nargc, char * const *nargv, const char *options, + const struct option *long_options, int *idx); +extern int getopt_long_only(int nargc, char * const *nargv, const char *options, + const struct option *long_options, int *idx); +/* + * Previous MinGW implementation had... + */ +#ifndef HAVE_DECL_GETOPT +/* + * ...for the long form API only; keep this for compatibility. + */ +# define HAVE_DECL_GETOPT 1 +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* !defined(__UNISTD_H_SOURCED__) && !defined(__GETOPT_LONG_H__) */ \ No newline at end of file diff --git a/winbuild/balong_usbdload/wingetopt.c b/winbuild/balong_usbdload/wingetopt.c deleted file mode 100644 index c34f741..0000000 --- a/winbuild/balong_usbdload/wingetopt.c +++ /dev/null @@ -1,76 +0,0 @@ -/* -POSIX getopt for Windows - -AT&T Public License - -Code given out at the 1985 UNIFORUM conference in Dallas. -*/ - -#ifndef __GNUC__ - -#include "wingetopt.h" -#include -#include - -//#define NULL 0 -#define EOF (-1) -#define ERR(s, c) if(opterr){\ - char errbuf[2];\ - errbuf[0] = c; errbuf[1] = '\n';\ - fputs(argv[0], stderr);\ - fputs(s, stderr);\ - fputc(c, stderr);} - //(void) write(2, argv[0], (unsigned)strlen(argv[0]));\ - //(void) write(2, s, (unsigned)strlen(s));\ - //(void) write(2, errbuf, 2);} - -int opterr = 1; -int optind = 1; -int optopt; -char *optarg; - -int -getopt(int argc, char** argv, char* opts) -{ - static int sp = 1; - register int c; - register char *cp; - - if(sp == 1) - if(optind >= argc || - argv[optind][0] != '-' || argv[optind][1] == '\0') - return(EOF); - else if(strcmp(argv[optind], "--") == 0/*NULL*/) { - optind++; - return(EOF); - } - optopt = c = argv[optind][sp]; - if(c == ':' || (cp=strchr(opts, c)) == NULL) { - ERR(": illegal option -- ", c); - if(argv[optind][++sp] == '\0') { - optind++; - sp = 1; - } - return('?'); - } - if(*++cp == ':') { - if(argv[optind][sp+1] != '\0') - optarg = &argv[optind++][sp+1]; - else if(++optind >= argc) { - ERR(": option requires an argument -- ", c); - sp = 1; - return('?'); - } else - optarg = argv[optind++]; - sp = 1; - } else { - if(argv[optind][++sp] == '\0') { - sp = 1; - optind++; - } - optarg = NULL; - } - return(c); -} - -#endif /* __GNUC__ */ \ No newline at end of file diff --git a/winbuild/balong_usbdload/wingetopt.h b/winbuild/balong_usbdload/wingetopt.h deleted file mode 100644 index 97d6e78..0000000 --- a/winbuild/balong_usbdload/wingetopt.h +++ /dev/null @@ -1,32 +0,0 @@ -/* -POSIX getopt for Windows - -AT&T Public License - -Code given out at the 1985 UNIFORUM conference in Dallas. -*/ - -#ifdef __GNUC__ -#include -#endif -#ifndef __GNUC__ - -#ifndef _WINGETOPT_H_ -#define _WINGETOPT_H_ - -#ifdef __cplusplus -extern "C" { -#endif - -extern int opterr; -extern int optind; -extern int optopt; -extern char *optarg; -extern int getopt(int argc, char **argv, char *opts); - -#ifdef __cplusplus -} -#endif - -#endif /* _GETOPT_H_ */ -#endif /* __GNUC__ */ \ No newline at end of file