256 constant CONNECTION_BUFFER_SIZE 0 cell +field connection.number cell +field connection.fd cell +field connection.connected cell +field connection.bufferlen CONNECTION_BUFFER_SIZE +field connection.buffer constant /CONNECTION 1024 10 * constant MAX_CONNECTIONS variable last-connection -1 last-connection ! variable largest-index -1 largest-index ! MAX_CONNECTIONS /CONNECTION * constant CONNECTIONS_SIZE create connections CONNECTIONS_SIZE allot connections CONNECTIONS_SIZE erase : (translate) ( index-u -- connection-addr ) /CONNECTION * connections + ; : (untranslate) ( connection-addr -- index-u ) connections - /CONNECTION / ; : (find-free) ( -- index-u flag ) MAX_CONNECTIONS 0 DO I (translate) connection.connected @ invert IF I true UNLOOP EXIT THEN LOOP 0 false ; : connections.append ( connection-addr -- flag ) (find-free) IF tuck (translate) /CONNECTION move dup last-connection ! dup largest-index @ > IF largest-index ! ELSE drop THEN true ELSE 2drop false THEN ; : connections.count ( -- count-u ) largest-index @ 1+ ; : connections.at ( index-u -- connection-addr ) (translate) ; : connections.last ( -- connection-addr ) last-connection @ (translate) ; : connections.indexOf ( connection-addr -- index-u ) (untranslate) ;