yes.c源码分析(coreutils-8.9)

/* yes - output a string repeatedly until killed
   Copyright (C) 1991-1997, 1999-2004, 2007-2011 Free Software Foundation, Inc.

   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 3 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, see <http://www.gnu.org/licenses/>.  */

/* David MacKenzie <djm@gnu.ai.mit.edu> */
/*4个标准库里的头文件*/
#include <config.h>
#include <stdio.h>
#include <sys/types.h>
#include <getopt.h>

/* 当前文件夹下的system.h */
#include "system.h"

/* lib文件夹下的两个头文件 */
#include "error.h"
#include "long-options.h"

/* The official name of this program (e.g., no `g' prefix).  */
#define PROGRAM_NAME "yes"

#define AUTHORS proper_name ("David MacKenzie")

void
usage (int status)
{
  if (status != EXIT_SUCCESS)
    fprintf (stderr, _("Try `%s --help' for more information.\n"),
             program_name);
  else
    {
      printf (_("\
Usage: %s [STRING]...\n\
  or:  %s OPTION\n\
"),
              program_name, program_name);

      fputs (_("\
Repeatedly output a line with all specified STRING(s), or `y'.\n\
\n\
"), stdout);
      fputs (HELP_OPTION_DESCRIPTION, stdout); /* 本地化的帮助信息 */
      fputs (VERSION_OPTION_DESCRIPTION, stdout); /* 本地化的版本信息 */
      emit_ancillary_info (); /* 一些辅助信息,如报告bug的邮箱 */
    }
  exit (status);
}

int
main (int argc, char **argv)
{
  initialize_main (&argc, &argv); /* 这个函数是宏为空 */
  set_program_name (argv[0]); /* 设置程序名program_name变量*/
  setlocale (LC_ALL, ""); /* 下面3个函数与本地化有关 */
  bindtextdomain (PACKAGE, LOCALEDIR);
  textdomain (PACKAGE);

  atexit (close_stdout); /* 注册出口函数 */

  parse_long_options (argc, argv, PROGRAM_NAME, PACKAGE_NAME, Version,
                      usage, AUTHORS, (char const *) NULL); /*解析命令行参数,如显示帮助*/
  if (getopt_long (argc, argv, "+", NULL, NULL) != -1) /*如果命令行参数有错,显示帮助*/
    usage (EXIT_FAILURE);

  if (argc <= optind)
    {
      optind = argc;
      argv[argc++] = bad_cast ("y"); /*默认重复打印"y"字符*/
    }

  while (true)
    {
      int i;
      for (i = optind; i < argc; i++)
        if (fputs (argv[i], stdout) == EOF
            || putchar (i == argc - 1 ? '\n' : ' ') == EOF) /*输出每个参数,如果输出完毕则换行*/
          {
            error (0, errno, _("standard output"));
            exit (EXIT_FAILURE);
          }
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值