⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 parsecl.c

📁 RAM Defragmentation tools
💻 C
字号:
/* parsecl.c - command line parser implementation */#include "cvstags.h"CVSTAG(parsecl,"$Id: parsecl.c,v 1.21 2005/05/08 23:51:41 knilch Exp $")/* Ramdefrag Command Line Parser *  (c) 2004, 2005 Tobias 'knilch' Jordan <knilch@users.sourceforge.net> * *  Setting Orange, the 50th day of Chaos in the YOLD 3170 *  (Celebrate Chaoflux!) * *  This program is free software; you can redistribute it and/or modify *  it under the terms of the GNU General Public License as published by *  the Free Software Foundation; either version 2 of the License, or *  (at your option) any later version. * *  This program is distributed in the hope that it will be useful, *  but WITHOUT ANY WARRANTY; without even the implied warranty of *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the *  GNU General Public License for more details. * *  You should have received a copy of the GNU General Public License *  along with this program; if not, write to the Free Software *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA *//* this was first created by gengetopts, but then heavily, heavily edited * by knilch because of the following: *  - he didn't like the default texts *  - this whole thingy should use PACKAGE_BUGREPORTS etc. *  - NLS support *  - autoconf/-make optimizations *  - support for some tricky specials *  - knilch is stupid. */#include <stdio.h>#ifdef HAVE_CONFIG_H#include "config.h"#endif#ifdef HAVE_STDLIB_H# include <stdlib.h>#endif#ifdef HAVE_STRING_H# include <string.h>#else# ifdef HAVE_STRINGS_H#  include <strings.h># endif#endif#include "getopt.h"#include "parsecl.h"#include "support.h"  /* for gettext-macros _() etc */#include "clierr.h"#define UNKNOWN_OPT _("%s: option unknown: %c\n")#define GTK_CLI_XOR_ONLY _("`--gtk' (`-g') and `--cli' (`-c') can't be used at the same time.")#define CONF_BATCH_FIN _("warning: `--batchmode' (`-b') already implies `--fin-stats' (`-f')")#define CONF_BATCH_STAT _("warning: `--batchmode' (`-b') already implies `--nostatus' (`-S')")void version(void) {  printf("%s %s\n\n", PACKAGE_NAME, PACKAGE_VERSION);  printf("%s is free software; see the source for copying conditions.  There is\n"         "NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n",	 PACKAGE_NAME);}void usage(char * argz) {  printf("%s %s\n", PACKAGE_NAME, PACKAGE_VERSION);  printf(_("\n"  "  a multi platform RAM optimization/defragmentation utility\n"  "\n"  "Usage:\n"  "   %s [OPTIONS]\n"  "   %s {-c|--cli} [OPTIONS]\n\n"), argz, argz);  printf(_("General Options:\n"));  printf(_("   -h  --help       print help and exit\n"));  printf(_("   -V  --version    print version and exit\n"));  printf(_("   -H  --nohorsti   don't use H.O.R.S.T.I when not root\n"));  printf(_("   -n  --dry-run    just simulate optimizing, don't touch RAM\n"));  printf(_("   -v  --verbose    increase verbosity\n"));  printf(_("User Interface Options:\n"));  printf(_("   -g  --gtk        use GTK+ interface (this is the default)\n"));  printf(_("   -c  --cli        use command line interface\n"));  printf(_("Command Line Interface Options:\n"));  printf(_("   -a  --analyze    don't start defragmentation, analyze only [*]\n"));  printf(_("   -s  --std-alg    use default defragmentation algorithm [*]\n"));  printf(_("   -d  --deep-alg   use `deep' defragmentation algorithm [*]\n"));  printf(_("   -o  --opt-alg    use special optimized defragmentation [*]\n"));  printf(_("     (options marked with `[*]' are mutually exclusive)\n"));  printf(_("   -p  --progress   show a progress bar made of hash marks (`#')\n"));  printf(_("   -S  --nostatus   do not show current defragmentation state\n"));  printf(_("   -f  --statistics\n"	   "       --fin-stats  show final statistics\n"));  printf(_("   -b  --batchmode  produce machine readable output (implies -Sf)\n"));  printf(_("Some GTK-Options:\n"));  printf(_("       --display, --sync, --no-xshm\n\n"));  printf(_("Send bugreports/suggestions to <%s>\n"), PACKAGE_BUGREPORT);}int parse_cl(int argc, char * const *argv, struct my_args *args_info, int err) {  int c;	/* Character of the parsed option.  */  static struct option long_options[] = {    { "help",		0, NULL, 'h' },    { "version",	0, NULL, 'V' },    { "nohorsti",	0, NULL, 'H' },    { "dry-run",	0, NULL, 'n' },    { "verbose",	0, NULL, 'v' },    { "gtk",		0, NULL, 'g' },    { "cli",		0, NULL, 'c' },    { "analyze",	0, NULL, 'a' },    { "std-alg",	0, NULL, 's' },    { "deep-alg",	0, NULL, 'd' },    { "opt-alg",	0, NULL, 'o' },    { "progress",	0, NULL, 'p' },    { "nostatus",	0, NULL, 'S' },    { "fin-stats",	0, NULL, 'f' }, { "statistics",	0, NULL, 'f' },    { "batchmode",	0, NULL, 'b' },    { NULL,		0, NULL, 0 }  };  args_info->nohorsti = 0;  args_info->dry_run = 0;  args_info->verboselev = 0;  args_info->gtk = 0;  args_info->cli = 0;  args_info->ui = 0;  args_info->nostat = 0;  args_info->prog = 0;  args_info->finalstat = 0;  args_info->batchmode = 0;  args_info->alg = '\0';  optarg = 0;  optind = 1;  opterr = err;  optopt = '?';  while (42) {    c = getopt_long(argc, argv, "hVHnvgcasdopSfb", long_options, NULL);    if (c == -1) break;	/* Exit from `while (42)' loop.  */    switch (c) {      case 'h':	/* Print help and exit.  */	usage(argv[0]);	exit(EXIT_SUCCESS);      case 'V':	/* Print version and exit.  */	version();	exit(EXIT_SUCCESS);      case 'H':	/* don't use H.O.R.S.T.I when not root.  */	if (args_info->nohorsti) {	  clierr(_("`--nohorsti' (`-H') option given more than once"));	  exit(EXIT_FAILURE);	}	args_info->nohorsti = 1;	break;      case 'g':	/* use GTK  */	if (args_info->gtk) {	  clierr(_("`--gtk' (`-g') option given more than once"));	  exit(EXIT_FAILURE);	}	if (args_info->cli) {	  clierr(GTK_CLI_XOR_ONLY);	  exit(EXIT_FAILURE);	}	args_info->gtk = 1;	break;      case 'c':	/* CLI */	if (args_info->cli) {	  clierr(_("`--cli' (`-c') option given more than once"));	  exit(EXIT_FAILURE);	}	if (args_info->gtk) {	  clierr(GTK_CLI_XOR_ONLY);	  exit(EXIT_FAILURE);	}	args_info->cli = 1;	break;      case 's':      case 'd':      case 'o':      case 'a':	if (! (args_info->cli)) {	  clierr(_("CLI options need option `--cli' (`-c') first"));	  exit(EXIT_FAILURE);	}	if (args_info->alg) {	  clierr(_("options for algorithm selection are mutually exclusive "                                         "and can't be given more than once"));	  /* as above error message may not be very descriptive */	  press_h_for_help(argv[0]);	  exit(EXIT_FAILURE);	}	args_info->alg = c;	break;      case 'p':	if (! (args_info->cli)) {	  clierr(_("CLI options need option `--cli' (`-c') first"));	  exit(EXIT_FAILURE);	}	if (args_info->prog) {	  clierr(_("`--progress' (`-p') option given more than once"));	  exit(EXIT_FAILURE);	}	args_info->prog = 1;        break;      case 'S':	if (! (args_info->cli)) {	  clierr(_("CLI options need option `--cli' (`-c') first"));	  exit(EXIT_FAILURE);	}	if (args_info->nostat) {	  if (args_info->batchmode) {	    clierr(CONF_BATCH_STAT);	  } else {	    clierr(_("`--nostatus' (`-S') option given more than once"));            exit(EXIT_FAILURE);	  }	}	args_info->nostat = 1;        break;      case 'f':	if (! (args_info->cli)) {	  clierr(_("CLI options need option `--cli' (`-c') first"));	  exit(EXIT_FAILURE);	}	if (args_info->finalstat) {          if (args_info->batchmode) {            clierr(CONF_BATCH_FIN);	  } else {            clierr(_("`--fin-stats' (`-f') option given more than once"));            exit(EXIT_FAILURE);	  }	}	args_info->finalstat = 1;        break;      case 'b':	if (! (args_info->cli)) {	  clierr(_("CLI options need option `--cli' (`-c') first"));	  exit(EXIT_FAILURE);	}	if (args_info->batchmode) {	  clierr(_("`--batchmode' (`-b') option given more than once"));	  exit(EXIT_FAILURE);	}	if ((args_info->nostat) && (err)) {	  clierr(CONF_BATCH_STAT);	} else {          args_info->nostat = 1;	}	if ((args_info->finalstat) && (err)) {	  clierr(CONF_BATCH_FIN);	} else {	  args_info->finalstat = 1;	}	args_info->batchmode = 1;        break;      case 'n':	/* just simulate optimizing, don't touch RAM.  */	if (args_info->dry_run) {	  clierr(_("`--dry-run' (`-n') option given more than once"));	  exit(EXIT_FAILURE);	}	args_info->dry_run = 1;	break;      case 'v':	/* be verbose.  */	args_info->verboselev++;	break;      case 0:	/* Long option with no short option */      case '?':	/* Invalid option. */	if (err) {          /* getopt already prints an error message */	  press_h_for_help(argv[0]);	  return 5;	}	break;      default:	/* bug: option not considered. */	if (err) {	  fprintf(stderr, "* ");	  fprintf(stderr, UNKNOWN_OPT, PACKAGE_NAME, c);	  press_h_for_help(argv[0]);	  return 5;	}    } /* switch */  } /* while */  args_info->ui = (args_info->cli) ? USE_CL_UI : USE_GTK_UI;  return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -