cal: small code shrink
No binary (build failed)
—
(log yok)
| @@ -19,6 +19,8 @@ | |
| #include "libbb.h" | |
| + | /* We often use "unsigned" intead of "int", it's easier to div on most CPUs */ |
| + | |
| #define THURSDAY 4 /* for reformation */ | |
| #define SATURDAY 6 /* 1 Jan 1 was a Saturday */ | |
| @@ -28,29 +30,25 @@ | |
| #define MAXDAYS 42 /* max slots in a month array */ | |
| #define SPACE -1 /* used in day array */ | |
| - | static const char days_in_month[] = { |
| + | static const unsigned char days_in_month[] = { |
| 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 | |
| }; | |
| - | static const char sep1752[] = { |
| + | static const unsigned char sep1752[] = { |
| 1, 2, 14, 15, 16, | |
| 17, 18, 19, 20, 21, 22, 23, | |
| 24, 25, 26, 27, 28, 29, 30 | |
| }; | |
| - | static int julian; |
| + | static unsigned julian; |
| /* leap year -- account for Gregorian reformation in 1752 */ | |
| - | #define leap_year(yr) \ |
| - | ((yr) <= 1752 ? !((yr) % 4) : \ |
| - | (!((yr) % 4) && ((yr) % 100)) || !((yr) % 400)) |
| - | |
| - | static int is_leap_year(int year) |
| + | static int leap_year(unsigned yr) |
| { | |
| - | return leap_year(year); |
| + | if (yr <= 1752) |
| + | return !(yr % 4); |
| + | return (!(yr % 4) && (yr % 100)) || !(yr % 400); |
| } | |
| - | #undef leap_year |
| - | #define leap_year(yr) is_leap_year(yr) |
| /* number of centuries since 1700, not inclusive */ | |
| #define centuries_since_1700(yr) \ | |
| @@ -64,12 +62,12 @@ static int is_leap_year(int year) | |
| #define leap_years_since_year_1(yr) \ | |
| ((yr) / 4 - centuries_since_1700(yr) + quad_centuries_since_1700(yr)) | |
| - | static void center (char *, int, int); |
| - | static void day_array (int, int, int *); |
| - | static void trim_trailing_spaces_and_print (char *); |
| + | static void center(char *, unsigned, unsigned); |
| + | static void day_array(unsigned, unsigned, unsigned *); |
| + | static void trim_trailing_spaces_and_print(char *); |
| static void blank_string(char *buf, size_t buflen); | |
| - | static char *build_row(char *p, int *dp); |
| + | static char *build_row(char *p, unsigned *dp); |
| #define DAY_LEN 3 /* 3 spaces per day */ | |
| #define J_DAY_LEN (DAY_LEN + 1) | |
| @@ -83,20 +81,18 @@ int cal_main(int argc, char **argv) | |
| struct tm *local_time; | |
| struct tm zero_tm; | |
| time_t now; | |
| - | int month, year, flags, i; |
| + | unsigned month, year, flags, i; |
| char *month_names[12]; | |
| char day_headings[28]; /* 28 for julian, 21 for nonjulian */ | |
| char buf[40]; | |
| flags = getopt32(argc, argv, "jy"); | |
| - | |
| julian = flags & 1; | |
| - | |
| - | argv += optind; |
| - | |
| month = 0; | |
| + | argv += optind; |
| + | argc -= optind; |
| - | if ((argc -= optind) > 2) { |
| + | if (argc > 2) { |
| bb_show_usage(); | |
| } | |
| @@ -109,12 +105,12 @@ int cal_main(int argc, char **argv) | |
| } | |
| } else { | |
| if (argc == 2) { | |
| - | month = xatoul_range(*argv++, 1, 12); |
| + | month = xatou_range(*argv++, 1, 12); |
| } | |
| - | year = xatoul_range(*argv, 1, 9999); |
| + | year = xatou_range(*argv, 1, 9999); |
| } | |
| - | blank_string(day_headings, sizeof(day_headings) - 7 + 7*julian); |
| + | blank_string(day_headings, sizeof(day_headings) - 7 + 7*julian); |
| i = 0; | |
| do { | |
| @@ -130,8 +126,8 @@ int cal_main(int argc, char **argv) | |
| } while (++i < 12); | |
| if (month) { | |
| - | int row, len, days[MAXDAYS]; |
| - | int *dp = days; |
| + | unsigned row, len, days[MAXDAYS]; |
| + | unsigned *dp = days; |
| char lineout[30]; | |
| day_array(month, year, dp); | |
| @@ -145,8 +141,8 @@ int cal_main(int argc, char **argv) | |
| trim_trailing_spaces_and_print(lineout); | |
| } | |
| } else { | |
| - | int row, which_cal, week_len, days[12][MAXDAYS]; |
| - | int *dp; |
| + | unsigned row, which_cal, week_len, days[12][MAXDAYS]; |
| + | unsigned *dp; |
| char lineout[80]; | |
| sprintf(lineout, "%d", year); | |
| @@ -193,19 +189,21 @@ int cal_main(int argc, char **argv) | |
| * out end to end. You would have 42 numbers or spaces. This routine | |
| * builds that array for any month from Jan. 1 through Dec. 9999. | |
| */ | |
| - | static void day_array(int month, int year, int *days) |
| + | static void day_array(unsigned month, unsigned year, unsigned *days) |
| { | |
| - | long temp; |
| - | int i; |
| - | int j_offset; |
| - | int day, dw, dm; |
| + | unsigned long temp; |
| + | unsigned i; |
| + | unsigned day, dw, dm; |
| memset(days, SPACE, MAXDAYS * sizeof(int)); | |
| if ((month == 9) && (year == 1752)) { | |
| + | /* Assumes the Gregorian reformation eliminates |
| + | * 3 Sep. 1752 through 13 Sep. 1752. |
| + | */ |
| + | unsigned j_offset = julian * 244; |
| size_t oday = 0; | |
| - | j_offset = julian * 244; |
| do { | |
| days[oday+2] = sep1752[oday] + j_offset; | |
| } while (++oday < sizeof(sep1752)); | |
| @@ -214,7 +212,7 @@ static void day_array(int month, int year, int *days) | |
| } | |
| /* day_in_year | |
| - | * return the 1 based day number within the year |
| + | * return the 1 based day number within the year |
| */ | |
| day = 1; | |
| if ((month > 2) && leap_year(year)) { | |
| @@ -227,17 +225,15 @@ static void day_array(int month, int year, int *days) | |
| } | |
| /* day_in_week | |
| - | * return the 0 based day number for any date from 1 Jan. 1 to |
| - | * 31 Dec. 9999. Assumes the Gregorian reformation eliminates |
| - | * 3 Sep. 1752 through 13 Sep. 1752. Returns Thursday for all |
| - | * missing days. |
| + | * return the 0 based day number for any date from 1 Jan. 1 to |
| + | * 31 Dec. 9999. Assumes the Gregorian reformation eliminates |
| + | * 3 Sep. 1752 through 13 Sep. 1752. Returns Thursday for all |
| + | * missing days. |
| */ | |
| - | dw = THURSDAY; |
| - | temp = (long)(year - 1) * 365 + leap_years_since_year_1(year - 1) |
| - | + day; |
| + | temp = (long)(year - 1) * 365 + leap_years_since_year_1(year - 1) + day; |
| if (temp < FIRST_MISSING_DAY) { | |
| dw = ((temp - 1 + SATURDAY) % 7); | |
| - | } else if (temp >= (FIRST_MISSING_DAY + NUMBER_MISSING_DAYS)) { |
| + | } else { |
| dw = (((temp - 1 + SATURDAY) - NUMBER_MISSING_DAYS) % 7); | |
| } | |
| @@ -250,10 +246,9 @@ static void day_array(int month, int year, int *days) | |
| ++dm; | |
| } | |
| - | while (dm) { |
| + | do { |
| days[dw++] = day++; | |
| - | --dm; |
| - | } |
| + | } while (--dm); |
| } | |
| static void trim_trailing_spaces_and_print(char *s) | |
| @@ -263,7 +258,7 @@ static void trim_trailing_spaces_and_print(char *s) | |
| while (*p) { | |
| ++p; | |
| } | |
| - | while (p > s) { |
| + | while (p != s) { |
| --p; | |
| if (!(isspace)(*p)) { /* We want the function... not the inline. */ | |
| p[1] = '\0'; | |
| @@ -274,9 +269,9 @@ static void trim_trailing_spaces_and_print(char *s) | |
| puts(s); | |
| } | |
| - | static void center(char *str, int len, int separate) |
| + | static void center(char *str, unsigned len, unsigned separate) |
| { | |
| - | int n = strlen(str); |
| + | unsigned n = strlen(str); |
| len -= n; | |
| printf("%*s%*s", (len/2) + n, str, (len/2) + (len % 2) + separate, ""); | |
| } | |
| @@ -287,15 +282,16 @@ static void blank_string(char *buf, size_t buflen) | |
| buf[buflen-1] = '\0'; | |
| } | |
| - | static char *build_row(char *p, int *dp) |
| + | static char *build_row(char *p, unsigned *dp) |
| { | |
| - | int col, val, day; |
| + | unsigned col, val, day; |
| memset(p, ' ', (julian + DAY_LEN) * 7); | |
| col = 0; | |
| do { | |
| - | if ((day = *dp++) != SPACE) { |
| + | day = *dp++; |
| + | if (day != SPACE) { |
| if (julian) { | |
| ++p; | |
| if (day >= 100) { | |
| @@ -304,7 +300,8 @@ static char *build_row(char *p, int *dp) | |
| day %= 100; | |
| } | |
| } | |
| - | if ((val = day / 10) > 0) { |
| + | val = day / 10; |
| + | if (val > 0) { |
| *p = val + '0'; | |
| } | |
| *++p = day % 10 + '0'; | |
| @@ -348,5 +345,3 @@ static char *build_row(char *p, int *dp) | |
| * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |
| * SUCH DAMAGE. | |
| */ | |
| - | |
| - | |