diff options
author | james <> | 2008-02-07 00:43:27 +0000 |
---|---|---|
committer | james <> | 2008-02-07 00:43:27 +0000 |
commit | e76b1659fd1adbc4bbf6cda15ee885fcbf6c5057 (patch) | |
tree | 8ac583c498a5801434cf8bfa98e8499da87a4a58 /src/ansi.c | |
parent | 6e577fe9ddf5cb2f92b347a177785e3738f062ff (diff) | |
download | sympathy-e76b1659fd1adbc4bbf6cda15ee885fcbf6c5057.tar.gz sympathy-e76b1659fd1adbc4bbf6cda15ee885fcbf6c5057.tar.bz2 sympathy-e76b1659fd1adbc4bbf6cda15ee885fcbf6c5057.zip |
*** empty log message ***
Diffstat (limited to 'src/ansi.c')
-rw-r--r-- | src/ansi.c | 296 |
1 files changed, 166 insertions, 130 deletions
@@ -10,6 +10,9 @@ static char rcsid[] = "$Id$"; /* * $Log$ + * Revision 1.9 2008/02/07 00:43:27 james + * *** empty log message *** + * * Revision 1.8 2008/02/07 00:39:13 james * *** empty log message *** * @@ -56,26 +59,29 @@ set_blocking (int fd) } -int ansi_read(ANSI *a,void *buf,int n) +int +ansi_read (ANSI * a, void *buf, int n) { -int red; + int red; - set_nonblocking(a->fd); -red=read(a->fd,buf,n); + set_nonblocking (a->fd); + red = read (a->fd, buf, n); -if (!red) return -1; + if (!red) + return -1; -if ((red==-1) && (errno==EAGAIN)) { - return 0; -} + if ((red == -1) && (errno == EAGAIN)) + { + return 0; + } -return red; + return red; } void ansi_write (ANSI * a, char *buf, int n) { - set_blocking(a->fd); + set_blocking (a->fd); write (a->fd, buf, n); } @@ -377,176 +383,206 @@ ansi_reset (ANSI * a) crt_reset (&a->crt); ansi_cls (a); - ansi_write(a,"\033=",2); + ansi_write (a, "\033=", 2); ansi_draw (a, &a->crt); } -void ansi_flush_escape(ANSI *a,VT102 *v) + +void +ansi_flush_escape (ANSI * a, VT102 * v) { -ANSI_Parser *p=&a->parser; -int i; + ANSI_Parser *p = &a->parser; + int i; -for (i=0;i<p->escape_ptr;++i) { -vt102_send(v,p->escape_buf[i]); -} + for (i = 0; i < p->escape_ptr; ++i) + { + vt102_send (v, p->escape_buf[i]); + } -p->escape_ptr=0; -p->in_escape=0; + p->escape_ptr = 0; + p->in_escape = 0; } -void ansi_parse_deckey(ANSI *a,VT102 *v) +void +ansi_parse_deckey (ANSI * a, VT102 * v) { -ANSI_Parser *p=&a->parser; -if ((p->escape_buf[1]!='[') && (p->escape_buf[1]!='O')) { - ansi_flush_escape(a,v); - return; -} - -if ((p->escape_buf[2]>='A') || (p->escape_buf[2]<='Z')){ - vt102_send(v,KEY_UP+(p->escape_buf[2]-'A')); -}else if ((p->escape_buf[2]>='a') || (p->escape_buf[2]<='z')){ - vt102_send(v,KEY_154+(p->escape_buf[2]-'a')); -} else { - ansi_flush_escape(a,v); - return; -} -p->in_escape=0; -p->escape_ptr=0; + ANSI_Parser *p = &a->parser; + if ((p->escape_buf[1] != '[') && (p->escape_buf[1] != 'O')) + { + ansi_flush_escape (a, v); + return; + } + + if ((p->escape_buf[2] >= 'A') || (p->escape_buf[2] <= 'Z')) + { + vt102_send (v, KEY_UP + (p->escape_buf[2] - 'A')); + } + else if ((p->escape_buf[2] >= 'a') || (p->escape_buf[2] <= 'z')) + { + vt102_send (v, KEY_154 + (p->escape_buf[2] - 'a')); + } + else + { + ansi_flush_escape (a, v); + return; + } + p->in_escape = 0; + p->escape_ptr = 0; } -void ansi_parse_ansikey(ANSI *a,VT102 *v) +void +ansi_parse_ansikey (ANSI * a, VT102 * v) { -ANSI_Parser *p=&a->parser; + ANSI_Parser *p = &a->parser; -if ((p->escape_buf[1]!='[') ||(p->escape_buf[3]!='~')) { - ansi_flush_escape(a,v); - return; -} -if ((p->escape_buf[2]>='0') || (p->escape_buf[2]<='9')){ - vt102_send(v,KEY_180+(p->escape_buf[2]-'0')); -} else { - ansi_flush_escape(a,v); - return; -} + if ((p->escape_buf[1] != '[') || (p->escape_buf[3] != '~')) + { + ansi_flush_escape (a, v); + return; + } + if ((p->escape_buf[2] >= '0') || (p->escape_buf[2] <= '9')) + { + vt102_send (v, KEY_180 + (p->escape_buf[2] - '0')); + } + else + { + ansi_flush_escape (a, v); + return; + } -p->in_escape=0; -p->escape_ptr=0; + p->in_escape = 0; + p->escape_ptr = 0; } -void ansi_parse_escape(ANSI *a,VT102 *v) +void +ansi_parse_escape (ANSI * a, VT102 * v) { -ANSI_Parser *p=&a->parser; -switch(p->escape_ptr) { -case 0: -case 1: - return; -case 2: - switch (p->escape_buf[1]) { - case '[': - case 'O': - break; - default: - ansi_flush_escape(a,v); - } - break; -case 3: - switch(p->escape_buf[1]) { - case 'O': - ansi_parse_deckey(a,v); - break; - case '[': - if ((p->escape_buf[2]>='A') && - (p->escape_buf[2]<='Z')) - ansi_parse_deckey(a,v); - break; - default: - ansi_flush_escape(a,v); - } - break; -case 4: - switch(p->escape_buf[1]) { - case '[': - ansi_parse_ansikey(a,v); - break; - default: - ansi_flush_escape(a,v); - } - break; -case 5: - ansi_flush_escape(a,v); -} + ANSI_Parser *p = &a->parser; + switch (p->escape_ptr) + { + case 0: + case 1: + return; + case 2: + switch (p->escape_buf[1]) + { + case '[': + case 'O': + break; + default: + ansi_flush_escape (a, v); + } + break; + case 3: + switch (p->escape_buf[1]) + { + case 'O': + ansi_parse_deckey (a, v); + break; + case '[': + if ((p->escape_buf[2] >= 'A') && (p->escape_buf[2] <= 'Z')) + ansi_parse_deckey (a, v); + break; + default: + ansi_flush_escape (a, v); + } + break; + case 4: + switch (p->escape_buf[1]) + { + case '[': + ansi_parse_ansikey (a, v); + break; + default: + ansi_flush_escape (a, v); + } + break; + case 5: + ansi_flush_escape (a, v); + } } -void ansi_check_escape(ANSI *a,VT102 *v) +void +ansi_check_escape (ANSI * a, VT102 * v) { -ANSI_Parser *p=&a->parser; - struct timeval now,diff; - gettimeofday(&now,NULL); - timersub(&now,&p->last_escape,&diff); + ANSI_Parser *p = &a->parser; + struct timeval now, diff; + gettimeofday (&now, NULL); + timersub (&now, &p->last_escape, &diff); #if 0 -fprintf(stderr,"ie %d tl %d.%06d eb %d\n", - p->in_escape,diff.tv_sec,diff.tv_usec,p->escape_ptr); + fprintf (stderr, "ie %d tl %d.%06d eb %d\n", + p->in_escape, diff.tv_sec, diff.tv_usec, p->escape_ptr); #endif -if (!p->in_escape) return; + if (!p->in_escape) + return; - /*Time up?*/ - if (diff.tv_sec || (diff.tv_usec > ANSI_ESCAPE_TIMEOUT)) - ansi_flush_escape(a,v); + /*Time up? */ + if (diff.tv_sec || (diff.tv_usec > ANSI_ESCAPE_TIMEOUT)) + ansi_flush_escape (a, v); } -void ansi_parse_char(ANSI *a,int c,VT102 *v) +void +ansi_parse_char (ANSI * a, int c, VT102 * v) { -ANSI_Parser *p=&a->parser; + ANSI_Parser *p = &a->parser; /*See if it's time to flush the escape*/ -ansi_check_escape(a,v); + ansi_check_escape (a, v); -if (c==033) { - if (p->in_escape) - ansi_flush_escape(a,v); + if (c == 033) + { + if (p->in_escape) + ansi_flush_escape (a, v); - p->in_escape++; - p->escape_ptr=0; - gettimeofday(&p->last_escape,NULL); -} + p->in_escape++; + p->escape_ptr = 0; + gettimeofday (&p->last_escape, NULL); + } -if (p->in_escape) { - p->escape_buf[p->escape_ptr++]=c; - ansi_parse_escape(a,v); -} else { - vt102_send(v,c); -} + if (p->in_escape) + { + p->escape_buf[p->escape_ptr++] = c; + ansi_parse_escape (a, v); + } + else + { + vt102_send (v, c); + } } -void ansi_parse(ANSI *a,char *buf,int len,VT102 *v) +void +ansi_parse (ANSI * a, char *buf, int len, VT102 * v) { -while (len--) -ansi_parse_char(a,*(buf++),v); + while (len--) + ansi_parse_char (a, *(buf++), v); } -int ansi_dispatch(ANSI *a,VT102 *v) +int +ansi_dispatch (ANSI * a, VT102 * v) { -char buf[1024]; -int red; + char buf[1024]; + int red; -ansi_check_escape(a,v); + ansi_check_escape (a, v); -red=ansi_read(a,buf,sizeof(buf)); -if (red<=0) return red; + red = ansi_read (a, buf, sizeof (buf)); + if (red <= 0) + return red; -if (*buf==3) return -1; + if (*buf == 3) + return -1; -ansi_parse(a,buf,red,v); + ansi_parse (a, buf, red, v); -return 0; + return 0; } |