lexsup.c
来自「基于4个mips核的noc设计」· C语言 代码 · 共 1,283 行 · 第 1/3 页
C
1,283 行
/* Parse options for the GNU linker. Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 Free Software Foundation, Inc.This file is part of GLD, the Gnu Linker.GLD is free software; you can redistribute it and/or modifyit under the terms of the GNU General Public License as published bythe Free Software Foundation; either version 2, or (at your option)any later version.GLD is distributed in the hope that it will be useful,but WITHOUT ANY WARRANTY; without even the implied warranty ofMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See theGNU General Public License for more details.You should have received a copy of the GNU General Public Licensealong with GLD; see the file COPYING. If not, write to the FreeSoftware Foundation, 59 Temple Place - Suite 330, Boston, MA02111-1307, USA. */#include "bfd.h"#include "sysdep.h"#include "libiberty.h"#include <stdio.h>#include <string.h>#include <ctype.h>#include "getopt.h"#include "bfdlink.h"#include "ld.h"#include "ldmain.h"#include "ldmisc.h"#include "ldexp.h"#include "ldlang.h"#include "ldgram.h"#include "ldlex.h"#include "ldfile.h"#include "ldver.h"#include "ldemul.h"#include "demangle.h"#ifndef PATH_SEPARATOR#if defined (__MSDOS__) || (defined (_WIN32) && ! defined (__CYGWIN32__))#define PATH_SEPARATOR ';'#else#define PATH_SEPARATOR ':'#endif#endif/* Somewhere above, sys/stat.h got included . . . . */#if !defined(S_ISDIR) && defined(S_IFDIR)#define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR)#endif/* Omit args to avoid the possibility of clashing with a system header that might disagree about consts. */unsigned long strtoul ();static int is_num PARAMS ((const char *, int, int, int));static void set_default_dirlist PARAMS ((char *dirlist_ptr));static void set_section_start PARAMS ((char *sect, char *valstr));static void help PARAMS ((void));/* Non-zero if we are processing a --defsym from the command line. */int parsing_defsym = 0;/* Codes used for the long options with no short synonyms. 150 isn't special; it's just an arbitrary non-ASCII char value. */#define OPTION_ASSERT 150#define OPTION_CALL_SHARED (OPTION_ASSERT + 1)#define OPTION_CREF (OPTION_CALL_SHARED + 1)#define OPTION_DEFSYM (OPTION_CREF + 1)#define OPTION_DEMANGLE (OPTION_DEFSYM + 1)#define OPTION_DYNAMIC_LINKER (OPTION_DEMANGLE + 1)#define OPTION_EB (OPTION_DYNAMIC_LINKER + 1)#define OPTION_EL (OPTION_EB + 1)#define OPTION_EMBEDDED_RELOCS (OPTION_EL + 1)#define OPTION_EXPORT_DYNAMIC (OPTION_EMBEDDED_RELOCS + 1)#define OPTION_HELP (OPTION_EXPORT_DYNAMIC + 1)#define OPTION_IGNORE (OPTION_HELP + 1)#define OPTION_MAP (OPTION_IGNORE + 1)#define OPTION_NO_DEMANGLE (OPTION_MAP + 1)#define OPTION_NO_KEEP_MEMORY (OPTION_NO_DEMANGLE + 1)#define OPTION_NO_WARN_MISMATCH (OPTION_NO_KEEP_MEMORY + 1)#define OPTION_NOINHIBIT_EXEC (OPTION_NO_WARN_MISMATCH + 1)#define OPTION_NON_SHARED (OPTION_NOINHIBIT_EXEC + 1)#define OPTION_NO_WHOLE_ARCHIVE (OPTION_NON_SHARED + 1)#define OPTION_OFORMAT (OPTION_NO_WHOLE_ARCHIVE + 1)#define OPTION_RELAX (OPTION_OFORMAT + 1)#define OPTION_RETAIN_SYMBOLS_FILE (OPTION_RELAX + 1)#define OPTION_RPATH (OPTION_RETAIN_SYMBOLS_FILE + 1)#define OPTION_RPATH_LINK (OPTION_RPATH + 1)#define OPTION_SHARED (OPTION_RPATH_LINK + 1)#define OPTION_SONAME (OPTION_SHARED + 1)#define OPTION_SORT_COMMON (OPTION_SONAME + 1)#define OPTION_STATS (OPTION_SORT_COMMON + 1)#define OPTION_SYMBOLIC (OPTION_STATS + 1)#define OPTION_TASK_LINK (OPTION_SYMBOLIC + 1)#define OPTION_TBSS (OPTION_TASK_LINK + 1)#define OPTION_TDATA (OPTION_TBSS + 1)#define OPTION_TTEXT (OPTION_TDATA + 1)#define OPTION_TRADITIONAL_FORMAT (OPTION_TTEXT + 1)#define OPTION_UR (OPTION_TRADITIONAL_FORMAT + 1)#define OPTION_VERBOSE (OPTION_UR + 1)#define OPTION_VERSION (OPTION_VERBOSE + 1)#define OPTION_VERSION_SCRIPT (OPTION_VERSION + 1)#define OPTION_VERSION_EXPORTS_SECTION (OPTION_VERSION_SCRIPT + 1)#define OPTION_WARN_COMMON (OPTION_VERSION_EXPORTS_SECTION + 1)#define OPTION_WARN_CONSTRUCTORS (OPTION_WARN_COMMON + 1)#define OPTION_WARN_MULTIPLE_GP (OPTION_WARN_CONSTRUCTORS + 1)#define OPTION_WARN_ONCE (OPTION_WARN_MULTIPLE_GP + 1)#define OPTION_WARN_SECTION_ALIGN (OPTION_WARN_ONCE + 1)#define OPTION_SPLIT_BY_RELOC (OPTION_WARN_SECTION_ALIGN + 1)#define OPTION_SPLIT_BY_FILE (OPTION_SPLIT_BY_RELOC + 1)#define OPTION_WHOLE_ARCHIVE (OPTION_SPLIT_BY_FILE + 1)#define OPTION_WRAP (OPTION_WHOLE_ARCHIVE + 1)#define OPTION_FORCE_EXE_SUFFIX (OPTION_WRAP + 1)#define OPTION_GC_SECTIONS (OPTION_FORCE_EXE_SUFFIX + 1)#define OPTION_NO_GC_SECTIONS (OPTION_GC_SECTIONS + 1)#define OPTION_CHECK_SECTIONS (OPTION_NO_GC_SECTIONS + 1)#define OPTION_NO_CHECK_SECTIONS (OPTION_CHECK_SECTIONS + 1)#define OPTION_MPC860C0 (OPTION_NO_CHECK_SECTIONS + 1)#define OPTION_NO_UNDEFINED (OPTION_MPC860C0 + 1)#define OPTION_INIT (OPTION_NO_UNDEFINED + 1)#define OPTION_FINI (OPTION_INIT + 1)#define OPTION_SECTION_START (OPTION_FINI + 1)#define OPTION_UNIQUE (OPTION_SECTION_START + 1)#define OPTION_TARGET_HELP (OPTION_UNIQUE + 1)#define OPTION_ALLOW_SHLIB_UNDEFINED (OPTION_TARGET_HELP + 1)/* The long options. This structure is used for both the option parsing and the help text. */struct ld_option{ /* The long option information. */ struct option opt; /* The short option with the same meaning ('\0' if none). */ char shortopt; /* The name of the argument (NULL if none). */ const char *arg; /* The documentation string. If this is NULL, this is a synonym for the previous option. */ const char *doc; enum { /* Use one dash before long option name. */ ONE_DASH, /* Use two dashes before long option name. */ TWO_DASHES, /* Only accept two dashes before the long option name. This is an overloading of the use of this enum, since originally it was only intended to tell the --help display function how to display the long option name. This feature was added in order to resolve the confusion about the -omagic command line switch. Is it setting the output file name to "magic" or is it setting the NMAGIC flag on the output ? It has been decided that it is setting the output file name, and that if you want to set the NMAGIC flag you should use -N or --omagic. */ EXACTLY_TWO_DASHES, /* Don't mention this option in --help output. */ NO_HELP } control;};static const struct ld_option ld_options[] ={ { {NULL, required_argument, NULL, '\0'}, 'a', N_("KEYWORD"), N_("Shared library control for HP/UX compatibility"), ONE_DASH }, { {"architecture", required_argument, NULL, 'A'}, 'A', N_("ARCH"), N_("Set architecture") , TWO_DASHES }, { {"format", required_argument, NULL, 'b'}, 'b', N_("TARGET"), N_("Specify target for following input files"), TWO_DASHES }, { {"mri-script", required_argument, NULL, 'c'}, 'c', N_("FILE"), N_("Read MRI format linker script"), TWO_DASHES }, { {"dc", no_argument, NULL, 'd'}, 'd', NULL, N_("Force common symbols to be defined"), ONE_DASH }, { {"dp", no_argument, NULL, 'd'}, '\0', NULL, NULL, ONE_DASH }, { {"entry", required_argument, NULL, 'e'}, 'e', N_("ADDRESS"), N_("Set start address"), TWO_DASHES }, { {"export-dynamic", no_argument, NULL, OPTION_EXPORT_DYNAMIC}, 'E', NULL, N_("Export all dynamic symbols"), TWO_DASHES }, { {"EB", no_argument, NULL, OPTION_EB}, '\0', NULL, N_("Link big-endian objects"), ONE_DASH }, { {"EL", no_argument, NULL, OPTION_EL}, '\0', NULL, N_("Link little-endian objects"), ONE_DASH }, { {"auxiliary", required_argument, NULL, 'f'}, 'f', N_("SHLIB"), N_("Auxiliary filter for shared object symbol table"), TWO_DASHES }, { {"filter", required_argument, NULL, 'F'}, 'F', N_("SHLIB"), N_("Filter for shared object symbol table"), TWO_DASHES }, { {NULL, no_argument, NULL, '\0'}, 'g', NULL, N_("Ignored"), ONE_DASH }, { {"gpsize", required_argument, NULL, 'G'}, 'G', N_("SIZE"), N_("Small data size (if no size, same as --shared)"), TWO_DASHES }, { {"soname", required_argument, NULL, OPTION_SONAME}, 'h', N_("FILENAME"), N_("Set internal name of shared library"), ONE_DASH }, { {"library", required_argument, NULL, 'l'}, 'l', N_("LIBNAME"), N_("Search for library LIBNAME"), TWO_DASHES }, { {"library-path", required_argument, NULL, 'L'}, 'L', N_("DIRECTORY"), N_("Add DIRECTORY to library search path"), TWO_DASHES }, { {NULL, required_argument, NULL, '\0'}, 'm', N_("EMULATION"), N_("Set emulation"), ONE_DASH }, { {"print-map", no_argument, NULL, 'M'}, 'M', NULL, N_("Print map file on standard output"), TWO_DASHES }, { {"nmagic", no_argument, NULL, 'n'}, 'n', NULL, N_("Do not page align data"), TWO_DASHES }, { {"omagic", no_argument, NULL, 'N'}, 'N', NULL, N_("Do not page align data, do not make text readonly"), EXACTLY_TWO_DASHES }, { {"output", required_argument, NULL, 'o'}, 'o', N_("FILE"), N_("Set output file name"), EXACTLY_TWO_DASHES }, { {NULL, required_argument, NULL, '\0'}, 'O', NULL, N_("Optimize output file"), ONE_DASH }, { {"Qy", no_argument, NULL, OPTION_IGNORE}, '\0', NULL, N_("Ignored for SVR4 compatibility"), ONE_DASH }, { {"emit-relocs", no_argument, NULL, 'q'}, 'q', NULL, "Generate relocations in final output", TWO_DASHES }, { {"relocateable", no_argument, NULL, 'r'}, 'r', NULL, N_("Generate relocateable output"), TWO_DASHES }, { {NULL, no_argument, NULL, '\0'}, 'i', NULL, NULL, ONE_DASH }, { {"just-symbols", required_argument, NULL, 'R'}, 'R', N_("FILE"), N_("Just link symbols (if directory, same as --rpath)"), TWO_DASHES }, { {"strip-all", no_argument, NULL, 's'}, 's', NULL, N_("Strip all symbols"), TWO_DASHES }, { {"strip-debug", no_argument, NULL, 'S'}, 'S', NULL, N_("Strip debugging symbols"), TWO_DASHES }, { {"trace", no_argument, NULL, 't'}, 't', NULL, N_("Trace file opens"), TWO_DASHES }, { {"script", required_argument, NULL, 'T'}, 'T', N_("FILE"), N_("Read linker script"), TWO_DASHES }, { {"undefined", required_argument, NULL, 'u'}, 'u', N_("SYMBOL"), N_("Start with undefined reference to SYMBOL"), TWO_DASHES }, { {"unique", optional_argument, NULL, OPTION_UNIQUE}, '\0', N_("[=SECTION]"), N_("Don't merge input [SECTION | orphan] sections"), TWO_DASHES }, { {"Ur", no_argument, NULL, OPTION_UR}, '\0', NULL, N_("Build global constructor/destructor tables"), ONE_DASH }, { {"version", no_argument, NULL, OPTION_VERSION}, 'v', NULL, N_("Print version information"), TWO_DASHES }, { {NULL, no_argument, NULL, '\0'}, 'V', NULL, N_("Print version and emulation information"), ONE_DASH }, { {"discard-all", no_argument, NULL, 'x'}, 'x', NULL, N_("Discard all local symbols"), TWO_DASHES }, { {"discard-locals", no_argument, NULL, 'X'}, 'X', NULL, N_("Discard temporary local symbols"), TWO_DASHES }, { {"trace-symbol", required_argument, NULL, 'y'}, 'y', N_("SYMBOL"), N_("Trace mentions of SYMBOL"), TWO_DASHES }, { {NULL, required_argument, NULL, '\0'}, 'Y', N_("PATH"), N_("Default search path for Solaris compatibility"), ONE_DASH }, { {"start-group", no_argument, NULL, '('}, '(', NULL, N_("Start a group"), TWO_DASHES }, { {"end-group", no_argument, NULL, ')'}, ')', NULL, N_("End a group"), TWO_DASHES }, { {"assert", required_argument, NULL, OPTION_ASSERT}, '\0', N_("KEYWORD"), N_("Ignored for SunOS compatibility"), ONE_DASH }, { {"Bdynamic", no_argument, NULL, OPTION_CALL_SHARED}, '\0', NULL, N_("Link against shared libraries"), ONE_DASH }, { {"dy", no_argument, NULL, OPTION_CALL_SHARED}, '\0', NULL, NULL, ONE_DASH }, { {"call_shared", no_argument, NULL, OPTION_CALL_SHARED}, '\0', NULL, NULL, ONE_DASH }, { {"Bstatic", no_argument, NULL, OPTION_NON_SHARED}, '\0', NULL, N_("Do not link against shared libraries"), ONE_DASH }, { {"dn", no_argument, NULL, OPTION_NON_SHARED}, '\0', NULL, NULL, ONE_DASH }, { {"non_shared", no_argument, NULL, OPTION_NON_SHARED}, '\0', NULL, NULL, ONE_DASH }, { {"static", no_argument, NULL, OPTION_NON_SHARED}, '\0', NULL, NULL, ONE_DASH }, { {"Bsymbolic", no_argument, NULL, OPTION_SYMBOLIC}, '\0', NULL, N_("Bind global references locally"), ONE_DASH }, { {"check-sections", no_argument, NULL, OPTION_CHECK_SECTIONS}, '\0', NULL, N_("Check section addresses for overlaps (default)"), TWO_DASHES }, { {"no-check-sections", no_argument, NULL, OPTION_NO_CHECK_SECTIONS}, '\0', NULL, N_("Do not check section addresses for overlaps"), TWO_DASHES }, { {"cref", no_argument, NULL, OPTION_CREF}, '\0', NULL, N_("Output cross reference table"), TWO_DASHES }, { {"defsym", required_argument, NULL, OPTION_DEFSYM}, '\0', N_("SYMBOL=EXPRESSION"), N_("Define a symbol"), TWO_DASHES }, { {"demangle", optional_argument, NULL, OPTION_DEMANGLE}, '\0', N_("[=STYLE]"), N_("Demangle symbol names [using STYLE]"), TWO_DASHES }, { {"dynamic-linker", required_argument, NULL, OPTION_DYNAMIC_LINKER}, '\0', N_("PROGRAM"), N_("Set the dynamic linker to use"), TWO_DASHES }, { {"embedded-relocs", no_argument, NULL, OPTION_EMBEDDED_RELOCS}, '\0', NULL, N_("Generate embedded relocs"), TWO_DASHES}, { {"fini", required_argument, NULL, OPTION_FINI}, '\0', N_("SYMBOL"), N_("Call SYMBOL at unload-time"), ONE_DASH }, { {"force-exe-suffix", no_argument, NULL, OPTION_FORCE_EXE_SUFFIX}, '\0', NULL, N_("Force generation of file with .exe suffix"), TWO_DASHES}, { {"gc-sections", no_argument, NULL, OPTION_GC_SECTIONS}, '\0', NULL, N_("Remove unused sections (on some targets)"), TWO_DASHES }, { {"no-gc-sections", no_argument, NULL, OPTION_NO_GC_SECTIONS}, '\0', NULL, N_("Don't remove unused sections (default)"), TWO_DASHES }, { {"help", no_argument, NULL, OPTION_HELP}, '\0', NULL, N_("Print option help"), TWO_DASHES }, { {"init", required_argument, NULL, OPTION_INIT}, '\0', N_("SYMBOL"), N_("Call SYMBOL at load-time"), ONE_DASH }, { {"Map", required_argument, NULL, OPTION_MAP}, '\0', N_("FILE"), N_("Write a map file"), ONE_DASH }, { {"no-demangle", no_argument, NULL, OPTION_NO_DEMANGLE }, '\0', NULL, N_("Do not demangle symbol names"), TWO_DASHES }, { {"no-keep-memory", no_argument, NULL, OPTION_NO_KEEP_MEMORY}, '\0', NULL, N_("Use less memory and more disk I/O"), TWO_DASHES }, { {"no-undefined", no_argument, NULL, OPTION_NO_UNDEFINED}, '\0', NULL, N_("Allow no undefined symbols"), TWO_DASHES }, { {"allow-shlib-undefined", no_argument, NULL, OPTION_ALLOW_SHLIB_UNDEFINED}, '\0', NULL, N_("Allow undefined symbols in shared objects"), TWO_DASHES }, { {"no-warn-mismatch", no_argument, NULL, OPTION_NO_WARN_MISMATCH}, '\0', NULL, N_("Don't warn about mismatched input files"), TWO_DASHES}, { {"no-whole-archive", no_argument, NULL, OPTION_NO_WHOLE_ARCHIVE}, '\0', NULL, N_("Turn off --whole-archive"), TWO_DASHES }, { {"noinhibit-exec", no_argument, NULL, OPTION_NOINHIBIT_EXEC}, '\0', NULL, N_("Create an output file even if errors occur"), TWO_DASHES }, { {"noinhibit_exec", no_argument, NULL, OPTION_NOINHIBIT_EXEC}, '\0', NULL, NULL, NO_HELP }, { {"oformat", required_argument, NULL, OPTION_OFORMAT}, '\0', N_("TARGET"), N_("Specify target of output file"), EXACTLY_TWO_DASHES }, { {"qmagic", no_argument, NULL, OPTION_IGNORE}, '\0', NULL, N_("Ignored for Linux compatibility"), ONE_DASH }, { {"relax", no_argument, NULL, OPTION_RELAX}, '\0', NULL, N_("Relax branches on certain targets"), TWO_DASHES }, { {"retain-symbols-file", required_argument, NULL, OPTION_RETAIN_SYMBOLS_FILE}, '\0', N_("FILE"), N_("Keep only symbols listed in FILE"), TWO_DASHES }, { {"rpath", required_argument, NULL, OPTION_RPATH}, '\0', N_("PATH"), N_("Set runtime shared library search path"), ONE_DASH }, { {"rpath-link", required_argument, NULL, OPTION_RPATH_LINK}, '\0', N_("PATH"), N_("Set link time shared library search path"), ONE_DASH }, { {"shared", no_argument, NULL, OPTION_SHARED}, '\0', NULL, N_("Create a shared library"), ONE_DASH }, { {"Bshareable", no_argument, NULL, OPTION_SHARED }, /* FreeBSD. */ '\0', NULL, NULL, ONE_DASH }, { {"sort-common", no_argument, NULL, OPTION_SORT_COMMON}, '\0', NULL, N_("Sort common symbols by size"), TWO_DASHES }, { {"sort_common", no_argument, NULL, OPTION_SORT_COMMON}, '\0', NULL, NULL, NO_HELP }, { {"split-by-file", optional_argument, NULL, OPTION_SPLIT_BY_FILE}, '\0', N_("[=SIZE]"), N_("Split output sections every SIZE octets"), TWO_DASHES }, { {"split-by-reloc", optional_argument, NULL, OPTION_SPLIT_BY_RELOC}, '\0', N_("[=COUNT]"), N_("Split output sections every COUNT relocs"), TWO_DASHES }, { {"stats", no_argument, NULL, OPTION_STATS}, '\0', NULL, N_("Print memory usage statistics"), TWO_DASHES }, { {"target-help", no_argument, NULL, OPTION_TARGET_HELP}, '\0', NULL, N_("Display target specific options"), TWO_DASHES }, { {"task-link", required_argument, NULL, OPTION_TASK_LINK}, '\0', N_("SYMBOL"), N_("Do task level linking"), TWO_DASHES }, { {"traditional-format", no_argument, NULL, OPTION_TRADITIONAL_FORMAT}, '\0', NULL, N_("Use same format as native linker"), TWO_DASHES }, { {"section-start", required_argument, NULL, OPTION_SECTION_START}, '\0', N_("SECTION=ADDRESS"), N_("Set address of named section"), TWO_DASHES }, { {"Tbss", required_argument, NULL, OPTION_TBSS}, '\0', N_("ADDRESS"), N_("Set address of .bss section"), ONE_DASH }, { {"Tdata", required_argument, NULL, OPTION_TDATA}, '\0', N_("ADDRESS"), N_("Set address of .data section"), ONE_DASH }, { {"Ttext", required_argument, NULL, OPTION_TTEXT}, '\0', N_("ADDRESS"), N_("Set address of .text section"), ONE_DASH }, { {"verbose", no_argument, NULL, OPTION_VERBOSE}, '\0', NULL, N_("Output lots of information during link"), TWO_DASHES }, { {"dll-verbose", no_argument, NULL, OPTION_VERBOSE}, /* Linux. */ '\0', NULL, NULL, NO_HELP }, { {"version-script", required_argument, NULL, OPTION_VERSION_SCRIPT }, '\0', N_("FILE"), N_("Read version information script"), TWO_DASHES }, { {"version-exports-section", required_argument, NULL, OPTION_VERSION_EXPORTS_SECTION }, '\0', N_("SYMBOL"), N_("Take export symbols list from .exports, using\n\t\t\t\tSYMBOL as the version."), TWO_DASHES }, { {"warn-common", no_argument, NULL, OPTION_WARN_COMMON}, '\0', NULL, N_("Warn about duplicate common symbols"), TWO_DASHES }, { {"warn-constructors", no_argument, NULL, OPTION_WARN_CONSTRUCTORS}, '\0', NULL, N_("Warn if global constructors/destructors are seen"), TWO_DASHES }, { {"warn-multiple-gp", no_argument, NULL, OPTION_WARN_MULTIPLE_GP}, '\0', NULL, N_("Warn if the multiple GP values are used"), TWO_DASHES }, { {"warn-once", no_argument, NULL, OPTION_WARN_ONCE}, '\0', NULL, N_("Warn only once per undefined symbol"), TWO_DASHES }, { {"warn-section-align", no_argument, NULL, OPTION_WARN_SECTION_ALIGN}, '\0', NULL, N_("Warn if start of section changes due to alignment"), TWO_DASHES }, { {"whole-archive", no_argument, NULL, OPTION_WHOLE_ARCHIVE}, '\0', NULL, N_("Include all objects from following archives"), TWO_DASHES }, { {"wrap", required_argument, NULL, OPTION_WRAP}, '\0', N_("SYMBOL"), N_("Use wrapper functions for SYMBOL"), TWO_DASHES }, { {"mpc860c0", optional_argument, NULL, OPTION_MPC860C0}, '\0', N_("[=WORDS]"), N_("Modify problematic branches in last WORDS (1-10,\n\t\t\t\tdefault 5) words of a page"), TWO_DASHES }};#define OPTION_COUNT ARRAY_SIZE (ld_options)/* Test STRING for containing a string of digits that form a number between MIN and MAX. The return value is the number or ERR. */static intis_num (string, min, max, err) const char *string; int min; int max; int err;{ int result = 0; for (; *string; ++string) { if (! isdigit (*string)) { result = err; break; } result = result * 10 + (*string - '0'); } if (result < min || result > max) result = err; return result;}voidparse_args (argc, argv) unsigned argc; char **argv;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?