ftp.nice.ch/pub/next/tools/business/USDebtWatch.0.3.NIHS.bs.tar.gz#/USDebtWatch/unix-version/xdebt92.c

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.