Changeset 1770 in MondoRescue for branches/stable/mindi-busybox/coreutils/cal.c
- Timestamp:
- Nov 6, 2007, 11:01:53 AM (16 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/stable/mindi-busybox/coreutils/cal.c
r821 r1770 1 /* vi: set sw=4 ts=4: */ 1 2 /* 2 3 * Calendar implementation for busybox … … 4 5 * See original copyright at the end of this file 5 6 * 6 * This program is free software; you can redistribute it and/or modify 7 * it under the terms of the GNU General Public License as published by 8 * the Free Software Foundation; either version 2 of the License, or 9 * (at your option) any later version. 10 * 11 * This program is distributed in the hope that it will be useful, 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14 * General Public License for more details. 15 * 16 * You should have received a copy of the GNU General Public License 17 * along with this program; if not, write to the Free Software 18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 19 * 20 */ 7 * Licensed under GPLv2 or later, see file LICENSE in this tarball for details. 8 */ 21 9 22 10 /* BB_AUDIT SUSv3 compliant with -j and -y extensions (from util-linux). */ … … 30 18 */ 31 19 32 #include <sys/types.h> 33 #include <ctype.h> 34 #include <stdio.h> 35 #include <stdlib.h> 36 #include <string.h> 37 #include <time.h> 38 #include <unistd.h> 39 40 #include "busybox.h" 41 42 #ifdef CONFIG_LOCALE_SUPPORT 43 #include <locale.h> 44 #endif 20 #include "libbb.h" 21 22 /* We often use "unsigned" intead of "int", it's easier to div on most CPUs */ 45 23 46 24 #define THURSDAY 4 /* for reformation */ … … 53 31 #define SPACE -1 /* used in day array */ 54 32 55 static const char days_in_month[]= {33 static const unsigned char days_in_month[] ALIGN1 = { 56 34 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 57 35 }; 58 36 59 static const char sep1752[]= {60 37 static const unsigned char sep1752[] ALIGN1 = { 38 1, 2, 14, 15, 16, 61 39 17, 18, 19, 20, 21, 22, 23, 62 40 24, 25, 26, 27, 28, 29, 30 63 41 }; 64 42 65 static intjulian;43 static unsigned julian; 66 44 67 45 /* leap year -- account for Gregorian reformation in 1752 */ 68 #define leap_year(yr) \ 69 ((yr) <= 1752 ? !((yr) % 4) : \ 70 (!((yr) % 4) && ((yr) % 100)) || !((yr) % 400)) 71 72 static int is_leap_year(int year) 73 { 74 return leap_year(year); 75 } 76 #undef leap_year 77 #define leap_year(yr) is_leap_year(yr) 46 static int leap_year(unsigned yr) 47 { 48 if (yr <= 1752) 49 return !(yr % 4); 50 return (!(yr % 4) && (yr % 100)) || !(yr % 400); 51 } 78 52 79 53 /* number of centuries since 1700, not inclusive */ … … 89 63 ((yr) / 4 - centuries_since_1700(yr) + quad_centuries_since_1700(yr)) 90 64 91 static void center (char *, int, int);92 static void day_array (int, int, int*);93 static void trim_trailing_spaces_and_print 65 static void center(char *, unsigned, unsigned); 66 static void day_array(unsigned, unsigned, unsigned *); 67 static void trim_trailing_spaces_and_print(char *); 94 68 95 69 static void blank_string(char *buf, size_t buflen); 96 static char *build_row(char *p, int*dp);70 static char *build_row(char *p, unsigned *dp); 97 71 98 72 #define DAY_LEN 3 /* 3 spaces per day */ … … 102 76 #define HEAD_SEP 2 /* spaces between day headings */ 103 77 78 int cal_main(int argc, char **argv); 104 79 int cal_main(int argc, char **argv) 105 80 { … … 107 82 struct tm zero_tm; 108 83 time_t now; 109 intmonth, year, flags, i;84 unsigned month, year, flags, i; 110 85 char *month_names[12]; 111 86 char day_headings[28]; /* 28 for julian, 21 for nonjulian */ 112 87 char buf[40]; 113 88 114 #ifdef CONFIG_LOCALE_SUPPORT 115 setlocale(LC_TIME, ""); 116 #endif 117 118 flags = bb_getopt_ulflags(argc, argv, "jy"); 119 89 flags = getopt32(argv, "jy"); 120 90 julian = flags & 1; 121 91 month = 0; 122 92 argv += optind; 123 124 month = 0; 125 126 if ((argc -= optind) > 2) { 93 argc -= optind; 94 95 if (argc > 2) { 127 96 bb_show_usage(); 128 97 } … … 137 106 } else { 138 107 if (argc == 2) { 139 month = bb_xgetularg10_bnd(*argv++, 1, 12);140 } 141 year = bb_xgetularg10_bnd(*argv, 1, 9999);142 } 143 144 blank_string(day_headings, sizeof(day_headings) - 7 + 108 month = xatou_range(*argv++, 1, 12); 109 } 110 year = xatou_range(*argv, 1, 9999); 111 } 112 113 blank_string(day_headings, sizeof(day_headings) - 7 + 7*julian); 145 114 146 115 i = 0; … … 148 117 zero_tm.tm_mon = i; 149 118 strftime(buf, sizeof(buf), "%B", &zero_tm); 150 month_names[i] = bb_xstrdup(buf);119 month_names[i] = xstrdup(buf); 151 120 152 121 if (i < 7) { … … 158 127 159 128 if (month) { 160 introw, len, days[MAXDAYS];161 int*dp = days;129 unsigned row, len, days[MAXDAYS]; 130 unsigned *dp = days; 162 131 char lineout[30]; 163 132 164 133 day_array(month, year, dp); 165 134 len = sprintf(lineout, "%s %d", month_names[month - 1], year); 166 bb_printf("%*s%s\n%s\n",135 printf("%*s%s\n%s\n", 167 136 ((7*julian + WEEK_LEN) - len) / 2, "", 168 137 lineout, day_headings); … … 173 142 } 174 143 } else { 175 introw, which_cal, week_len, days[12][MAXDAYS];176 int*dp;144 unsigned row, which_cal, week_len, days[12][MAXDAYS]; 145 unsigned *dp; 177 146 char lineout[80]; 178 147 … … 195 164 } 196 165 center(month_names[month + 2 - julian], week_len, 0); 197 bb_printf("\n%s%*s%s", day_headings, HEAD_SEP, "", day_headings);166 printf("\n%s%*s%s", day_headings, HEAD_SEP, "", day_headings); 198 167 if (!julian) { 199 bb_printf("%*s%s", HEAD_SEP, "", day_headings);168 printf("%*s%s", HEAD_SEP, "", day_headings); 200 169 } 201 170 putchar('\n'); … … 211 180 } 212 181 213 bb_fflush_stdout_and_exit(0);182 fflush_stdout_and_exit(0); 214 183 } 215 184 … … 221 190 * builds that array for any month from Jan. 1 through Dec. 9999. 222 191 */ 223 static void day_array(int month, int year, int *days) 224 { 225 long temp; 226 int i; 227 int j_offset; 228 int day, dw, dm; 192 static void day_array(unsigned month, unsigned year, unsigned *days) 193 { 194 unsigned long temp; 195 unsigned i; 196 unsigned day, dw, dm; 229 197 230 198 memset(days, SPACE, MAXDAYS * sizeof(int)); 231 199 232 200 if ((month == 9) && (year == 1752)) { 201 /* Assumes the Gregorian reformation eliminates 202 * 3 Sep. 1752 through 13 Sep. 1752. 203 */ 204 unsigned j_offset = julian * 244; 233 205 size_t oday = 0; 234 235 j_offset = julian * 244; 206 236 207 do { 237 208 days[oday+2] = sep1752[oday] + j_offset; … … 242 213 243 214 /* day_in_year 244 * 215 * return the 1 based day number within the year 245 216 */ 246 217 day = 1; … … 255 226 256 227 /* day_in_week 257 * 258 * 259 * 260 * 228 * return the 0 based day number for any date from 1 Jan. 1 to 229 * 31 Dec. 9999. Assumes the Gregorian reformation eliminates 230 * 3 Sep. 1752 through 13 Sep. 1752. Returns Thursday for all 231 * missing days. 261 232 */ 262 dw = THURSDAY; 263 temp = (long)(year - 1) * 365 + leap_years_since_year_1(year - 1) 264 + day; 233 temp = (long)(year - 1) * 365 + leap_years_since_year_1(year - 1) + day; 265 234 if (temp < FIRST_MISSING_DAY) { 266 235 dw = ((temp - 1 + SATURDAY) % 7); 267 } else if (temp >= (FIRST_MISSING_DAY + NUMBER_MISSING_DAYS)){236 } else { 268 237 dw = (((temp - 1 + SATURDAY) - NUMBER_MISSING_DAYS) % 7); 269 238 } … … 278 247 } 279 248 280 while (dm){249 do { 281 250 days[dw++] = day++; 282 --dm; 283 } 251 } while (--dm); 284 252 } 285 253 … … 291 259 ++p; 292 260 } 293 while (p >s) {261 while (p != s) { 294 262 --p; 295 263 if (!(isspace)(*p)) { /* We want the function... not the inline. */ … … 302 270 } 303 271 304 static void center(char *str, int len, intseparate)305 { 306 intn = strlen(str);272 static void center(char *str, unsigned len, unsigned separate) 273 { 274 unsigned n = strlen(str); 307 275 len -= n; 308 bb_printf("%*s%*s", (len/2) + n, str, (len/2) + (len % 2) + separate, "");276 printf("%*s%*s", (len/2) + n, str, (len/2) + (len % 2) + separate, ""); 309 277 } 310 278 … … 315 283 } 316 284 317 static char *build_row(char *p, int*dp)318 { 319 intcol, val, day;285 static char *build_row(char *p, unsigned *dp) 286 { 287 unsigned col, val, day; 320 288 321 289 memset(p, ' ', (julian + DAY_LEN) * 7); … … 323 291 col = 0; 324 292 do { 325 if ((day = *dp++) != SPACE) { 293 day = *dp++; 294 if (day != SPACE) { 326 295 if (julian) { 327 296 ++p; … … 332 301 } 333 302 } 334 if ((val = day / 10) > 0) { 303 val = day / 10; 304 if (val > 0) { 335 305 *p = val + '0'; 336 306 } … … 376 346 * SUCH DAMAGE. 377 347 */ 378 379
Note:
See TracChangeset
for help on using the changeset viewer.