(add_tabstop): Give correct size when reallocating tab_list buffer.
[platform/upstream/coreutils.git] / src / sleep.c
1 /* sleep - delay for a specified amount of time.
2    Copyright (C) 84, 91, 92, 93, 94, 1995 Free Software Foundation, Inc.
3
4    This program is free software; you can redistribute it and/or modify
5    it under the terms of the GNU General Public License as published by
6    the Free Software Foundation; either version 2, or (at your option)
7    any later version.
8
9    This program is distributed in the hope that it will be useful,
10    but WITHOUT ANY WARRANTY; without even the implied warranty of
11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12    GNU General Public License for more details.
13
14    You should have received a copy of the GNU General Public License
15    along with this program; if not, write to the Free Software
16    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
17
18 #include <config.h>
19 #include <stdio.h>
20 #include <sys/types.h>
21 #include <getopt.h>
22
23 #include "version.h"
24 #include "system.h"
25 #include "error.h"
26
27 static long argdecode ();
28
29 /* The name by which this program was run. */
30 char *program_name;
31
32 /* If non-zero, display usage information and exit.  */
33 static int show_help;
34
35 /* If non-zero, print the version on standard output and exit.  */
36 static int show_version;
37
38 static struct option const long_options[] =
39 {
40   {"help", no_argument, &show_help, 1},
41   {"version", no_argument, &show_version, 1},
42   {0, 0, 0, 0}
43 };
44
45 static void
46 usage (status)
47      int status;
48 {
49   if (status != 0)
50     fprintf (stderr, "Try `%s --help' for more information.\n",
51              program_name);
52   else
53     {
54       printf ("Usage: %s [OPTION]... NUMBER[SUFFIX]\n", program_name);
55       printf ("\
56 \n\
57   --help      display this help and exit\n\
58   --version   output version information and exit\n\
59 \n\
60 SUFFIX may be s for seconds, m for minutes, h for hours or d for days.\n\
61 ");
62     }
63   exit (status);
64 }
65
66 void
67 main (argc, argv)
68      int argc;
69      char **argv;
70 {
71   int i;
72   unsigned seconds = 0;
73   int c;
74
75   program_name = argv[0];
76
77   while ((c = getopt_long (argc, argv, "", long_options, (int *) 0)) != EOF)
78     {
79       switch (c)
80         {
81         case 0:
82           break;
83
84         default:
85           usage (1);
86         }
87     }
88
89   if (show_version)
90     {
91       printf ("sleep - %s\n", version_string);
92       exit (0);
93     }
94
95   if (show_help)
96     usage (0);
97
98   if (argc == 1)
99     {
100       error (0, 0, "too few arguments");
101       usage (1);
102     }
103
104   for (i = 1; i < argc; i++)
105     seconds += argdecode (argv[i]);
106
107   sleep (seconds);
108
109   exit (0);
110 }
111
112 static long
113 argdecode (s)
114      char *s;
115 {
116   long value;
117   register char *p = s;
118   register char c;
119
120   value = 0;
121   while ((c = *p++) >= '0' && c <= '9')
122     value = value * 10 + c - '0';
123
124   switch (c)
125     {
126     case 's':
127       break;
128     case 'm':
129       value *= 60;
130       break;
131     case 'h':
132       value *= 60 * 60;
133       break;
134     case 'd':
135       value *= 60 * 60 * 24;
136       break;
137     default:
138       p--;
139     }
140
141   if (*p)
142     error (1, 0, "invalid time interval `%s'", s);
143   return value;
144 }