#include <stdio.h>
/*
 * This example demonstrates a simple use of static data.  It also makes some
 * more advanced use of printf.  The program prints a very simple ledger.  The
 * function print_line keeps a running balance, printing one line each time it
 * is called.  It uses static data to keep track of the total, and to condition
 * the first call to print headers.  The use of static is important, since
 * the value of the first flag and of the balance must persist between calls
 * to print_line.
 */
/*
 * Print table line.  It receives a description and an amount. 
 */
void print_line(char *descr, double amt)
{
        static int first = 1;           /* Identifies first call. */
        static double balance = 0.0;    /* Running balance. */
        /* First time through, print header line. */
        if(first)
        {
                printf("%-20s%10s%10s\n", "Description", "Amount", "Balance");
                printf("%-20s%10s%10.2f\n", "Initial Balance", "", 0.0);
                first = 0;
        }
        /* Now, process the transaction, and print. */
        balance += amt;
        printf("%-20s%10.2f%10.2f\n", descr, amt, balance);
}
/* Just a convenient place to keep pairs of test data arguments for 
   print_line. */
struct legdat
{
        char *descr;
        double amt;
};
/*
 * Just a boring test driver
 */
main()
{
        /* Lists of data to send to the ledger. */
        struct legdat legdat[] = {
                "Paycheck", 1579.17,
                "Gas", -14.56,
                "Rent", -550.16,
                "Refund", 33.45,
                "Pizza Party", -155.18,
                "New Carpet", -250.00,
                NULL };
        struct legdat *scan;
        /* Go through the data and print the lines. */
        for(scan = legdat; scan->descr != NULL; ++scan)
                print_line(scan->descr, scan->amt);
}