Annotation of researchv10no/cmd/movie/protocol.c, revision 1.1

1.1     ! root        1: /* with luck, protocol can be used in either direction */
        !             2: /* for now, all ascii, for readability */
        !             3: /*
        !             4:        x               character x
        !             5:        nnn             integer nnn, followed by blank
        !             6:                        NEW: last digit is now a letter, no blank
        !             7:        snn abcdef      string abcdef, length nn, term. by \n
        !             8:                        NEW: use new integer encoding
        !             9: 
        !            10:   Changing the integer encoding reduced the time for data transfer in
        !            11:        /u/j/anim/sort/a1.i from 58 seconds to 42 seconds
        !            12: */
        !            13: 
        !            14: char   protobuf[1024];
        !            15: char   *protop = protobuf;
        !            16: 
        !            17: flushproto()
        !            18: {
        !            19:        if (protop > protobuf) {
        !            20:                sendbuf(protobuf, protop);
        !            21:                protop = protobuf;
        !            22:        }
        !            23: }
        !            24: 
        !            25: send1char(c)   /* send one character */
        !            26:        int c;
        !            27: {
        !            28:        if (protop >= protobuf + sizeof protobuf)
        !            29:                flushproto();
        !            30:        *protop++ = c;
        !            31: }
        !            32: 
        !            33: readchar()     /* read one character */
        !            34: {
        !            35:        int c;
        !            36: 
        !            37:        flushproto();
        !            38:        return readbyte();
        !            39: }
        !            40: 
        !            41: sendint(n)     /* send an integer */
        !            42:        int n;
        !            43: {
        !            44:        char buf[20], *p;
        !            45: 
        !            46:        sprintf(buf, "%d", n);
        !            47:        for (p = buf; *(p+1); p++)
        !            48:                send1char(*p);
        !            49:        send1char(*p - '0' + 'a');
        !            50: }
        !            51: 
        !            52: readint()      /* read an integer */
        !            53: {
        !            54:        int n, c, sign;
        !            55: 
        !            56:        flushproto();
        !            57:        while ((c = readbyte()) == ' ' || c == '\n')
        !            58:                ;
        !            59:        assert(c == '-' || isdigit(c) || (c >= 'a' && c <= 'j'),
        !            60:                "c is not a digit");
        !            61:        if (c == '-') {
        !            62:                sign = -1;
        !            63:                c = readbyte();
        !            64:        } else
        !            65:                sign = 1;
        !            66:        for (n = 0; c >= '0' && c <= '9'; c = readbyte())
        !            67:                n = 10 * n + c - '0';
        !            68:        assert(c >= 'a' && c <= 'j', "bad string terminator");
        !            69:        n = 10 * n + c - 'a';
        !            70:        return sign * n;
        !            71: }
        !            72: 
        !            73: sendstring(s)  /* send a string */
        !            74:        char *s;
        !            75: {
        !            76:        send1char('s');
        !            77:        sendint(strlen(s));
        !            78:        while (*s)
        !            79:                send1char(*s++);
        !            80:        send1char('\n');
        !            81: }
        !            82: 
        !            83: readstring(s)  /* read string into s (better be big enough) */
        !            84:        char *s;
        !            85: {
        !            86:        int c, n, m;
        !            87:        char *p = s;
        !            88: 
        !            89:        flushproto();
        !            90:        c = readbyte();
        !            91:        assert(c == 's', "readstring: c == 's'");
        !            92:        m = n = readint();
        !            93:        while (n--)
        !            94:                *p++ = readbyte();
        !            95:        *p = '\0';
        !            96:        c = readbyte();
        !            97:        assert(c == '\n', "c == '\\n'");
        !            98:        return m;
        !            99: }
        !           100: 
        !           101: isdigit(c)
        !           102: {
        !           103:        return c >= '0' && c <= '9';
        !           104: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.