(root)/
util-linux-2.39/
text-utils/
hexdump-conv.c
       1  /*
       2   * Copyright (c) 1989 The Regents of the University of California.
       3   * All rights reserved.
       4   *
       5   * Redistribution and use in source and binary forms, with or without
       6   * modification, are permitted provided that the following conditions
       7   * are met:
       8   * 1. Redistributions of source code must retain the above copyright
       9   *    notice, this list of conditions and the following disclaimer.
      10   * 2. Redistributions in binary form must reproduce the above copyright
      11   *    notice, this list of conditions and the following disclaimer in the
      12   *    documentation and/or other materials provided with the distribution.
      13   * 3. All advertising materials mentioning features or use of this software
      14   *    must display the following acknowledgement:
      15   *	This product includes software developed by the University of
      16   *	California, Berkeley and its contributors.
      17   * 4. Neither the name of the University nor the names of its contributors
      18   *    may be used to endorse or promote products derived from this software
      19   *    without specific prior written permission.
      20   *
      21   * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
      22   * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
      23   * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
      24   * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
      25   * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
      26   * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
      27   * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
      28   * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
      29   * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
      30   * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
      31   * SUCH DAMAGE.
      32   */
      33  
      34  #include <stdio.h>
      35  #include <ctype.h>
      36  #include <sys/types.h>
      37  #include "hexdump.h"
      38  #include "xalloc.h"
      39  
      40  void
      41  conv_c(struct hexdump_pr *pr, u_char *p)
      42  {
      43  	char *buf = NULL;
      44  	char const *str;
      45  
      46  	switch(*p) {
      47  	case '\0':
      48  		str = "\\0";
      49  		goto strpr;
      50  	/* case '\a': */
      51  	case '\007':
      52  		str = "\\a";
      53  		goto strpr;
      54  	case '\b':
      55  		str = "\\b";
      56  		goto strpr;
      57  	case '\f':
      58  		str = "\\f";
      59  		goto strpr;
      60  	case '\n':
      61  		str = "\\n";
      62  		goto strpr;
      63  	case '\r':
      64  		str = "\\r";
      65  		goto strpr;
      66  	case '\t':
      67  		str = "\\t";
      68  		goto strpr;
      69  	case '\v':
      70  		str = "\\v";
      71  		goto strpr;
      72  	default:
      73  		break;
      74  	}
      75  	if (isprint(*p)) {
      76  		*pr->cchar = 'c';
      77  		printf(pr->fmt, *p);
      78  	} else {
      79  		xasprintf(&buf, "%03o", *p);
      80  		str = buf;
      81  strpr:		*pr->cchar = 's';
      82  		printf(pr->fmt, str);
      83  	}
      84  	free(buf);
      85  }
      86  
      87  void
      88  conv_u(struct hexdump_pr *pr, u_char *p)
      89  {
      90  	static const char *list[] = {
      91  		"nul", "soh", "stx", "etx", "eot", "enq", "ack", "bel",
      92  		 "bs",  "ht",  "lf",  "vt",  "ff",  "cr",  "so",  "si",
      93  		"dle", "dc1", "dc2", "dc3", "dc4", "nak", "syn", "etb",
      94  		"can",  "em", "sub", "esc",  "fs",  "gs",  "rs",  "us",
      95  	};
      96  
      97  						/* od used nl, not lf */
      98  	if (*p <= 0x1f) {
      99  		*pr->cchar = 's';
     100  		printf(pr->fmt, list[*p]);
     101  	} else if (*p == 0x7f) {
     102  		*pr->cchar = 's';
     103  		printf(pr->fmt, "del");
     104  	} else if (isprint(*p)) {
     105  		*pr->cchar = 'c';
     106  		printf(pr->fmt, *p);
     107  	} else {
     108  		*pr->cchar = 'x';
     109  		printf(pr->fmt, *p);
     110  	}
     111  }