PDVIXtest.c


/**********************************************************************/
/*                                                                    */
/* Projekt:  PDVIXtest für MinMax99 -- Systemaufrufe testen           */
/* Autor:    Marek Musial                                             */
/* Institut: TU Berlin - FB 13 Informatik - PDV und Robotik           */
/* ------------------------------------------------------------------ */
/* Datei:    PDVIXtest.c                                              */
/* Datum:    04.01.2001                                               */
/*                                                                    */
/**********************************************************************/


#include "mxStrukturen.h"
#include "mxLib.h"
#include "mxSystemAufruf.h"


/* zum Ausbauen einzelner Funktionen... Sinnvoll: 3, 4, 5 */
#ifndef AUFGABE
#define AUFGABE 5
#endif

#define  SC0(call)            (printf("%s...\n",#call), (call))
#define  SC1(call,type)       (printf("%s -> ", #call), RES = (int)(call), printf("(%d)\n", RES), (type)RES)

#define  ASSERT(exp)           do {if (!(exp)) {printf("\007### Fehlgeschlagene Invariante: %s\n", #exp); for(;;);}} while(0)

#define  WINS     30
#define  DUMMIES  50

/* Makro zum Selbstaufruf und fuer den Prozedurnamen */
#if (AUFGABE < 5)
#define MAIN PDVIXtest
#else
#define MAIN main
#endif

void EchoServer(char name, int server_mode){
#if (AUFGABE < 4)
    printf ("  PDVIXtest-Konfiguration Aufgabe %d, ohne Nachrichten!\n", AUFGABE);
#else
    tName p;
    tKommunikationsStatus status;
    tString str;
    int ok, RES;

    if(!server_mode)
      printf ("  Ich bin Kommunikationspartner '%c'!\n", name);
    else
      printf(" Ich bin EchoServer '%c'!\n", name);

    ok = SC1( sys_NameAnmelden(name), int );
    ASSERT(ok);

    for(;;){
      SC0( p = cKeinName );

      if(server_mode){
	printf("Warte auf Anmeldung eines neuen Clients\n");
	while( (status = SC1(sys_Empfangen( &p, str), tKommunikationsStatus)) != eOk);
	printf("Kommuniziere mit Client %c\n", p);
      }

      if(!server_mode) SC0( sys_Schlafe( 500 ));
      status = SC1(sys_Empfangen( &p, str ), tKommunikationsStatus);
      if (status == eUnbekannt && !server_mode) break;
      else if(status == eUnbekannt) continue; //Kommunikation mit neuem Client zulassen
      if(!server_mode) ASSERT(p == 'T');
      ASSERT(status == eOk);

      printf("Nachricht='%s' (%d Zeichen) von Partner %c\n", str, strlen(str), p);

      if(!strcmp(str, "ENDE")) break; //beende Server
      if( server_mode && !strcmp(str, "QUIT")) continue; //Prozess hat sich abgemeldet

      SC0( sys_Schlafe( 500 ));
      status = SC1(sys_Senden( p, str ), tKommunikationsStatus);
      if (status == eUnbekannt && !server_mode) break;
      else if(status == eUnbekannt) continue;
      if(!server_mode) ASSERT(p == 'T');
      ASSERT(status == eOk);
    }
    sys_NameAbmelden();
}

void EchoClient(char name){
  tName testPartner = 'T', echoPartner = 'E';
  tKommunikationsStatus status;
  tString str, cmd;
  int ok, RES;
  int angemeldet = FALSE;

  printf("Ich bin Echo Client %c", name);
  ok = SC1( sys_NameAnmelden(name), int);
  ASSERT(ok);

  //test Protokoll:
  for(;;){
    status = SC1( sys_Empfangen( &testPartner, cmd), tKommunikationsStatus );
    ASSERT( status == eOk);
    ASSERT( testPartner == 'T');
    switch(cmd[0]){
    case 'A': //Anmelden (Server bereits gestartet)
      status = SC1(sys_Senden(echoPartner, "Anmdelung"), tKommunikationsStatus);
      ASSERT(status == eOk);
      angemeldet = TRUE;
      break;
    case 'a': //Anmelden (Server noch nicht gestartet)
      while( eUnbekannt ==
	     (status = SC1(sys_Senden(echoPartner, "Anmdelung"), tKommunikationsStatus))) ;
      ASSERT(status == eOk);
      angemeldet = TRUE;
      break;
    case 'E': //EchoServer Quit "ENDE" schicken
      status = SC1(sys_Senden(echoPartner, "ENDE"), tKommunikationsStatus);
      ASSERT(status == eOk);
      angemeldet = FALSE;
      break;
    case 'Q': //vom EchoServer abmelden
      status = SC1(sys_Senden(echoPartner, "QUIT"), tKommunikationsStatus);
      ASSERT(status == eOk);
      angemeldet = FALSE;
      break;
    case 'q': //sich selber beenden
      angemeldet = FALSE;
      return;
    case 'm': //nachricht senden
      status = SC1(sys_Senden(echoPartner, cmd+2), tKommunikationsStatus);
      ASSERT(status = eOk);
      status = SC1(sys_Empfangen(&echoPartner, str), tKommunikationsStatus);
      ASSERT( status = eOk);
      ASSERT( echoPartner == 'E');
      ASSERT( strcmp(str, cmd+2) == 0);
      break;
    case 'M': //Nachricht senden, aber beim Empfangen erwarten, dass status==eUnbekannt
      status = SC1(sys_Senden(echoPartner, cmd+2), tKommunikationsStatus);
      ASSERT(status = eOk);
      sys_Schlafe(1500);

      status = SC1(sys_Empfangen(&echoPartner, str), tKommunikationsStatus);
      ASSERT( status == eUnbekannt);
      break;
    case 'p': //ping
      status = SC1(sys_Senden(testPartner, "pong"), tKommunikationsStatus);
      ASSERT( status == eOk);
      break;
    case '?': //angemeldet?
      status = SC1(sys_Senden(testPartner, angemeldet ? "y" : "n"), tKommunikationsStatus);
      ASSERT( status == eOk);
      break;
    }
  }
#endif
}

int MAIN(int argc, char *argv[])
{
  typedef void                   *ptr;
  int                            RES;

  int                            window[WINS];
  char                           PST[] = "-EBTLS????????????????????????????????";

  int                            i, j, w, res, all;
  int                            x, dx, rx;
  int                            y, dy, ry;
  int                            slave = FALSE, partner = FALSE, dummy = FALSE, help = FALSE, autof = FALSE, autoi = 0;
  int                            echo = FALSE, client = FALSE;

  int                            dontuse0;
  tString                        str;
  tProzessNummer                 pid;
  tProzessNummer                 dpid[DUMMIES];
  tSystemStatus                  sysstat;
  tInformationsFeld              infos;
#if (AUFGABE >= 4)
  tProzessNummer                 pid2;
  tKommunikationsStatus          status;
  tName                          sender;
  int                            ok;
#endif
#if (AUFGABE >= 5)
  tNamenVerzeichnis              dir;
#endif

  /* Kommandozeile */
  if (argc > 1) {
    if (!strcmp(argv[1], "-s")) {
      slave = TRUE;
    } else if (!strcmp(argv[1], "-q")) {
      partner = TRUE;
    } else if (!strcmp(argv[1], "-e")) {
      echo = TRUE;
    } else if (!strcmp(argv[1], "-c")){
      client = TRUE;
    } else if (!strcmp(argv[1], "-d")) {
      dummy = TRUE;
    } else if (!strcmp(argv[1], "-h")) {
      help = TRUE;
    } else {
      autof = TRUE;
    }
  }

  /* *0 lesen */
  dontuse0 = *((int*)0);

  /* Fenster muessen her */
  for (w=0; w<WINS; w++) {
    if (w > 0 && (help || slave || partner || dummy)) break;
    window[w] = SC0(sys_FensterOeffnen( cKeinFenster ));
    if (window[w] == cKeinFenster) break;
    printf("\n**  %s -- Version 1.2 -- A%d -- in Fenster %d **\n", argv[0], AUFGABE, window[w]);
  }
  /* kein Fenster => zwecklos */
  if (w < 1) return 1;

  if (help) {
    printf ("Benutzung:  %s [-h | -s | cmds]   \n", argv[0]);
    printf ("  -h         Hilfe                    \n");
    printf ("  -s         Slave-Mode               \n");
    printf ("  -q <name>  Kommunikationsparner-Mode\n");
    printf ("  -d         Dummy-Mode               \n");
    printf ("  cmds       Kommandofolge aus:       \n");
    printf ("             0=String 1=Fenster 2=Nachr. 3=Prozess 4=Speicher      \n");
    printf ("             5=Schlaf 6=Cursor  7=LED    8=Info    9=Datei   A=alle\n");
    return 0;
  }

  /* Testen, ob zweiter Start (Slave-Mode) */
  if (slave) {
    printf("  Ich bin zweite PDVIXtest-Instanz, warte auf Fremdtermination!\n");
    while(TRUE);
  }

  /* Testen, ob zweiter Start (Kommunikationspartner-Mode) */
  if (partner || echo) {
    EchoServer(  argc > 2? argv[2][0] : 'Q', echo );
    return 0;
  }

#if (AUFGABE >= 4)
  if (client){
    EchoClient( argc > 2? argv[2][0] : 'C');
    return 0;
  }
#endif
  /* Testen, ob zweiter Start (Dummy-Mode) */
  if (dummy) {
    printf ("  Ich bin Dummy-Prozess!\n");
    SC0(sys_FensterSchliessen( window[0] ));
    while(TRUE) sys_Schlafe(0);
  }

  SC0(sys_FensterWechseln( window[0] ));
  printf ("  ok, habe w=%d Fenster bekommen: ", w);
  for (i=0; i<w; i++) printf(" [%d]", window[i]);
  printf("\n");

  if (autof) {
    printf ("Automatik-Mode, Kommandosequenz='%s'\n", argv[1]);
  } else {
    printf ("printf() scheint zu gehen...\n");
  }

  /* nur ein Fenster => zwecklos */
  ASSERT(w > 1);

  while (TRUE) {
    /* hat etwa jemand einen Nullpointer missbraucht? */
    ASSERT(*((int*)0) == dontuse0);

    if (autof) {
      res = argv[1][autoi++];
      if (!res) res = 27;
    } else {
      printf("\n0=String 1=Fenster 2=Nachr. 3=Prozess 4=Speicher 5=Schlaf 6=Cursor 7=LED 8=Info 9=Datei A=alle ESC=Term\n");
      res = SC1(sys_LiesZeichen(), int);
    }

    all = 0;
    switch (res) {
      case 'a':
      case 'A': all = 1;

      case '0':
        printf ("Teste String-Eingabe...\n");
        SC0(sys_LiesString( str, cStringLaenge+1 ));
        printf ("  Eingabe: \"%s\" (%d Zeichen)\n", str, strlen(str));
        ASSERT(strlen(str) <= cStringLaenge);
        if (!all) break;

      case '1':
        printf ("Teste explizite Fensterreservierung...\n");
        for (i=1; i<w; i++) {
          SC1(window[i], int);
          SC0(sys_FensterSchliessen( window[i] ));
          res = SC0(sys_FensterOeffnen( window[i] ));
          ASSERT(res == window[i]);
          SC0(sys_FensterWechseln( window[0] ));
        }
        if (!all) break;

      case '2':
        printf ("Teste Nachrichten...\n");
#if (AUFGABE < 4)
        printf ("  PDVIXtest-Konfiguration Aufgabe %d, ohne Nachrichten!\n", AUFGABE);
#else
        /* ein Fenster freimachen */
        SC0(sys_FensterSchliessen( window[1] ));
        ok = SC1(sys_NameAnmelden( 'T' ), int);
	ASSERT(ok);

	printf("eOk: %d\n", eOk);

	/* Senden, Empfang mit cKeinName, Sender blockiert */
	pid = SC1(sys_StarteProzess( argv[0], "-q Q" ), tProzessNummer);
	ASSERT(pid > 0);
        printf("Warte auf Start:\n");
        while ((status = (SC1(sys_Senden( 'Q', "Nachricht 1" ), tKommunikationsStatus))) == eUnbekannt) {
	  SC0(sys_Schlafe( 0 ));
	}
	ASSERT(status == eOk);

        /* Empfangen, Empfang mit Q, Empfaenger blockiert */
	SC0(sender = 'Q');
        status = SC1(sys_Empfangen( &sender, str ), tKommunikationsStatus);
        ASSERT(status == eOk);
        ASSERT(sender == 'Q');
        ASSERT(strcmp( str, "Nachricht 1" ) == 0);

        /* Senden, Empfang mit T, Sender blockiert */
        status = SC1(sys_Senden( 'Q', "Nachricht 2" ), tKommunikationsStatus);
        ASSERT(status == eOk);

	/* Empfangen, Empfang mit cKeinName, Empfaenger blockiert */
	SC0(sender = cKeinName);
        status = SC1(sys_Empfangen( &sender, str ), tKommunikationsStatus);
        ASSERT(status == eOk);
        ASSERT(sender == 'Q');
        ASSERT(strcmp( str, "Nachricht 2" ) == 0);

        /* Senden, Empfang mit T, Empfaenger blockiert */
	SC0(sys_Schlafe( 1000 ));
        status = SC1(sys_Senden( 'Q', "Nachricht 3" ), tKommunikationsStatus);
        ASSERT(status == eOk);

	/* abmelden */
        ok = SC1(sys_NameAnmelden( 't' ), int);
	ASSERT(ok);
	SC0(sys_Schlafe( 1500 ));
        ok = SC1(sys_NameAnmelden( 'T' ), int);
	ASSERT(ok);
        status = SC1(sys_Senden( 'Q', "Nachricht 4" ), tKommunikationsStatus);
	ASSERT(status == eUnbekannt);

	/* Start #2 */
        pid = SC1(sys_StarteProzess( argv[0], "-q Q" ), tProzessNummer);
	ASSERT(pid > 0);
        printf("Warte auf Start: ");
        SC0(sys_Schlafe( 1500 ));

	/* Senden, Empfang mit cKeinName, Empfaenger blockiert */
        status = SC1(sys_Senden( 'Q', "Nachricht 5" ), tKommunikationsStatus);
        ASSERT(status == eOk);

	/* Empfangen, Empfang mit Q, Sender blockiert */
        SC0(sender = 'Q');
	SC0(sys_Schlafe( 1000 ));
        status = SC1(sys_Empfangen( &sender, str ), tKommunikationsStatus);
        ASSERT(status == eOk);
        ASSERT(sender == 'Q');
        ASSERT(strcmp( str, "Nachricht 5" ) == 0);

	if (w < 3) {
	  printf ("  Ueberspringe Multi-Empfangen, da kein Fenster mehr frei!\07\n");
	  SC0(sys_Schlafe( 3000 ));
	} else {
	  printf ("  Multi-Empfangen-Test\n");
	  /* noch ein Fenster freimachen und zweiten Partner starten*/
	  SC0(sys_FensterSchliessen( window[2] ));
	  pid2 = SC1(sys_StarteProzess( argv[0], "-q q" ), tProzessNummer);
	  ASSERT(pid2 > 0);

	  /* Senden, Empfang mit cKeinName, Sender blockiert */
	  printf("Warte auf Start:\n");
	  while ((status = (SC1(sys_Senden( 'q', "Nachr. 6" ), tKommunikationsStatus))) == eUnbekannt) {
	    SC0(sys_Schlafe( 0 ));
	  }
	  ASSERT(status == eOk);

	  /* Empfangen, Empfang mit cKeinName, Empfaenger blockiert, 2. Prozess vorhanden */
	  SC0(sender = cKeinName);
	  status = SC1(sys_Empfangen( &sender, str ), tKommunikationsStatus);
	  ASSERT(status == eOk);
	  ASSERT(sender == 'q');
	  ASSERT(strcmp( str, "Nachr. 6" ) == 0);

	  /* Senden, Empfang mit T, Empfaenger blockiert */
	  status = (SC1(sys_Senden( 'Q', "Nachr. 7" ), tKommunikationsStatus));
	  ASSERT(status == eOk);

	  /* Empfangen, Empfang mit cKeinName, Empfaenger blockiert, 2. Prozess vorhanden */
	  SC0(sender = cKeinName);
	  status = SC1(sys_Empfangen( &sender, str ), tKommunikationsStatus);
	  ASSERT(status == eOk);
	  ASSERT(sender == 'Q');
	  ASSERT(strcmp( str, "Nachr. 7" ) == 0);

	  /* mit Prozess2 'Q' und Prozess3 'q' /*ueber kreuz*/ kommunizieren */
	  status = SC1(sys_Senden('Q', "Nachricht K1"), tKommunikationsStatus);
	  ASSERT(status == eOk);

	  status = SC1(sys_Senden('q', "Nachricht K2"), tKommunikationsStatus);
	  ASSERT(status == eOk);

	  SC0(sender = 'Q');
	  status = SC1(sys_Empfangen( &sender, str), tKommunikationsStatus);
	  ASSERT(status == eOk);
	  ASSERT(sender == 'Q');
	  ASSERT(strcmp( str, "Nachricht K1") == 0);

	  SC0(sender = 'q');
	  status = SC1(sys_Empfangen( &sender, str), tKommunikationsStatus);
	  ASSERT(status == eOk);
	  ASSERT(sender == 'q');
	  ASSERT(strcmp( str, "Nachricht K2") == 0);

	  /* kommunikation mit Prozess3 'q' innerhalb Kommunikation mit Prozess2 'Q' verschachteln */
	  status = SC1(sys_Senden('Q', "Nachricht K3"), tKommunikationsStatus);
	  ASSERT(status == eOk);

	  status = SC1(sys_Senden('q', "Nachricht K4"), tKommunikationsStatus);
	  ASSERT(status == eOk);

	  SC0(sender = 'q');
	  status = SC1(sys_Empfangen( &sender, str), tKommunikationsStatus);
	  ASSERT(status == eOk);
	  ASSERT(sender == 'q');
	  ASSERT(strcmp( str, "Nachricht K4") == 0);

	  SC0(sender = 'Q');
	  status = SC1(sys_Empfangen( &sender, str), tKommunikationsStatus);
	  ASSERT(status == eOk);
	  ASSERT(sender == 'Q');
	  ASSERT(strcmp( str, "Nachricht K3") == 0);

	  /* Nachricht an Prozess2 und Prozess3 schicken, zweimal von cKeinName Empfangen */
	  status = SC1(sys_Senden('Q', "Nachricht K5"), tKommunikationsStatus);
	  ASSERT(status == eOk);

	  status = SC1(sys_Senden('q', "Nachricht K6"), tKommunikationsStatus);
	  ASSERT(status == eOk);

	  for(i = 0; i < 2; i++){
	    SC0( sender = cKeinName );
	    status = SC1(sys_Empfangen( &sender, str), tKommunikationsStatus);
	    ASSERT(status == eOk);
	    ASSERT(sender == 'Q' || sender == 'q');
	    ASSERT( (sender == 'Q' && strcmp( str, "Nachricht K5") == 0) ||
		    (sender == 'q' && strcmp( str, "Nachricht K6") == 0));
	  }

	  /* Senden, Empfang mit T, Empfaenger blockiert */
	  SC0(sys_Schlafe( 500 ));
	  status = SC1(sys_Senden( 'q', "ENDE" ), tKommunikationsStatus);
	  ASSERT(status == eOk);

	  /* Fenster zurueckholen */
	  res = SC0(sys_FensterOeffnen( window[2] ));
	  SC0(sys_FensterWechseln( window[0] ));
	  ASSERT(res == window[2]);
	}

	/* Fremdtermination */
	SC0(sys_Schlafe( 500 ));
	SC0(sys_TerminiereProzess( pid ));
	SC0(sys_Schlafe( 500 ));

	/* Senden, Empfang mit T, Sender blockiert */
        status = SC1(sys_Senden( 'Q', "ENDE" ), tKommunikationsStatus);
	/* je nach Implementierung der Aufweckung bei Termination */
        ASSERT(status == eOk || status == eUnbekannt);
	printf("  Termination aus Nachrichtenblockierung ist implementiert: %s!\n", status != eOk? "JA" : "NEIN");
	SC0(sys_Schlafe(10));
	ok = SC1(sys_NameAnmelden( 'Q' ), int);
	ASSERT(ok);
	ok = SC1(sys_NameAnmelden( 'q' ), int);
	ASSERT(ok);

	/* EchoServer tests: */

        /* Fenster zurueckholen */
        res = SC0(sys_FensterOeffnen( window[1] ));
        SC0(sys_FensterWechseln( window[0] ));
        ASSERT(res == window[1]);

	ok = SC1(sys_NameAnmelden('T'), int); //wieder orignial Anmeldename herstellen
	ASSERT(ok);

	//Fenster fuer EchoServer/Client freigaben:
	SC0(sys_FensterSchliessen( window[1] ));
	//EchoServer laeuft, Client starten und anmelden, Client beenden ohne abzumelden
	pid = SC1( sys_StarteProzess(argv[0], "-e E"), tProzessNummer);
	ASSERT( pid > 0);
	SC0(sys_Schlafe(500));

	SC0(sys_FensterSchliessen( window[2] ));
	pid2 = SC1( sys_StarteProzess(argv[0], "-c C"), tProzessNummer);
	ASSERT( pid2 > 0);
	SC0(sys_Schlafe(500));
	status = SC1( sys_Senden('C', "A"), tKommunikationsStatus);
	ASSERT(status == eOk);
	status = SC1( sys_Senden('C', "q"), tKommunikationsStatus);
	ASSERT(status == eOk);
	SC0(sys_Schlafe( 500 )); //beenden lassen

	//Echo Server laeuft, Client starten und anmelden, Client meldet sich ganz normal ab und beendet
	pid2 = SC1( sys_StarteProzess(argv[0], "-c C"), tProzessNummer);
	ASSERT( pid2 > 0);
	SC0(sys_Schlafe(500));
	status = SC1( sys_Senden('C', "A"), tKommunikationsStatus);
	ASSERT(status == eOk);
	status = SC1( sys_Senden('C', "Q"), tKommunikationsStatus);
	ASSERT(status == eOk);
	status = SC1( sys_Senden('C', "q"), tKommunikationsStatus);
	ASSERT(status == eOk);

	//Server laeuft, Client meldet sich an, Server beendet nach Anmeldung, Client wartet auf neuen Server
	pid2 = SC1( sys_StarteProzess( argv[0], "-c C"), tProzessNummer);
	ASSERT(pid > 2);
	SC0( sys_Schlafe(500));
	status = SC1( sys_Senden('C', "A"), tKommunikationsStatus);
	ASSERT( status == eOk);
	status = SC1( sys_Senden('C', "E"), tKommunikationsStatus);
	ASSERT( status == eOk );
	SC0(sys_Schlafe(1000));

	status = SC1( sys_Senden('C', "a"), tKommunikationsStatus); //auf neuen Server warten
	ASSERT( status == eOk );

	//neuen Server starten
	pid = SC1(sys_StarteProzess( argv[0], "-e E"), tProzessNummer);
	ASSERT( pid > 0);
	SC0(sys_Schlafe(1500));
	//teste ob client angemeldet
	status = SC1(sys_Senden('C', "?"), tKommunikationsStatus);
	ASSERT( status == eOk);
	sender = 'C';
	status = SC1(sys_Empfangen( &sender, str), tKommunikationsStatus);
	ASSERT( status == eOk);
	ASSERT( sender == 'C');
	ASSERT( str[0] == 'y');

	//Server und Client beenden
	status = SC1(sys_Senden('C', "E"), tKommunikationsStatus);
	ASSERT( status == eOk);
	SC0(sys_Schlafe(1000));

	status = SC1(sys_Senden('C', "q"), tKommunikationsStatus);
	ASSERT( status == eOk);
	SC0( sys_Schlafe(1000));

	//Fesnter von EchoServer zurueckholen
	res = SC0(sys_FensterOeffnen( window[1] ));
	SC0(sys_FensterWechseln( window[0]));
	ASSERT( res == window[1] );

	//Fesnter von EchoClient zurueckholen
	res = SC0(sys_FensterOeffnen( window[2] ));
	SC0(sys_FensterWechseln( window[0]));
	ASSERT( res == window[2] );

	/* Abmeldung */
	SC0(sys_NameAbmelden());
        SC0(sender = cKeinName);
        status = SC1(sys_Empfangen( &sender, str ), tKommunikationsStatus);
        ASSERT(status == eNichtAngemeldet);


	printf("Nachrichtentest erfolgreich beendet!\n");
#endif
        if (!all) break;

      case '3':
        printf ("Teste Prozess-Start und Fremdtermination\n");
        /* ein Fenster freimachen */
        SC0(sys_FensterSchliessen( window[1] ));
        pid = SC1(sys_StarteProzess( argv[0], "-s" ), tProzessNummer);
        ASSERT(pid > 0);
        printf("Warte auf Start... ");
        sys_Schlafe( 1000 );
        printf ("\n");
        res = SC0(sys_FensterOeffnen( cKeinFenster ));
        ASSERT(res == cKeinFenster);
        SC0(sys_TerminiereProzess( pid ));
        /* Fenster zurueckholen */
        res = SC0(sys_FensterOeffnen( cKeinFenster ));
        SC0(sys_FensterWechseln( window[0] ));
        ASSERT(res == window[1]);
        if (!all) break;

      case '4':
        printf ("Teste Speicherkapazitaet...\n");
        /* ein Fenster freimachen */
        SC0(sys_FensterSchliessen( window[1] ));
	for (i=0; ; i++) {
	  pid = SC1(sys_StarteProzess( argv[0], "-d" ), tProzessNummer);
	  if (!pid) break;
	  dpid[i] = pid;
	  sys_Schlafe( 500 );
	}
        printf("  %d %s-Instanzen gestartet\n", i, argv[0]);
	for (i--; i>=0; i--) printf ("."), sys_TerminiereProzess( dpid[i] );
        printf ("\n");
        /* Fenster zurueckholen */
        res = SC0(sys_FensterOeffnen( window[1] ));
        SC0(sys_FensterWechseln( window[0] ));
        ASSERT(res == window[1]);
        if (!all) break;

      case '5':
        printf ("Teste Schlafen...\n");
        SC0(sys_Schlafe( 3000 ));
        /* ein Fenster freimachen */
        SC0(sys_FensterSchliessen( window[1] ));
        pid = SC1(sys_StarteProzess( argv[0], "-s" ), tProzessNummer);
        ASSERT(pid > 0);
        printf("30mal Weitergabe der CPU");
        for (i=0; i<30; i++) {
          sys_Schlafe(0);
          printf (".");
        }
        printf ("\n");
        SC0(sys_TerminiereProzess( pid ));
        /* Fenster zurueckholen */
        res = SC0(sys_FensterOeffnen( window[1] ));
        SC0(sys_FensterWechseln( window[0] ));
        ASSERT(res == window[1]);
        if (!all) break;

      case '6':
        printf ("Teste Cursor-Positionierung...\n");
        SC0(sys_FensterWechseln( window[1] ));
        printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
        rx =   1; x  = 109;  dx =  112;
        ry =  -1; y  =   1;  dy =  10;
        while (dx > 0 && dy > 0) {
          for (dx-=4, rx=-rx, i=0; i<dx; i++, x+=rx) sys_FensterXY(x,y), printf ("#");
          for (dy-=2, ry=-ry, i=0; i<dy; i++, y+=ry) sys_FensterXY(x,y), printf ("#");
        }
        sys_FensterWechseln( window[0] );
        if (!all) break;

      case '7':
        printf("Teste LED...\n");
        for (i=99; i>=-1; i--) {
          printf("\r  [%2d] ... ", i);
          sys_Setze7Segment(i, 1);
          for (j=0; j<20000; j++);
        }
        printf ("aus!\n");
        for (j=0; j<200000; j++);
        if (!all) break;

      case '8':
        printf("Teste Informationsaufrufe...\n");
        SC0(sys_SystemStatus( &sysstat ));
        for (i=0; i<cStatusEintraege; i++) {
          if (i && i % 8 == 0) printf("\n");
          printf("%13u", ((unsigned*)&sysstat)[i]);
        }
        printf ("\n");
        SC0(sys_ProzessInformationen( &infos ));
        for (i=0; i<cMaximaleProzessAnzahl; i++) {
          if (i && i % 7 == 0) printf("\n");
	  strncpy(str, infos[i].Name, 8);
	  str[8] = 0;
          printf("%3d:%c%c%c%c:%-8s",
		 i, PST[infos[i].Status],
		 infos[i].AmTerminieren? 't':'-',
		 infos[i].Abgeschossen? 'a':'-',
		 infos[i].ImKern? 'k':'-',
		 str);
        }
        printf ("\n");
        if (!all) break;

      case '9':
        printf("Teste Dateisystem-Info...\n");
#if (AUFGABE < 5)
        printf ("  PDVIXtest-Konfiguration Aufgabe %d, ohne Dateisystem!\n", AUFGABE);
#else
        SC0(sys_LiesVerzeichnis( &dir ));
        for (i=0; i<dir.Anzahl; i++) {
          if (i && i % 4 == 0) printf("\n");
          printf("  \"%s\"", dir.Namen[i]);
          for (j=strlen(dir.Namen[i]); j<cDateiNameLaenge; j++) printf(" ");
        }
        printf ("\n");
#endif
        break;

      case 27:
        printf("Teste Selbsttermination...\n");
        SC0(sys_Terminiere());
        ASSERT(FALSE);
    }
  }

  return 0;
}


Bei Problemen mit der Seite bitte eine Mail an Marek
Converted with C2HTML V0.669 by Iluvatar
Prozeßdatenverarbeitung