/* showstring.c
Darstellung einer Zeichenkette
unter Verwendung der portierten conio-Funktionen
*/

#include <conio.h>
#include <stdio.h>

/* Zeichen zum Zeichnen von Rahmenlinien im Textmode laut Codepage 850 */
#define Z_ELO  218  /* Ecke links oben   */
#define Z_ERO  191  /* Ecke rechts oben  */
#define Z_ELU  192  /* Ecke links unten  */
#define Z_ERU  217  /* Ecke rechts unten */
#define Z_AOB  194  /* Anschluss oben    */
#define Z_AUN  193  /* Anschluß unten    */
#define Z_LWA  196  /* Linie waagrecht   */
#define Z_LSE  179  /* Linie senkrecht   */
#define Z_FILL 219  /* voll ausfuellen   */

/* plotchar gibt das Zeichen c an derPosition x, y aus.
   Statt des ASCII-Nul Zeichens wird ein Fuellmuster ausgegeben,
   statt eines Steuerzeichens wird eine Tilde ausgegeben */

void plotchar(int x, int y, int c)
{
  gotoxy(x, y);
  if (c == '\0') c = Z_FILL;
  if (c < 32) c = '~';
  putchar(c);
}

/*
Die Funktion showstring stellt eine Zeichenkette inklusive der
Indizes der einzelnen Zeichen dar.
Das Abschlusszeichen wird besonders dargestellt.
Die Zeichen mit dem Index i1 und i2 werden besonders unterlegt,
wenn i1 bzw. i2 > 0 ist.
Die Ausgabe erfolgt immer an derselben Position am Bildschirm.
Ist init = 1, so werden die Rahmen der Darstellung gezeichnet.
-------------------------------------------------------------------------
s  ......... Zeiger auf die Zeichenkette
i1 und i2 .. Index der Zeichen, die blinkend dargestellt wird
n .......... soviel Zeichen werden dargestellt, normal ist n > strlen(s)
init ....... Init-Schalter
-------------------------------------------------------------------------
*/

#define x0 5
#define y0 5

void showstring(char *s, int i1, int i2, int n, int init)
{
  int i, j;

  textbackground(WHITE);
  _setcursortype (_NOCURSOR);

  if (init) {    /* Rahmenlinien zeichnen */
    clrscr();
    textcolor(BLACK);
    /* 1. Zeile: Indizes */
    gotoxy(x0, y0);
    for (i = 0; i < n; i++) printf("%2i", i % 10);
    /* 2. Zeile: Kasten obere Linie */
    gotoxy(x0, y0 + 1);
    putchar(Z_ELO);
    for (i = 0; i < n-1 ; i++) {
      putchar(Z_LWA);
      putchar(Z_AOB);
    }
    putchar(Z_LWA);
    putchar(Z_ERO);
    /* 3. Zeile: Inhalt */
    gotoxy(x0, y0 + 2);
    for (i = 0; i < n; i++) {
      putchar(Z_LSE);
      putchar(' ');
    }
    putchar(Z_LSE);
    /* 4. Zeile: Kasten untere Linie */
    gotoxy(x0, y0 + 3);
    putchar(Z_ELU);
    for (i = 0; i < n-1; i++) {
      putchar(Z_LWA);
      putchar(Z_AUN);
    }
    putchar(Z_LWA);
    putchar(Z_ERU);

  } /* end if init */


  /* Ausgabe der Zeichenkette */

  textcolor(BLACK);
  for (i = 0; i <= strlen(s); i++)
    plotchar(x0 + 1 + 2*i, y0 + 2, s[i]);
  /* Zeichen nach dem Abschlusszeichen */
  for (; i < n; i++)
    plotchar(x0 + 1 + 2*i, y0 + 2, ' ');

  /* die aktuell bearbeitet Zeichen (Index i1 und i2) hervorheben */
  for (j = 0; j < 5; j++) {
    if (i1 >= 0) {
      textcolor(LIGHTRED);
      plotchar(x0 + 1 + 2*i1, y0 + 2, s[i1]);
    }
    if (i2 >= 0) {
      textcolor(BLUE);
      plotchar(x0 + 1 + 2*i2, y0 + 2, s[i2]);
    }
    sleep(200);
    if (i1 >= 0) {
      textcolor(LIGHTRED);
      plotchar(x0 + 1 + 2*i1, y0 + 2, ' ');
    }
    if (i2 >= 0) {
      plotchar(x0 + 1 + 2*i2, y0 + 2, ' ');
    }
    sleep(200);
  }

  textcolor(BLACK);
  gotoxy(1, y0 + 10);

}  /* end showstring */