Moontalk server and client (provided by many parties)
Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

54 linhas
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) ;