proc/escape.c works for ps
This commit is contained in:
		@@ -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;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user