Changeset 1765 in MondoRescue for branches/2.2.5/mindi-busybox/coreutils/cal.c


Ignore:
Timestamp:
Nov 4, 2007, 3:16:40 AM (16 years ago)
Author:
Bruno Cornec
Message:

Update to busybox 1.7.2

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/2.2.5/mindi-busybox/coreutils/cal.c

    r821 r1765  
     1/* vi: set sw=4 ts=4: */
    12/*
    23 * Calendar implementation for busybox
     
    45 * See original copyright at the end of this file
    56 *
    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 */
    219
    2210/* BB_AUDIT SUSv3 compliant with -j and -y extensions (from util-linux). */
     
    3018 */
    3119
    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 */
    4523
    4624#define THURSDAY        4       /* for reformation */
     
    5331#define SPACE           -1      /* used in day array */
    5432
    55 static const char days_in_month[] = {
     33static const unsigned char days_in_month[] ALIGN1 = {
    5634    0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
    5735};
    5836
    59 static const char sep1752[] = {
    60             1, 2,  14, 15, 16,
     37static const unsigned char sep1752[] ALIGN1 = {
     38        1, 2,  14, 15, 16,
    6139    17, 18, 19, 20, 21, 22, 23,
    6240    24, 25, 26, 27, 28, 29, 30
    6341};
    6442
    65 static int julian;
     43static unsigned julian;
    6644
    6745/* 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)
     46static int leap_year(unsigned yr)
     47{
     48    if (yr <= 1752)
     49        return !(yr % 4);
     50    return (!(yr % 4) && (yr % 100)) || !(yr % 400);
     51}
    7852
    7953/* number of centuries since 1700, not inclusive */
     
    8963    ((yr) / 4 - centuries_since_1700(yr) + quad_centuries_since_1700(yr))
    9064
    91 static void center (char *, int, int);
    92 static void day_array (int, int, int *);
    93 static void trim_trailing_spaces_and_print (char *);
     65static void center(char *, unsigned, unsigned);
     66static void day_array(unsigned, unsigned, unsigned *);
     67static void trim_trailing_spaces_and_print(char *);
    9468
    9569static void blank_string(char *buf, size_t buflen);
    96 static char *build_row(char *p, int *dp);
     70static char *build_row(char *p, unsigned *dp);
    9771
    9872#define DAY_LEN     3       /* 3 spaces per day */
     
    10276#define HEAD_SEP    2       /* spaces between day headings */
    10377
     78int cal_main(int argc, char **argv);
    10479int cal_main(int argc, char **argv)
    10580{
     
    10782    struct tm zero_tm;
    10883    time_t now;
    109     int month, year, flags, i;
     84    unsigned month, year, flags, i;
    11085    char *month_names[12];
    11186    char day_headings[28];  /* 28 for julian, 21 for nonjulian */
    11287    char buf[40];
    11388
    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");
    12090    julian = flags & 1;
    121 
     91    month = 0;
    12292    argv += optind;
    123 
    124     month = 0;
    125 
    126     if ((argc -= optind) > 2) {
     93    argc -= optind;
     94
     95    if (argc > 2) {
    12796        bb_show_usage();
    12897    }
     
    137106    } else {
    138107        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 +  7*julian);
     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);
    145114
    146115    i = 0;
     
    148117        zero_tm.tm_mon = i;
    149118        strftime(buf, sizeof(buf), "%B", &zero_tm);
    150         month_names[i] = bb_xstrdup(buf);
     119        month_names[i] = xstrdup(buf);
    151120
    152121        if (i < 7) {
     
    158127
    159128    if (month) {
    160         int row, len, days[MAXDAYS];
    161         int *dp = days;
     129        unsigned row, len, days[MAXDAYS];
     130        unsigned *dp = days;
    162131        char lineout[30];
    163132
    164133        day_array(month, year, dp);
    165134        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",
    167136               ((7*julian + WEEK_LEN) - len) / 2, "",
    168137               lineout, day_headings);
     
    173142        }
    174143    } else {
    175         int row, which_cal, week_len, days[12][MAXDAYS];
    176         int *dp;
     144        unsigned row, which_cal, week_len, days[12][MAXDAYS];
     145        unsigned *dp;
    177146        char lineout[80];
    178147
     
    195164            }
    196165            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);
    198167            if (!julian) {
    199                 bb_printf("%*s%s", HEAD_SEP, "", day_headings);
     168                printf("%*s%s", HEAD_SEP, "", day_headings);
    200169            }
    201170            putchar('\n');
     
    211180    }
    212181
    213     bb_fflush_stdout_and_exit(0);
     182    fflush_stdout_and_exit(0);
    214183}
    215184
     
    221190 *  builds that array for any month from Jan. 1 through Dec. 9999.
    222191 */
    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;
     192static void day_array(unsigned month, unsigned year, unsigned *days)
     193{
     194    unsigned long temp;
     195    unsigned i;
     196    unsigned day, dw, dm;
    229197
    230198    memset(days, SPACE, MAXDAYS * sizeof(int));
    231199
    232200    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;
    233205        size_t oday = 0;
    234        
    235         j_offset = julian * 244;
     206
    236207        do {
    237208            days[oday+2] = sep1752[oday] + j_offset;
     
    242213
    243214    /* day_in_year
    244      *  return the 1 based day number within the year
     215     * return the 1 based day number within the year
    245216     */
    246217    day = 1;
     
    255226
    256227    /* day_in_week
    257      *  return the 0 based day number for any date from 1 Jan. 1 to
    258      *  31 Dec. 9999.  Assumes the Gregorian reformation eliminates
    259      *  3 Sep. 1752 through 13 Sep. 1752.  Returns Thursday for all
    260      *  missing days.
     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.
    261232     */
    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;
    265234    if (temp < FIRST_MISSING_DAY) {
    266235        dw = ((temp - 1 + SATURDAY) % 7);
    267     } else if (temp >= (FIRST_MISSING_DAY + NUMBER_MISSING_DAYS)) {
     236    } else {
    268237        dw = (((temp - 1 + SATURDAY) - NUMBER_MISSING_DAYS) % 7);
    269238    }
     
    278247    }
    279248
    280     while (dm) {
     249    do {
    281250        days[dw++] = day++;
    282         --dm;
    283     }
     251    } while (--dm);
    284252}
    285253
     
    291259        ++p;
    292260    }
    293     while (p > s) {
     261    while (p != s) {
    294262        --p;
    295263        if (!(isspace)(*p)) {   /* We want the function... not the inline. */
     
    302270}
    303271
    304 static void center(char *str, int len, int separate)
    305 {
    306     int n = strlen(str);
     272static void center(char *str, unsigned len, unsigned separate)
     273{
     274    unsigned n = strlen(str);
    307275    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, "");
    309277}
    310278
     
    315283}
    316284
    317 static char *build_row(char *p, int *dp)
    318 {
    319     int col, val, day;
     285static char *build_row(char *p, unsigned *dp)
     286{
     287    unsigned col, val, day;
    320288
    321289    memset(p, ' ', (julian + DAY_LEN) * 7);
     
    323291    col = 0;
    324292    do {
    325         if ((day = *dp++) != SPACE) {
     293        day = *dp++;
     294        if (day != SPACE) {
    326295            if (julian) {
    327296                ++p;
     
    332301                }
    333302            }
    334             if ((val = day / 10) > 0) {
     303            val = day / 10;
     304            if (val > 0) {
    335305                *p = val + '0';
    336306            }
     
    376346 * SUCH DAMAGE.
    377347 */
    378 
    379 
Note: See TracChangeset for help on using the changeset viewer.