proc/escape.c works for ps
This commit is contained in:
parent
34dd01fa40
commit
b67dc52160
@ -76,9 +76,10 @@ leave:
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* sanitize a string via one-way mangle */
|
/* sanitize a string via one-way mangle */
|
||||||
int escape_str(char *restrict dst, const char *restrict src, size_t bytes){
|
int escape_str(char *restrict dst, const char *restrict src, int bufsize, int maxglyphs){
|
||||||
unsigned char c;
|
unsigned char c;
|
||||||
size_t i;
|
int my_glyphs = 0;
|
||||||
|
int my_bytes = 0;
|
||||||
const char codes[] =
|
const char codes[] =
|
||||||
"Z-------------------------------"
|
"Z-------------------------------"
|
||||||
"********************************"
|
"********************************"
|
||||||
@ -88,25 +89,21 @@ int escape_str(char *restrict dst, const char *restrict src, size_t bytes){
|
|||||||
"********************************"
|
"********************************"
|
||||||
"********************************"
|
"********************************"
|
||||||
"********************************";
|
"********************************";
|
||||||
bytes--; // allow room for NUL character
|
|
||||||
for(i=0; i<bytes;){
|
if(bufsize > maxglyphs+1) bufsize=maxglyphs+1; // FIXME: assumes 8-bit locale
|
||||||
|
|
||||||
|
for(;;){
|
||||||
|
if(my_glyphs >= maxglyphs) break;
|
||||||
|
if(my_bytes+1 >= bufsize) break;
|
||||||
c = (unsigned char) *(src++);
|
c = (unsigned char) *(src++);
|
||||||
switch(codes[c]){
|
if(!c) break;
|
||||||
case 'Z':
|
if(codes[c]=='-') c='?';
|
||||||
goto leave;
|
my_glyphs++;
|
||||||
case '*':
|
my_bytes++;
|
||||||
i++;
|
*(dst++) = c;
|
||||||
*(dst++) = c;
|
|
||||||
break;
|
|
||||||
case '-':
|
|
||||||
i++;
|
|
||||||
*(dst++) = '?';
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
leave:
|
|
||||||
*(dst++) = '\0';
|
*(dst++) = '\0';
|
||||||
return i+1; // bytes of text, excluding the NUL
|
return my_bytes; // bytes of text, excluding the NUL
|
||||||
}
|
}
|
||||||
|
|
||||||
/////////////////////////////////////////////////
|
/////////////////////////////////////////////////
|
||||||
@ -122,7 +119,7 @@ int escape_strlist(char *restrict dst, const char *restrict const *restrict src,
|
|||||||
//}
|
//}
|
||||||
|
|
||||||
for(;;){
|
for(;;){
|
||||||
i += escape_str(dst+i, *src, bytes-i);
|
i += escape_str(dst+i, *src, bytes-i, bytes-i); // FIXME: byte/glyph
|
||||||
if(bytes-i < 3) break; // need room for space, a character, and the NUL
|
if(bytes-i < 3) break; // need room for space, a character, and the NUL
|
||||||
src++;
|
src++;
|
||||||
if(!*src) break; // need something to print
|
if(!*src) break; // need something to print
|
||||||
@ -159,7 +156,7 @@ int escape_command(char *restrict const outbuf, const proc_t *restrict const pp,
|
|||||||
if(flags & ESC_BRACKETS){
|
if(flags & ESC_BRACKETS){
|
||||||
outbuf[end++] = '[';
|
outbuf[end++] = '[';
|
||||||
}
|
}
|
||||||
end += escape_str(outbuf+end, pp->cmd, bytes-overhead);
|
end += escape_str(outbuf+end, pp->cmd, bytes-overhead, glyphs-overhead+1);
|
||||||
|
|
||||||
// Hmmm, do we want "[foo] <defunct>" or "[foo <defunct>]"?
|
// Hmmm, do we want "[foo] <defunct>" or "[foo <defunct>]"?
|
||||||
if(flags & ESC_BRACKETS){
|
if(flags & ESC_BRACKETS){
|
||||||
|
@ -13,7 +13,7 @@ EXTERN_C_BEGIN
|
|||||||
#define ESC_DEFUNCT 0x4 // mark zombies with " <defunct>"
|
#define ESC_DEFUNCT 0x4 // mark zombies with " <defunct>"
|
||||||
|
|
||||||
extern int escape_strlist(char *restrict dst, const char *restrict const *restrict src, size_t n);
|
extern int escape_strlist(char *restrict dst, const char *restrict const *restrict src, size_t n);
|
||||||
extern int escape_str(char *restrict dst, const char *restrict src, size_t n);
|
extern int escape_str(char *restrict dst, const char *restrict src, int bufsize, int maxglyphs);
|
||||||
extern int octal_escape_str(char *restrict dst, const char *restrict src, size_t n);
|
extern int octal_escape_str(char *restrict dst, const char *restrict src, size_t n);
|
||||||
extern int simple_escape_str(char *restrict dst, const char *restrict src, size_t n);
|
extern int simple_escape_str(char *restrict dst, const char *restrict src, size_t n);
|
||||||
|
|
||||||
|
40
ps/output.c
40
ps/output.c
@ -342,22 +342,18 @@ Modifications to the arguments are not shown.
|
|||||||
* pp->environ environment
|
* pp->environ environment
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
// FIXME: some of these may hit the guard page in forest mode
|
||||||
|
|
||||||
/* "command" is the same thing: long unless c */
|
/* "command" is the same thing: long unless c */
|
||||||
static int pr_args(char *restrict const outbuf, const proc_t *restrict const pp){
|
static int pr_args(char *restrict const outbuf, const proc_t *restrict const pp){
|
||||||
char *endp;
|
char *endp;
|
||||||
|
unsigned flags;
|
||||||
|
|
||||||
endp = outbuf + forest_helper(outbuf);
|
endp = outbuf + forest_helper(outbuf);
|
||||||
if(bsd_c_option){
|
if(bsd_c_option) flags = ESC_DEFUNCT;
|
||||||
endp += escape_str(endp, pp->cmd, PAGE_SIZE); /* short version */
|
else flags = ESC_DEFUNCT | ESC_BRACKETS | ESC_ARGS;
|
||||||
}else{
|
endp += escape_command(endp, pp, OUTBUF_SIZE, OUTBUF_SIZE, flags);
|
||||||
const char **lc = (const char**)pp->cmdline; /* long version */
|
|
||||||
if(lc && *lc) {
|
|
||||||
endp += escape_strlist(endp, lc, OUTBUF_SIZE);
|
|
||||||
} else {
|
|
||||||
char buf[ESC_STRETCH*PAGE_SIZE]; /* TODO: avoid copy */
|
|
||||||
escape_str(buf, pp->cmd, ESC_STRETCH*PAGE_SIZE);
|
|
||||||
endp += snprintf(endp, COLWID, "[%s]", buf);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(bsd_e_option){
|
if(bsd_e_option){
|
||||||
const char **env = (const char**)pp->environ;
|
const char **env = (const char**)pp->environ;
|
||||||
if(env && *env){
|
if(env && *env){
|
||||||
@ -371,19 +367,13 @@ static int pr_args(char *restrict const outbuf, const proc_t *restrict const pp)
|
|||||||
/* "ucomm" is the same thing: short unless -f */
|
/* "ucomm" is the same thing: short unless -f */
|
||||||
static int pr_comm(char *restrict const outbuf, const proc_t *restrict const pp){
|
static int pr_comm(char *restrict const outbuf, const proc_t *restrict const pp){
|
||||||
char *endp;
|
char *endp;
|
||||||
|
unsigned flags;
|
||||||
|
|
||||||
endp = outbuf + forest_helper(outbuf);
|
endp = outbuf + forest_helper(outbuf);
|
||||||
if(!unix_f_option){ /* does -f matter? */
|
if(unix_f_option) flags = ESC_DEFUNCT | ESC_BRACKETS | ESC_ARGS;
|
||||||
endp += escape_str(endp, pp->cmd, PAGE_SIZE); /* short version */
|
else flags = ESC_DEFUNCT;
|
||||||
}else{
|
endp += escape_command(endp, pp, OUTBUF_SIZE, OUTBUF_SIZE, flags);
|
||||||
const char **lc = (const char**)pp->cmdline; /* long version */
|
|
||||||
if(lc && *lc) {
|
|
||||||
endp += escape_strlist(endp, lc, OUTBUF_SIZE);
|
|
||||||
} else {
|
|
||||||
char buf[ESC_STRETCH*PAGE_SIZE]; /* TODO: avoid copy */
|
|
||||||
escape_str(buf, pp->cmd, ESC_STRETCH*PAGE_SIZE);
|
|
||||||
endp += snprintf(endp, COLWID, "[%s]", buf);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(bsd_e_option){
|
if(bsd_e_option){
|
||||||
const char **env = (const char**)pp->environ;
|
const char **env = (const char**)pp->environ;
|
||||||
if(env && *env){
|
if(env && *env){
|
||||||
@ -397,7 +387,7 @@ static int pr_comm(char *restrict const outbuf, const proc_t *restrict const pp)
|
|||||||
static int pr_fname(char *restrict const outbuf, const proc_t *restrict const pp){
|
static int pr_fname(char *restrict const outbuf, const proc_t *restrict const pp){
|
||||||
char *endp;
|
char *endp;
|
||||||
endp = outbuf + forest_helper(outbuf);
|
endp = outbuf + forest_helper(outbuf);
|
||||||
endp += escape_str(endp, pp->cmd, 8);
|
endp += escape_str(endp, pp->cmd, OUTBUF_SIZE, 8);
|
||||||
return endp - outbuf;
|
return endp - outbuf;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user