#include <stream.h>
#include <string.h>


void usage ()
{
   cout << "\ncout (c) by Harald Pehl in 1993\n"
           "Synthax: cout [Zeichenkette]\n"
           "In der Zeichenfolge <Zeichenkette> können diverse "
           "Steuerelemente enthalten sein:\n\n"
           "Aus C gebräuchliche:\n"
           "\t\\a: Klingelzeichen               \\b: Backspace\n"
           "\t\\f: Seitenvorschub               \\n: Zeilentrenner\n"
           "\t\\r: Wagenrücklauf                \\t: Tabulator\n"
           "\t\\v: Vertikal-Tabulator           \\\\: Gegenschrägstrich\n\n"
           "Von mir hinzugefügte:\n"
           "\t\\d: Text wird fett ausgegeben    \\k: Text wird kursiv ausgegeben\n"
           "\t\\u: Text wird unterstrichen      \\i: Text wird inventiert\n"
           "\t\\x: Schaltet alle eventuell eingestellten Modi aus\n\n"
           "Wird keine <Zeichenkette> angegeben, gibt cout eine Leerzeile aus.\n\n"
}


void main (int argc, char **argv)
{
   if (argc == 2)
   {
      char *arg = *++argv;

      if (*arg == '?')
      {
         usage ();
         return;
      }
      char *str = 0;
      int a, s, size = strlen (arg);

      for (a = 0 ; a < size ; a++)     // Stelle die Länge
      {                                // des Strings arg = *++argv fest...
         if (*(arg+a) == 92)
         {
            switch (*(arg+a+1))
            {
               case 'd':
               case 'k':
               case 'u':
               case 'i':
               case 'x': size += 3;
            }
         }
      }
      str = new char[size];            // ...und fordere
      if (str == 0)                    // dementsprechend
      {                                // Speicher für die Kopie str an
         cout << "Zeichenkette zu lang !!\n";
         return;
      }
      for (a = 0, s = 0 ; a < size ; a++, s++)  // Untersuche arg auf
      {                                         // Steuerzeichen
         if (*(arg+a) == 92)                    // und kopiere ihn
         {                                      // inklusive Steuerzeichen
            switch (*(arg+a+1))                 // nach str
            {
               case 'a': *(str+s) = '\a'; a++; break;
               case 'b': *(str+s) = '\b'; a++; break;
               case 'f': *(str+s) = '\f'; a++; break;
               case 'n': *(str+s) = '\n'; a++; break;
               case 'r': *(str+s) = '\r'; a++; break;
               case 't': *(str+s) = '\t'; a++; break;
               case 'v': *(str+s) = '\v'; a++; break;
               case 92 : *(str+s) = '\\'; a++; break;
               case 'd': strcat (str, "\x9b""1m"); a++; s+=2; break;
               case 'k': strcat (str, "\x9b""3m"); a++; s+=2; break; 
               case 'u': strcat (str, "\x9b""4m"); a++; s+=2; break;
               case 'i': strcat (str, "\x9b""7m"); a++; s+=2; break;
               case 'x': strcat (str, "\x9b""0m"); a++; s+=2; break;
               default : break;
            }
         }
         else
            *(str+s) = *(arg+a);
      }
      cout << str;
      delete [] str;
   }
   else if (argc == 1)
      cout << "\n";
   else
      usage ();
}
