⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tr.c

📁 操作系统源代码
💻 C
字号:
/* tr - translate characters		Author: Michiel Huisjes *//* Usage: tr [-cds] [string1 [string2]] *	c: take complement of string1 *	d: delete input characters coded string1 *	s: squeeze multiple output characters of string2 into one character */#define BUFFER_SIZE	1024#define ASCII		0377typedef char BOOL;#define TRUE	1#define FALSE	0#define NIL_PTR		((char *) 0)BOOL com_fl, del_fl, sq_fl;unsigned char output[BUFFER_SIZE], input[BUFFER_SIZE];unsigned char vector[ASCII + 1];BOOL invec[ASCII + 1], outvec[ASCII + 1];short in_index, out_index;#include <sys/types.h>#include <string.h>#include <stdlib.h>#include <unistd.h>_PROTOTYPE(int main, (int argc, char **argv));_PROTOTYPE(void convert, (void));_PROTOTYPE(void map, (unsigned char *string1, unsigned char *string2));_PROTOTYPE(void expand, (char *arg, unsigned char *buffer));_PROTOTYPE(void complement, (unsigned char *buffer));int main(argc, argv)int argc;char *argv[];{  register unsigned char *ptr;  int index = 1;  short i;  if (argc > 1 && argv[index][0] == '-') {	for (ptr = (unsigned char *) &argv[index][1]; *ptr; ptr++) {		switch (*ptr) {		    case 'c':	com_fl = TRUE;	break;		    case 'd':	del_fl = TRUE;	break;		    case 's':	sq_fl = TRUE;	break;		    default:			write(2,"Usage: tr [-cds] [string1 [string2]].\n", 38);			exit(1);		}	}	index++;  }  for (i = 0; i <= ASCII; i++) {	vector[i] = i;	invec[i] = outvec[i] = FALSE;  }  if (argv[index] != NIL_PTR) {	expand(argv[index++], input);	if (com_fl) complement(input);	if (argv[index] != NIL_PTR) expand(argv[index], output);	if (argv[index] != NIL_PTR) map(input, output);	for (ptr = input; *ptr; ptr++) invec[*ptr] = TRUE;	for (ptr = output; *ptr; ptr++) outvec[*ptr] = TRUE;  }  convert();  return(0);}void convert(){  short read_chars = 0;  short c, coded;  short last = -1;  for (;;) {	if (in_index == read_chars) {		if ((read_chars = read(0, (char *)input, BUFFER_SIZE)) <= 0) {			if (write(1, (char *)output, out_index) != out_index)				write(2, "Bad write\n", 10);			exit(0);		}		in_index = 0;	}	c = input[in_index++];	coded = vector[c];	if (del_fl && invec[c]) continue;	if (sq_fl && last == coded && outvec[coded]) continue;	output[out_index++] = last = coded;	if (out_index == BUFFER_SIZE) {		if (write(1, (char *)output, out_index) != out_index) {			write(2, "Bad write\n", 10);			exit(1);		}		out_index = 0;	}  }  /* NOTREACHED */}void map(string1, string2)register unsigned char *string1, *string2;{  unsigned char last;  while (*string1) {	if (*string2 == '\0')		vector[*string1] = last;	else		vector[*string1] = last = *string2++;	string1++;  }}void expand(arg, buffer)register char *arg;register unsigned char *buffer;{  int i, ac;  while (*arg) {	if (*arg == '\\') {		arg++;		i = ac = 0;		if (*arg >= '0' && *arg <= '7') {			do {				ac = (ac << 3) + *arg++ - '0';				i++;			} while (i < 4 && *arg >= '0' && *arg <= '7');			*buffer++ = ac;		} else if (*arg != '\0')			*buffer++ = *arg++;	} else if (*arg == '[') {		arg++;		i = *arg++;		if (*arg++ != '-') {			*buffer++ = '[';			arg -= 2;			continue;		}		ac = *arg++;		while (i <= ac) *buffer++ = i++;		arg++;		/* Skip ']' */	} else		*buffer++ = *arg++;  }}void complement(buffer)unsigned char *buffer;{  register unsigned char *ptr;  register short i, index;  unsigned char conv[ASCII + 2];  index = 0;  for (i = 1; i <= ASCII; i++) {	for (ptr = buffer; *ptr; ptr++)		if (*ptr == i) break;	if (*ptr == '\0') conv[index++] = i & ASCII;  }  conv[index] = '\0';  strcpy((char *)buffer, (char *)conv);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -