imclient_writeastring

Patrick Welche prlw1 at newn.cam.ac.uk
Fri Apr 4 14:33:28 EST 2003


Currently class is initialised as 2, which means that the charclass check
is bypassed (max(charclass)=2 => class always >= charclass), and quoted
strings are never emitted. Does this mean that there was a problem with
quoted strings at some time?

It's more obvious what is going on in the following replacement switch
statement version. (Seems to work with class = 0)

Cheers,

Patrick


static int imclient_writeastring(struct imclient *imclient, const char *str)
{
    const char *p;
    unsigned len = 0;
    int class = 0;
    char buf[30];

    assert(imclient);
    assert(str);
    
    for (p = str; *p; p++) {
		len++;
		if (class > charclass[(unsigned char)*p]) {
	    	class = charclass[(unsigned char)*p];
		}
	}
	if (len == 0) return 0;
	if (len >= 1024) class = 0;
	switch (class) {
		case 2: /* Atom */
			imclient_write(imclient, str, len);
			break;
		case 1: /* Quoted-string */
			imclient_write(imclient, "\"", 1);
			imclient_write(imclient, str, len);
			imclient_write(imclient, "\"", 1);
			break;
		case 0: /* Literal */
			if (imclient->flags & IMCLIENT_CONN_NONSYNCLITERAL) {
	    		snprintf(buf, sizeof(buf), "{%u+}\r\n", len);
	    		imclient_write(imclient, buf, strlen(buf));
			} else {
	    		imclient->readytag = imclient->gensym;
	    		snprintf(buf, sizeof(buf), "{%u}\r\n", len);
	    		imclient_write(imclient, buf, strlen(buf));
	    		while (imclient->readytag) {
					imclient_processoneevent(imclient);
	    		}
	    		if (!imclient->readytxt) return 1;
			}
			imclient_write(imclient, str, len);
			break;
    }
    return 0;
}




More information about the Info-cyrus mailing list