[net.micro.cbm] lib.c - Maintain a "C-POWER" library

dwl10@amdahl.UUCP (Dave Lowrey) (08/19/85)

There was a request for a program to maintain C-POWER librarys.
This program came from Brian Hilchie, and is also avaliable from
the PROLINE BBS.

===================================================================

/*
    Create and mantain library files.
    Library file names must end
    with  ".l"
*/

#include <stdio.h>

#define  MAXLIB  200
#define  MAXID    20
#define  MAXLINE  81

char ids[MAXLIB][MAXID], files[MAXLIB][MAXID];
char size;
char inbuf[MAXLINE];

main()
{
    size = 0;
    for (;;) {
        clrscrn();
        printf ("\n\n\n\n\n     Load library\n");
        printf ("     Save library\n");
        printf ("     Clear library\n");
        printf ("     Display library\n");
        printf ("     Add modules to library\n");
        printf ("     Remove modules from library\n");
        printf ("     Quit\n\n     Enter Choice: ");
        gets (inbuf);
        clrscrn();
        switch (*inbuf) {
            case 'l':
            case 'L':
                      load();
                      break;
            case 's':
            case 'S':
                      save();
                      break;
            case 'd':
            case 'D':
                      display();
                      break;
            case 'c':
            case 'C':
                      size = 0;
                      break;
            case 'a':
            case 'A':
                      add();
                      break;
            case 'r':
            case 'R':
                      remove();
                      break;
            case 'q':
            case 'Q':
                      putchar ('\n');
                      exit();
        }
    }
    putchar ('\n');
}


clrscrn()
{
    putchar ('\223');
}


FILE openlib (mode)
char *mode;
{
    FILE f;

    printf ("\n\nlibrary file name: ");
    gets (inbuf);
    f = fopen (inbuf, mode);
    if (f == NULL || ferror()) {
        f = NULL;
        printf ("\ncan't open %s\n", inbuf);
        wait();
    }
    return f;
}


load()
{
    FILE f;
    unsigned i;

    if ((f = openlib ("r")) == NULL)
        return;
    size = getc(f);
    for (i = 0; i < size; i++) {
        getid (ids[i], f);
        getid (files[i], f);
    }
    fclose(f);
}


getid (s, f)
char *s;
FILE f;
{
    while (*s++ = getc(f))
       ;
}


save()
{
    FILE f;
    unsigned i;

    if ((f = openlib ("w")) == NULL)
        return;
    putc (size, f);
    for (i = 0; i < size; i++)
        fprintf (f, "%s%c%s%c", ids[i], 0, files[i], 0);
    fclose(f);
}


wait()
{
    printf ("\nhit RETURN to continue");
    while (getch() != '\n')
        ;
}


display()
{
    unsigned i, line;

    line = 1;
    for (i = 0; i < size; i++) {
        if (line == 1) {
            clrscrn();
            printf ("%-20s%-19s\n\n", "IDENTIFIER", "FILE");
            line = 3;
        }
        printf ("%-20s%-19s\n", ids[i], files[i]);
        line++;
        if (line == 24) {
            wait();
            line = 1;
        }
    }
    wait();
}


getch()
{
    char a, x, y;

    do
        sys (0xffe4, &a, &x, &y);
    while (a == 0);
    return a;
}


add()
{
    unsigned n;
    FILE f;

    printf ("\nhit RETURN when done\n\n");
    for (;;) {
        printf ("object file name: ");
        gets (inbuf);
        if (!isalpha(*inbuf))
            return;
        f = fopen (inbuf, "r");
        if (f == NULL || ferror())
            printf ("can't open %s\n", inbuf);
        else {
            n = getw(f);
            while (n--)
                getc(f);
            n = getw(f);
            while (n--)
                getw(f);
            n = getw(f);
            while (n-- && size < MAXLIB) {
                getid (ids[size], f);
                if (isalpha(*ids[size]) && isprint(ids[size][1]))
                    strcpy (files[size++], inbuf);
                getc(f);
                getw(f);
            }        
            fclose (f);
            if (size == MAXLIB) {
                printf ("\nlibrary is full\n");
                wait();
                return;
            }
        }
    }
}


remove()
{
    unsigned i, j;

    printf ("\nhit RETURN when done\n");
    for (;;) {
        printf ("\nfile to delete: ");
        gets (inbuf);
        if (!isalpha(*inbuf))
            return;
        for (i = 0; i < size && strcmp(files[i], inbuf) != 0; i++)
            ;
        if (i == size)
            printf ("file not found\n");
        else {
            while (i < size && strcmp (files[i], inbuf) == 0) {
                for (j = i; j+1 < size; j++) {
                    strcpy (files[j], files[j+1]);
                    strcpy (ids[j], ids[j+1]);
                }
                size--;
            }
        }
    }
}

===============================================================
-- 
-------------------------------------------------------------------
                               Dave Lowrey

"To vacillate or not to vacillate, that is the question....
 ....or is it?"
                                ...!(<sun,cbosgd,ihnp4}!amdahl!dwl10

[ The opinions expressed <may> be those of the author and not necessarily
  those of his most eminent employer. ]