/* ------------------------------------------------------------
 * BANNER -- The absolute needless utility ...
 *
 * an idea of Mark Space & Jason & USENIX
 *
 * Written by Wolfgang Ocker, Puchheim
 *
 * Copyleft reserved, but absolue NO -rights
 *
 */

#include <stdio.h>

#define MAXSTRING 100
#define TRUE      (-1)
#define FALSE     (0)


extern char CharSet;    /* character set ... greetings to big blue ... */

typedef int bool;       /* former used PASCAL ...                      */


main(argc, argv)

  int  argc;
  char *argv[];

{
  char          *Str[MAXSTRING];
  int           LineNum, ChNum, I, J, StrNum, StrCnt;
  unsigned char Ch;
  int           ChOff;
  char          *ChAddr;
  char          *Font;
  bool          Italic, DblSize, SameChar;
  char          BannerChar;


  for (I = 1; I < argc; I++)
    if (!strcmp(argv[I], "-?")) {
      GiveHelp();
      exit(0);
    }

  Italic = DblSize = SameChar = FALSE;
  StrNum = 0;

  BannerChar = '*';

  /* u see, OS-9 has the nicer command line syntax ... */
  for (I = 1; I < argc; I++) {
    Str[StrNum] = NULL;

    /* self explaining, isn't it??? */
    if (argv[I][0] == '-') {
      for (J = 1; J < strlen(argv[I]); J++)
        switch(argv[I][J]) {
          case 'i':
          case 'I':
            Italic = TRUE;
            break;

          case 'd':
          case 'D':
            DblSize = TRUE;
            break;

          case 's':
          case 'S':
            SameChar = TRUE;
            break;

          case 'c':
          case 'C':
            if (argv[I][J+1] == '=')
              BannerChar = argv[I][J+2];
            else
              BannerChar = argv[I][J+1];
            J = strlen(argv[I]) + 1;
            break;

          default:
            GiveHelp();
            if ((argv[I][J] >= ' ' && argv[I][J] <= '~'))
              fprintf(stderr, "banner: unknown option '%c'\n", argv[I][J]);
            else
              fprintf(stderr, "banner: unknown option\n");
            exit(0);
        }
    }
    else {
      if (StrNum >= MAXSTRING) {
        GiveHelp();
        fprintf(stderr, "banner: too many strings given (max %d)\n", MAXSTRING);
        exit(0);
      }

      Str[StrNum++] = argv[I];
    }
  }

  if (!StrNum) {
    GiveHelp();
    fprintf(stderr, "banner: no string given\n");
    exit(0);
  }

  Font = &CharSet;
  /* here's the real hard work done ... */
  for (StrCnt = 0; StrCnt < StrNum; StrCnt++)
    for (LineNum = 0; LineNum < 8; LineNum++) {
      for (J = 0; J < (DblSize ? 2 : 1); J++) {
        putchar('\n');

        /* I love Rome ... */
        if (Italic)
          for (I = LineNum; I < 7; I++)
            putchar(' ');

        for (ChNum = 0; ChNum < strlen(Str[StrCnt]); ChNum++) {
          Ch     = Str[StrCnt][ChNum];
          ChOff  = (int) Ch * 8;
          ChAddr = Font + ChOff + LineNum;
          outline(Ch, *ChAddr, DblSize, BannerChar, SameChar);
        }
      }
    }

  putchar('\n');
}

/*
 * real wasting of space on the screen ...
 */

outline(outchar, outbyte, dblsize, bannerchar, samechar)

  char outchar, outbyte, bannerchar;
  bool dblsize, samechar;

{
  int BC, J;

  for (BC = 7; BC >= 0; BC--)
    for (J = 0; J < (dblsize ? 2 : 1); J++)
      if (outbyte & (0x01 << BC))
        putchar((samechar) ? outchar : bannerchar);
      else
        putchar(' ');
}


/*
 *
 */
GiveHelp()

{
  fprintf(stderr, "Syntax: banner [<opts>] {<string>} [<opts>]\n");
  fprintf(stderr, "Function: prints a banner to stdout\n");
  fprintf(stderr, "Options:\n");
  fprintf(stderr, "     -i            prints italic\n");
  fprintf(stderr, "     -d            double size\n");
  fprintf(stderr, "     -c[=]<char>   character\n");
  fprintf(stderr, "     -s            use same character\n");
}
