Moontalk server and client (provided by many parties)
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

54 lignes
1.5KB

  1. require util.4th
  2. 256 constant CONNECTION_BUFFER_SIZE
  3. 0
  4. cell +field connection.number
  5. cell +field connection.admin
  6. cell +field connection.fd
  7. cell +field connection.connected
  8. cell +field connection.sendcount
  9. cell +field connection.circuitid
  10. cell +field connection.bufferlen
  11. CONNECTION_BUFFER_SIZE +field connection.buffer
  12. constant /CONNECTION
  13. 32 constant MAX_CONNECTIONS
  14. -1 variable! last-connection
  15. -1 variable! largest-index
  16. MAX_CONNECTIONS /CONNECTION * constant CONNECTIONS_SIZE
  17. create connections CONNECTIONS_SIZE allot
  18. connections CONNECTIONS_SIZE erase
  19. : (translate) ( index-u -- connection-addr )
  20. /CONNECTION * connections + ;
  21. : (untranslate) ( connection-addr -- index-u )
  22. connections - /CONNECTION / ;
  23. : (find-free) ( -- index-u flag )
  24. MAX_CONNECTIONS 0 DO
  25. I (translate) connection.connected @ invert IF
  26. I true UNLOOP EXIT
  27. THEN
  28. LOOP 0 false ;
  29. : connections.append ( connection-addr -- flag )
  30. (find-free) IF
  31. tuck (translate) /CONNECTION move
  32. dup last-connection !
  33. dup largest-index @ > IF
  34. largest-index !
  35. ELSE
  36. drop
  37. THEN
  38. true
  39. ELSE
  40. 2drop false
  41. THEN ;
  42. : connections.count ( -- count-u )
  43. largest-index @ 1+ ;
  44. : connections.at ( index-u -- connection-addr )
  45. (translate) ;
  46. : connections.last ( -- connection-addr )
  47. last-connection @ (translate) ;
  48. : connections.indexOf ( connection-addr -- index-u )
  49. (untranslate) ;