This is xdebt92.c in view mode; [Download] [Up]
/* Displays the current national debt in a window, updated once a second.
Public domain. By Jamie Zawinski <jwz@lucid.com>.
(you may need to add -DSYSV if timelocal is undefined -- tom)
cc -O -o xdebt xdebt-new.c -lXaw -lXmu -lXt -lX11 -lXext
More mods by sonroc@nemesis.zycad.com [a/k/a twk@zycad.com] to include
per-capita, also small square vs big rect; changed number printing style.
Theoretically, you can run it as:
xdebt [-g +XCOORD+YCOORD] [-update SECS] [-font FONT]
I haven't tested that -font works, but I use
xdebt -g +1080+360
routinely and
xdebt -update 1
also works for me. Your mileage may vary....
--sonroc
More mods by Perry Metzger, (pmetzger@shearson.com); reverted to a
big rectangle, eliminated silly cents field, uped the updates to
once a second, picked a bigger font, changed the labels to suit my
tastes. Easy to change, though.
note by Erik Sowa (sowa@netcom.com)
ultrix 4.2 compilation command:
cc -DSYSV -O -o xdebt92 xdebt92.c -I/usr/include/mit -lXaw -lXmu -lXt -lX11 -lXext
*/
#include <stdio.h>
#include <X11/Xos.h>
#include <X11/Intrinsic.h>
#include <X11/Xaw/Label.h>
#ifdef SYSV
#define timelocal mktime
#endif
typedef double debt_t;
typedef double pop_t;
/* The US Population, and its rate of increase, as of July 1, 1990 */
/* (in people/second) based on numbers from the CIA's World Factbook 1990 */
/* .... thanks to tom@genie.slhs.udel.edu */
#define POP 250410000.0 /* people */
#define POP_DELTA 0.0714151266 /* increase in people per second */
static struct tm pop_tm = { 0, 0, 0, 1, 6, 90 };
/* The US National Debt, and its rate of increase as of June 30, 1992 */
/* (in $/second) based on numbers from the 5 July 1992 Albuquerque Journal */
/* .... thanks to Brooke King brooke@fuchsia.albuq.ingr.com */
#define DEBT 3965170506502.395 /* in dollars */
#define DEBT_DELTA 14132.887 /* Dollars per second */
static struct tm debt_tm = { 0, 0, 0, 30, 05, 92 };
debt_t
national_debt_at (now)
time_t now;
{
time_t debt_date = timelocal (&debt_tm);
time_t seconds_since_then = now - debt_date;
debt_t delta_since_then = DEBT_DELTA * seconds_since_then;
return DEBT + delta_since_then;
}
pop_t
national_pop_at (now)
time_t now;
{
time_t pop_date = timelocal (&pop_tm);
time_t seconds_since_then = now - pop_date;
pop_t delta_since_then = POP_DELTA * seconds_since_then;
return POP + delta_since_then;
}
void
pretty_number(n, buf)
double n;
char buf[256];
{
char tmpBuf[256], *cp, *bp;
int len, count, digits;
/* sprintf(tmpBuf, "%.2lf", n);*/
sprintf(tmpBuf, "%.0lf", n);
len = strlen(tmpBuf);
cp = tmpBuf + len - 1;
bp = buf;
/* copy over the cents and first 3 digits */
/* *bp++ = *cp--; *bp++ = *cp--; *bp++ = *cp--; */
*bp++ = *cp--; *bp++ = *cp--; *bp++ = *cp--;
digits = 7;
/* Now every three digits gets a comma; at 10 digits insert a line at the
comma */
while (cp >= tmpBuf)
{
/* MODIFY NEWLINE IN LARGE NUMBERS HERE */
/* if (digits > 10)
{
*bp++ = ' '; *bp++ = '\n'; digits=0;
}*/
*bp++ = ','; digits++;
for (count = 0; count < 3 && cp >= tmpBuf; count++)
{
*bp++ = *cp--; digits++;
}
}
*bp++ = '\0';
strcpy(tmpBuf, buf);
len = strlen(tmpBuf);
for (count = 0; count < len; count++)
{
buf[(len-1) - count] = tmpBuf[count];
}
buf[len] = '\0';
}
void
construct_string (now, outBuf)
time_t now;
char *outBuf;
{
debt_t debt = national_debt_at(now);
pop_t pop = national_pop_at(now);
char debtBuf[256], shareBuf[256];
pretty_number(debt, debtBuf);
pretty_number(debt/pop, shareBuf);
sprintf(outBuf, "U.S. National Debt:\n$%s\nYour Share:\n$%s", debtBuf, shareBuf);
}
static int update;
/* MODIFY FONT HERE */
static char *defaults[] = {
/* "*Label.font: 12x24",/* /* was times-...-240 */
/* "*Label.font: *-helvetica-bold-r-*-*-*-100-*-*-*-*-*-*", /* was times-...-240 */
"*Label.font: *-times-bold-r-*-*-*-180-*-*-*-*-*-*",
"*title: xdebt92",
"*update: 1",
NULL
};
static XrmOptionDescRec options [] = {
{ "-update", "*update", XrmoptionSepArg, 0 }
};
static void
get_update (dpy) /* Easier than making a subclass... */
Display *dpy;
{
char *name, *class, *type, buf1[255], buf2[255];
XrmValue value;
XtGetApplicationNameAndClass (dpy, &name, &class);
sprintf (buf1, "%s.update", name);
sprintf (buf2, "%s.Update", class);
XrmGetResource (XtDatabase (dpy), buf1, buf2, &type, &value);
if (sscanf (value.addr, " %d ", &update) == 0 || update < 1)
{
fprintf (stderr, "%s: update must be a positive integer, not \"%s\"\n",
name, value.addr);
update = 1;
}
}
static void
timer (w, id)
Widget w;
XtIntervalId id;
{
char buf [255];
Arg av [10];
int ac = 0;
time_t now = time((time_t *)0);
construct_string (now, buf);
XtSetArg (av [ac], XtNlabel, buf); ac++;
XtSetValues (w, av, ac);
XtAppAddTimeOut (XtWidgetToApplicationContext (w), update * 1000, timer, w);
}
void
main (argc, argv)
int argc;
char **argv;
{
XtAppContext app;
Widget shell = XtAppInitialize (&app, "XDebt", options, XtNumber (options),
&argc, argv, defaults, NULL, 0);
Widget label;
XEvent event;
if (argc > 1)
{
fprintf (stderr, "%s: unknown option %s\n", argv[0], argv[1]);
fprintf (stderr, "options: -update <seconds>\n\t -font <font>\n");
exit (-1);
}
label = XtCreateManagedWidget ("label", labelWidgetClass, shell, NULL, 0);
get_update (XtDisplay (label));
timer (label, 0);
XtRealizeWidget (shell);
XtAppMainLoop (app);
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.