home *** CD-ROM | disk | FTP | other *** search
/ BCI NET 2 / BCI NET 2.iso / archives / programming / e / amigae30a_fr.lha / AmigaE30f / Sources / Pd / PubScreenNames.e < prev    next >
Encoding:
Text File  |  1994-02-21  |  6.3 KB  |  168 lines

  1. /* PubScreenNames.e
  2.  * Affiche le nom et quelques atres attributs d'écrans public ouverts
  3.  * Teste aussi la présence d'écran particulier.
  4.  *
  5.  * Domaine Public par Diego Caravana.
  6.  * ( Source traduit par Olivier ANH (BUGSS) )
  7.  *
  8.  * Merci à Wouter van Oortmerssen pour son TRES BON travail, en espérant
  9.  * qu'il continuera a programmer en E !
  10.  *
  11.  * Hé, apprenez le E !!!
  12.  *
  13.  */
  14.  
  15. /* TAB=4 */
  16.  
  17. OPT OSVERSION=37
  18.  
  19. /* Ici les OBJECTs qu'on utilise pour copier les données inhérentes aux écrans
  20.  * public. Copier les données est nécessaire car le vérroulliage (lock) de la
  21.  * liste (PubScreen List) doit être le plus court possible (voir les autodocs
  22.  * de Commodore). C'est due au fait que la liste ne peut être modifiée (i.e.
  23.  * aucune fnêtre ne peut s'ouvrir ou se fermer) tant qu'elle est verrouillée
  24.  * par un tache.
  25.  */
  26.  
  27. OBJECT mypubscreen
  28.         name, flags:INT, visitorcnt:INT, screen, task, next
  29. ENDOBJECT
  30.  
  31. MODULE 'intuition/screens', 'exec/lists', 'exec/nodes'
  32.  
  33. CONST ARGS_NUM=2
  34. ENUM  ARG_FULL, ARG_EXISTS
  35.  
  36. ENUM ERR_NONE=0, ERR_PUBLOCK, ERR_MEM, ERR_WRONGARGS, OK_FOUND, OK_NOTFOUND
  37.  
  38. DEF     localpslist:mypubscreen, strflags[25]:STRING, args[ARGS_NUM]:ARRAY OF LONG
  39.  
  40. RAISE ERR_MEM           IF String()=NIL,
  41.           ERR_PUBLOCK   IF LockPubScreenList()=NIL,
  42.           ERR_WRONGARGS IF ReadArgs()=NIL,
  43.           ERR_MEM               IF New()=NIL
  44.  
  45. PROC main() HANDLE
  46. DEF pslist:PTR TO lh, psnode:PTR TO ln, i=0, localpsnode:PTR TO mypubscreen,
  47.         pubscreen:PTR TO pubscreennode, publock=NIL, rdargs=NIL
  48.  
  49.         VOID '$VER: PubScreenNames 1.1 (13.02.93) par Diego Caravana'
  50.  
  51.         rdargs := ReadArgs('FULL/S,EXISTS/K', args, 0)
  52.  
  53.         /* Prend la liste des écran public ;
  54.          * Elle ne sera pas modifiée pendant la lecture
  55.          */
  56.         publock := LockPubScreenList()
  57.  
  58.         /* première boucle : copie toutes les données nécessaires le plus vite possible
  59.          */
  60.         pslist := publock
  61.         psnode := pslist.head
  62.         localpsnode := localpslist
  63.  
  64.         WHILE psnode.succ <> NIL
  65.  
  66.                 /* teste si un écran EXISTS avec un nom spécifié
  67.                  */
  68.                 IF StrCmp(psnode.name, args[ARG_EXISTS], ALL) THEN Raise(OK_FOUND)
  69.  
  70.                 /* alloue une chaine dynamique pour reduire la mémoire utilisée
  71.                  * car les STRINGs ne sont pas permises (bientôt, j'espère :)
  72.                  * dans les OBJECTs
  73.                  */
  74.                 localpsnode.name:=String(StrLen(psnode.name)+2)
  75.                 StrCopy(localpsnode.name, psnode.name, ALL)
  76.                 IF args[ARG_FULL]=-1    /* copy only if needed */
  77.                         pubscreen:=psnode
  78.                         localpsnode.flags:=pubscreen.flags
  79.                         localpsnode.visitorcnt:=pubscreen.visitorcount
  80.                         localpsnode.task:=pubscreen.sigtask
  81.                         localpsnode.screen:=pubscreen.screen
  82.                 ENDIF
  83.  
  84.                 /* alloue un OBJECT pour contenir les informations du
  85.                  * prochain écran
  86.                  */
  87.                 localpsnode.next:=New(SIZEOF mypubscreen)
  88.  
  89.                 /* change les pointeurs pour éxaminer la chaine
  90.                  */
  91.                 localpsnode:=localpsnode.next
  92.                 psnode:=psnode.succ
  93.         ENDWHILE
  94.  
  95.         UnlockPubScreenList()
  96.         publock:=NIL    /* pour mémoire que l'on a déverrouillé (release the lock)*/
  97.  
  98.         /* à ce point, si un nom d'écran est spécifié avec EXIST, il n'a pas
  99.          * été trouvé comme Ecran Public (Public Screen) dans la boucle
  100.          * précédente, on peut alors sortir avec une code de retour null
  101.          */
  102.         IF StrLen(args[ARG_EXISTS]) <> 0 THEN Raise(OK_NOTFOUND)
  103.  
  104.         /* imprime l'entête avec la description des champs
  105.      */
  106.         IF args[ARG_FULL]=-1    /* imprime le bon ! */
  107.                 WriteF('\n N. Nom               Visiteurs Ecran      Tache      Flags\n')
  108.                 WriteF(  ' ---------------------------------------------------------------------------\n')
  109.         ELSE
  110.                 WriteF('\n N. Nom\n')
  111.                 WriteF(  ' ----------------------\n')
  112.         ENDIF
  113.  
  114.         /* Seconde boucle : imprime toutes les données
  115.          */
  116.         localpsnode:=localpslist
  117.         WHILE localpsnode.next <> NIL
  118.                 i++
  119.  
  120.                 IF args[ARG_FULL]=-1    /* choisir les infos à imprimer */
  121.  
  122.                         /* not-so-simple code: the two flags are independent by one another
  123.                          * and also we want a "|" (OR in C) put between them; then, there
  124.                          * is a default string which is used when no flag is set
  125.                          */
  126.                         StrCopy(strflags,'<No Flags Set>',ALL)
  127.                         IF localpsnode.flags AND SHANGHAI
  128.                                 StrCopy(strflags,'SHANGHAI',ALL)
  129.                                 IF localpsnode.flags AND POPPUBSCREEN
  130.                                         StrAdd(strflags,'|POPPUBSCREEN',ALL)
  131.                                 ENDIF
  132.                         ELSE
  133.                                 IF localpsnode.flags AND POPPUBSCREEN
  134.                                         StrCopy(strflags,'POPPUBSCREEN',ALL)
  135.                                 ENDIF
  136.                         ENDIF
  137.  
  138.                         WriteF(' \l\d[2] \l\s[18]    \l\d[3]   $\z\h[8]  $\z\h[8]  \l\s\n',
  139.                                 i, localpsnode.name, localpsnode.visitorcnt,
  140.                                 localpsnode.screen, localpsnode.task, strflags )
  141.                 ELSE
  142.                         WriteF(' \l\d[2] \l\s[18]\n', i, localpsnode.name)
  143.                 ENDIF
  144.  
  145.                 localpsnode:=localpsnode.next
  146.         ENDWHILE
  147.         WriteF('\n Trouvé \d Public Screen(s)\n\n', i)
  148.  
  149.         Raise(ERR_NONE)
  150.  
  151. EXCEPT
  152.         IF publock THEN UnlockPubScreenList()
  153.     IF rdargs THEN FreeArgs(rdargs)
  154.  
  155.         SELECT exception
  156.                 CASE ERR_NONE;
  157.                 CASE OK_FOUND;          CleanUp(5)              /* Si WARN, ce sera vrai (true) */
  158.                 CASE OK_NOTFOUND;       CleanUp(0)
  159.                 CASE ERR_PUBLOCK;       WriteF('*** Ne peut obtenir les infos sur PubScreen !\n')
  160.                 CASE ERR_MEM;           WriteF('*** Pas de  mémoire !\n')
  161.                 DEFAULT;                        PrintFault(IoErr(), '*** Erreur')
  162.         ENDSELECT
  163.  
  164.         IF exception THEN CleanUp(10)
  165.         CleanUp(0)
  166.  
  167. ENDPROC
  168.