home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / 1989 / 02 / extra / coprocde.c < prev    next >
Encoding:
C/C++ Source or Header  |  1988-11-28  |  3.8 KB  |  179 lines

  1. /*********************************************************/
  2. /*                     COPROCDE.C                        */
  3. /*            Demoprogramm für Coroutinen in C           */
  4. /*          (C) 1988 by Roland Mosler & TOOLBOX          */
  5. /*********************************************************/
  6.  
  7. #include <stdio.h>
  8. #include <coproces.h>
  9.  
  10. #define TRUE  1
  11. #define FALSE 0
  12.  
  13. #define BufferSize 1024    /* Buffergröße in BYTE */
  14.  
  15. #ifdef NO_ATARI
  16. #define Cnecin() getc()
  17. #else
  18. #define Cnecin() gemdos(0x8)   /* Holt ein Zeichen
  19.                                   ohne Echo und Return  */
  20. #endif
  21.  
  22. static PROCESS MAIN,proc1,proc2,proc3,err ;
  23.  
  24. char    Proc1Sp[BufferSize],
  25.         Proc2Sp[BufferSize],
  26.         Proc3Sp[BufferSize],
  27.         errorSp[BufferSize],
  28.         cc,*errMessage ;
  29.  
  30. unsigned int  i ;
  31. int           NewInstall ;
  32.  
  33.  
  34. void ClearScreen()
  35. {
  36.   putchar( 27 ) ;
  37.   putchar( 'E' ) ;
  38. } /* ClearScreen */
  39.  
  40. void Zaehler()
  41. {
  42.   printf( " Global: %3d ",++i ) ;
  43. } /* Zaehler */
  44.  
  45. void Message( Proz,Break )
  46.   unsigned int Proz ;
  47.   char         Break ;
  48. {
  49.   printf( "\nRoutine %1d Testpunkt ",Proz ) ;
  50.   putchar( Break ) ;
  51.   Zaehler() ;
  52. } /* Message */
  53.  
  54. void Menue()
  55. {
  56.   char hlp ;
  57.  
  58.   printf( "\n\n\
  59. \
  60.   Tastatur während des Programmablaufs\n\
  61.   1             -> Wechsel nach Routine 1\n\
  62.   2             -> Wechsel nach Routine 2\n\
  63.   3             -> Wechsel nach Routine 3\n\
  64.   H             -> Hilfsmenü\n\
  65.   E             -> Ende des Programmes\n%s","\
  66.   Keine Taste   -> Pause\n\
  67.   Übrige Tasten -> Programmablauf\n\n\
  68.   Programmstart mit jeder Taste" ) ;
  69.  
  70.   hlp = Cnecin() ;
  71. } /* Menue */
  72.  
  73. void ChangeRoutine( proc )
  74.   PROCESS *proc ;
  75. {
  76.   char hlp ;
  77.  
  78.   hlp = Cnecin() ;
  79.   switch( hlp ) 
  80.   {
  81.     case '1'   : transfer( proc,&proc1 ) ; break ;
  82.     case '2'   : transfer( proc,&proc2 ) ; break ;
  83.     case '3'   : transfer( proc,&proc3 ) ; break ;
  84.     case 'e'   :
  85.     case 'E'   : transfer( proc,&MAIN  ) ; break ;
  86.     case 'h'   :
  87.     case 'H'   : Menue() ;
  88.     default    : ;
  89.   } ;
  90. } /* ChangeRoutine */
  91.  
  92. void error()
  93.   for(;;)
  94.   {
  95.     printf( "\n%s",errMessage ) ;
  96.     NewInstall = TRUE ;
  97.     transfer( &err,&MAIN ) ;
  98.   } ;
  99. } /* error */
  100.  
  101. void Routine1()
  102. {
  103.   double a,b,c ;
  104.  
  105.   a = 1.2  ;
  106.   b = 10.0 ;
  107.   for(;;)
  108.   {
  109.     Message( 1,'A' ) ;
  110.     c = a + b ;
  111.     printf( "Addition %6.3lf",c ) ;
  112.     ChangeRoutine( &proc1 ) ;
  113.     Message( 1,'B' ) ;
  114.     c = b * a ;
  115.     printf( "Multiplikation %6.3lf",c ) ;
  116.     ChangeRoutine( &proc1 ) ;
  117.     Message( 1,'C' ) ;
  118.     if( c == 0.0 )
  119.     {
  120.       errMessage = "Division durch 0 in Routine 1" ;
  121.       error() ;
  122.     } ;
  123.     c = a / b ;
  124.     printf( "Division %6.3lf",c ) ;
  125.     ChangeRoutine( &proc1 ) ;
  126.     a = c + 2.3 ;
  127.     b = b - 0.5 ;
  128.   } ;
  129. } /* Routine1 */
  130.  
  131. void Routine2()
  132. {
  133.   for(;;)
  134.   {
  135.     Message( 2,'X' ) ;
  136.     printf( "Tick" ) ;
  137.     ChangeRoutine( &proc2 ) ;
  138.     Message( 2,'Y' ) ;
  139.     printf( "Tack" ) ;
  140.     ChangeRoutine( &proc2 ) ;
  141.   } ;
  142. } /* Routine2 */
  143.  
  144. void Routine3()
  145. {
  146.   char ch,ch1 ;
  147.  
  148.   for( ch='A'; ch<='Z'; ch++ )
  149.   {
  150.     Message( 3,'N' ) ;
  151.     printf( "Buchstabenreihe : " ) ;
  152.     for(  ch1='A'; ch1<=ch; putchar( ch1++ ) ) ;
  153.     ChangeRoutine( &proc3 ) ;
  154.   } ;
  155.   errMessage = "Routinenende in Routine 3 erreicht" ;
  156.   error() ;
  157. } /* Routine3 */
  158.  
  159.  
  160. void main()
  161. {
  162.   ClearScreen() ;
  163.   printf( "\n Demoprogramm für Coroutinen\n\n" ) ;
  164.   i = 0 ;
  165.   do
  166.   {
  167.     NewInstall = FALSE ;
  168.     Menue() ;
  169.     newproc( &error   ,errorSp,BufferSize,&err   ) ;
  170.     newproc( &Routine1,Proc1Sp,BufferSize,&proc1 ) ;
  171.     newproc( &Routine2,Proc2Sp,BufferSize,&proc2 ) ;
  172.     newproc( &Routine3,Proc3Sp,BufferSize,&proc3 ) ;
  173.     transfer( &MAIN,&proc1 ) ;
  174.   } while( NewInstall ) ;
  175.   printf( "\n   Ende des Programmes 'Routinen'" ) ;
  176.   Cnecin() ;
  177. } /* Routinen */
  178.