home *** CD-ROM | disk | FTP | other *** search
- /*********************************************************/
- /* COPROCDE.C */
- /* Demoprogramm für Coroutinen in C */
- /* (C) 1988 by Roland Mosler & TOOLBOX */
- /*********************************************************/
-
- #include <stdio.h>
- #include <coproces.h>
-
- #define TRUE 1
- #define FALSE 0
-
- #define BufferSize 1024 /* Buffergröße in BYTE */
-
- #ifdef NO_ATARI
- #define Cnecin() getc()
- #else
- #define Cnecin() gemdos(0x8) /* Holt ein Zeichen
- ohne Echo und Return */
- #endif
-
- static PROCESS MAIN,proc1,proc2,proc3,err ;
-
- char Proc1Sp[BufferSize],
- Proc2Sp[BufferSize],
- Proc3Sp[BufferSize],
- errorSp[BufferSize],
- cc,*errMessage ;
-
- unsigned int i ;
- int NewInstall ;
-
-
- void ClearScreen()
- {
- putchar( 27 ) ;
- putchar( 'E' ) ;
- } /* ClearScreen */
-
- void Zaehler()
- {
- printf( " Global: %3d ",++i ) ;
- } /* Zaehler */
-
- void Message( Proz,Break )
- unsigned int Proz ;
- char Break ;
- {
- printf( "\nRoutine %1d Testpunkt ",Proz ) ;
- putchar( Break ) ;
- Zaehler() ;
- } /* Message */
-
- void Menue()
- {
- char hlp ;
-
- printf( "\n\n\
- \
- Tastatur während des Programmablaufs\n\
- 1 -> Wechsel nach Routine 1\n\
- 2 -> Wechsel nach Routine 2\n\
- 3 -> Wechsel nach Routine 3\n\
- H -> Hilfsmenü\n\
- E -> Ende des Programmes\n%s","\
- Keine Taste -> Pause\n\
- Übrige Tasten -> Programmablauf\n\n\
- Programmstart mit jeder Taste" ) ;
-
- hlp = Cnecin() ;
- } /* Menue */
-
- void ChangeRoutine( proc )
- PROCESS *proc ;
- {
- char hlp ;
-
- hlp = Cnecin() ;
- switch( hlp )
- {
- case '1' : transfer( proc,&proc1 ) ; break ;
- case '2' : transfer( proc,&proc2 ) ; break ;
- case '3' : transfer( proc,&proc3 ) ; break ;
- case 'e' :
- case 'E' : transfer( proc,&MAIN ) ; break ;
- case 'h' :
- case 'H' : Menue() ;
- default : ;
- } ;
- } /* ChangeRoutine */
-
- void error()
- {
- for(;;)
- {
- printf( "\n%s",errMessage ) ;
- NewInstall = TRUE ;
- transfer( &err,&MAIN ) ;
- } ;
- } /* error */
-
- void Routine1()
- {
- double a,b,c ;
-
- a = 1.2 ;
- b = 10.0 ;
- for(;;)
- {
- Message( 1,'A' ) ;
- c = a + b ;
- printf( "Addition %6.3lf",c ) ;
- ChangeRoutine( &proc1 ) ;
- Message( 1,'B' ) ;
- c = b * a ;
- printf( "Multiplikation %6.3lf",c ) ;
- ChangeRoutine( &proc1 ) ;
- Message( 1,'C' ) ;
- if( c == 0.0 )
- {
- errMessage = "Division durch 0 in Routine 1" ;
- error() ;
- } ;
- c = a / b ;
- printf( "Division %6.3lf",c ) ;
- ChangeRoutine( &proc1 ) ;
- a = c + 2.3 ;
- b = b - 0.5 ;
- } ;
- } /* Routine1 */
-
- void Routine2()
- {
- for(;;)
- {
- Message( 2,'X' ) ;
- printf( "Tick" ) ;
- ChangeRoutine( &proc2 ) ;
- Message( 2,'Y' ) ;
- printf( "Tack" ) ;
- ChangeRoutine( &proc2 ) ;
- } ;
- } /* Routine2 */
-
- void Routine3()
- {
- char ch,ch1 ;
-
- for( ch='A'; ch<='Z'; ch++ )
- {
- Message( 3,'N' ) ;
- printf( "Buchstabenreihe : " ) ;
- for( ch1='A'; ch1<=ch; putchar( ch1++ ) ) ;
- ChangeRoutine( &proc3 ) ;
- } ;
- errMessage = "Routinenende in Routine 3 erreicht" ;
- error() ;
- } /* Routine3 */
-
-
- void main()
- {
- ClearScreen() ;
- printf( "\n Demoprogramm für Coroutinen\n\n" ) ;
- i = 0 ;
- do
- {
- NewInstall = FALSE ;
- Menue() ;
- newproc( &error ,errorSp,BufferSize,&err ) ;
- newproc( &Routine1,Proc1Sp,BufferSize,&proc1 ) ;
- newproc( &Routine2,Proc2Sp,BufferSize,&proc2 ) ;
- newproc( &Routine3,Proc3Sp,BufferSize,&proc3 ) ;
- transfer( &MAIN,&proc1 ) ;
- } while( NewInstall ) ;
- printf( "\n Ende des Programmes 'Routinen'" ) ;
- Cnecin() ;
- } /* Routinen */