2
3
4
5
6
7
8
17#ifdef __USE_GNU_GETTEXT
19#define _(String) gettext(String)
20#define gettext_noop(String) String
21#define N_(String) gettext_noop(String)
23#define _(String) (String)
24#define N_(String) String
25#define textdomain(Domain)
26#define bindtextdomain(Package, Directory)
28char month[12][4] = {
_(
"Jan"),
_(
"Feb"),
_(
"Mar"),
_(
"Apr"),
_(
"May"),
_(
"Jun"),
29 _(
"Jul"),
_(
"Aug"),
_(
"Sep"),
_(
"Oct"),
_(
"Nov"),
_(
"Dec")};
37 double year_total_interest;
41int main(
int argc,
char **argv) {
42 setlocale(LC_NUMERIC,
"");
44 ((strcmp(argv[1],
_(
"--help")) == 0 || strcmp(argv[1],
"-h") == 0) ||
46 printf(
_(
"Usage: amort [present_value][number_of_payments] [interest_rate][payment_amount][yyyy-mm-dd]\n\n"));
50 Amort *amort = malloc(
sizeof(Amort));
51 sscanf(argv[1],
_(
"%lf"), &amort->pv);
52 sscanf(argv[2],
_(
"%lf"), &amort->n);
53 sscanf(argv[3],
_(
"%lf"), &amort->i);
54 sscanf(argv[4],
_(
"%lf"), &amort->pmt);
55 if (amort->pv == 0 || amort->n == 0 || amort->i == 0 || amort->pmt == 0 ||
57 fprintf(stderr,
_(
"Error: All arguments must be non-zero.\n"));
60 amort->interest = amort->pv * amort->i / 1200;
61 if (amort->interest > amort->pmt) {
62 fprintf(stderr,
_(
"Error: Payment amount less than interest\n"));
65 memset(&tm, 0,
sizeof(tm));
66 if (strptime(argv[5],
_(
"%Y-%m-%d"), &tm) == NULL)
67 if (strptime(argv[5],
_(
"%Y%m%d"), &tm) == NULL)
68 printf(
_(
"Error: Invalid date format. Use yyyy-mm-dd or yyyymmdd.\n")),
70 amort->year_total_interest = 0;
72 printf(
"First Payment: %04d-%02d-%02d\n\n", tm.tm_year + 1900,
73 tm.tm_mon + 1, tm.tm_mday);
74 printf(
_(
" Per Mth Year Balance Payment Principal Interest\n"));
75 printf(
_(
"---- --- ---- ------------ ---------- ---------- ----------\n"));
77 for (
int x = 0; x < amort->n; x++) {
80 m = (x + tm.tm_mon) % 12;
81 int y = ((x + tm.tm_mon) / 12) + tm.tm_year + 1900;
82 amort->interest = amort->pv * amort->i / 1200;
83 amort->year_total_interest += amort->interest;
84 if (amort->pv + amort->interest < amort->pmt) {
85 amort->pmt = amort->pv + amort->interest;
86 amort->principal = amort->pv;
88 amort->principal = amort->pmt - amort->interest;
89 amort->pv -= amort->principal;
90 printf(
"%4d %4s %4d %'12.2f %'10.2f %'10.2f %'10.2f\n", x + 1,
month[m],
91 y, amort->pv, amort->pmt, amort->principal, amort->interest);
101 printf(
_(
" ----------\n"));
102 printf(
_(
" %'10.2f\n"),
103 amort->year_total_interest);
104 printf(
_(
" ==========\n\n"));
105 amort->year_total_interest = 0;
int main(int argc, char **argv)
Capture the current terminal settings for later restoration.
void print_totals(Amort *)