Page Menu
Home
c4science
Search
Configure Global Search
Log In
Files
F85152194
editline.c
No One
Temporary
Actions
Download File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Subscribers
None
File Metadata
Details
File Info
Storage
Attached
Created
Fri, Sep 27, 03:28
Size
2 KB
Mime Type
text/x-c
Expires
Sun, Sep 29, 03:28 (1 d, 23 h)
Engine
blob
Format
Raw Data
Handle
21135556
Attached To
R10977 RADIANCE Photon Map
editline.c
View Options
#ifndef lint
static const char RCSid[] = "$Id: editline.c,v 2.9 2013/11/14 02:05:09 greg Exp $";
#endif
/*
* editline.c - routine for editing raw input for rview.
*
* External symbols declared in driver.h
*/
#include "copyright.h"
#include <stdio.h>
#include <string.h>
#include "color.h"
#include "driver.h"
#define iscntrl(c) ((c) < ' ')
#define isblank(c) ((c) == ' ')
#define iserase(c) ((c) == '\b' || (c) == 127)
#define iswerase(c) ((c) == 'W'-'@')
#define iskill(c) ((c) == 'U'-'@' || (c) == 'X'-'@')
void
editline( /* edit input line */
char *buf,
dr_getchf_t *c_get,
dr_comoutf_t *s_put
)
{
static char erases[] = "\b \b";
static char obuf[4];
int i;
int c;
i = 0;
while ((c = (*c_get)()&0177) != '\n' && c != '\r')
if (iserase(c)) { /* single char erase */
if (i > 0) {
(*s_put)(erases);
--i;
}
} else if (iswerase(c)) { /* word erase */
while (i > 0 && isblank(buf[i-1])) {
(*s_put)(erases);
--i;
}
while (i > 0 && !isblank(buf[i-1])) {
(*s_put)(erases);
--i;
}
} else if (iskill(c)) { /* kill line */
while (i > 0) {
(*s_put)(erases);
--i;
}
} else if (iscntrl(c)) { /* control char */
i = 0;
buf[i++] = c;
obuf[0] = '^'; obuf[1] = c|0100; obuf[2] = '\0';
(*s_put)(obuf);
break;
} else { /* regular char */
buf[i++] = c;
obuf[0] = c; obuf[1] = '\0';
(*s_put)(obuf);
}
buf[i] = '\0';
(*s_put)("\n");
}
static char mybuf[512];
void
tocombuf( /* add command(s) to my buffer */
char *b,
struct driver *d
)
{
char *cp;
char *comstart;
for (cp = mybuf; *cp; cp++)
;
comstart = cp;
while ( (*cp++ = *b) )
if (cp >= mybuf+sizeof(mybuf)) {
*comstart = '\0';
return; /* what should I do about this? */
} else if (*b++ == '\n') {
d->inpready++;
comstart = cp;
}
}
int
fromcombuf( /* get command from my buffer */
char *b,
struct driver *d
)
{
char *cp, *cp1;
/* get next command */
for (cp = mybuf; *cp != '\n'; cp++)
if (!*cp)
return(0);
*cp++ = '\0';
#ifdef DEBUG
(*d->comout)(mybuf); /* echo my command */
(*d->comout)("\n");
#endif
/* send it as reply */
strcpy(b, mybuf);
d->inpready--;
/* advance commands */
cp1 = mybuf;
while ((*cp1++ = *cp++))
;
return(1);
}
Event Timeline
Log In to Comment