17c478bd9Sstevel@tonic-gate /* 27c478bd9Sstevel@tonic-gate * CDDL HEADER START 37c478bd9Sstevel@tonic-gate * 47c478bd9Sstevel@tonic-gate * The contents of this file are subject to the terms of the 57c478bd9Sstevel@tonic-gate * Common Development and Distribution License, Version 1.0 only 67c478bd9Sstevel@tonic-gate * (the "License"). You may not use this file except in compliance 77c478bd9Sstevel@tonic-gate * with the License. 87c478bd9Sstevel@tonic-gate * 97c478bd9Sstevel@tonic-gate * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 107c478bd9Sstevel@tonic-gate * or http://www.opensolaris.org/os/licensing. 117c478bd9Sstevel@tonic-gate * See the License for the specific language governing permissions 127c478bd9Sstevel@tonic-gate * and limitations under the License. 137c478bd9Sstevel@tonic-gate * 147c478bd9Sstevel@tonic-gate * When distributing Covered Code, include this CDDL HEADER in each 157c478bd9Sstevel@tonic-gate * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 167c478bd9Sstevel@tonic-gate * If applicable, add the following below this CDDL HEADER, with the 177c478bd9Sstevel@tonic-gate * fields enclosed by brackets "[]" replaced with your own identifying 187c478bd9Sstevel@tonic-gate * information: Portions Copyright [yyyy] [name of copyright owner] 197c478bd9Sstevel@tonic-gate * 207c478bd9Sstevel@tonic-gate * CDDL HEADER END 217c478bd9Sstevel@tonic-gate */ 227c478bd9Sstevel@tonic-gate 237c478bd9Sstevel@tonic-gate /* 24a77d64afScf46844 * Copyright 2005 Sun Microsystems, Inc. All rights reserved. 257c478bd9Sstevel@tonic-gate * Use is subject to license terms. 264cddff70SJosef 'Jeff' Sipek * Copyright 2012, Josef 'Jeff' Sipek <jeffpc@31bits.net>. All rights reserved. 2719d32b9aSRobert Mustacchi * Copyright (c) 2014, Joyent, Inc. All rights reserved. 287c478bd9Sstevel@tonic-gate */ 297c478bd9Sstevel@tonic-gate 30a77d64afScf46844 /* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */ 31a77d64afScf46844 /* All Rights Reserved */ 32a77d64afScf46844 337c478bd9Sstevel@tonic-gate /* 347c478bd9Sstevel@tonic-gate * convert and copy 357c478bd9Sstevel@tonic-gate */ 367c478bd9Sstevel@tonic-gate 377c478bd9Sstevel@tonic-gate #include <stdio.h> 387c478bd9Sstevel@tonic-gate #include <signal.h> 397c478bd9Sstevel@tonic-gate #include <fcntl.h> 407c478bd9Sstevel@tonic-gate #include <sys/param.h> 417c478bd9Sstevel@tonic-gate #include <sys/types.h> 427c478bd9Sstevel@tonic-gate #include <sys/sysmacros.h> 437c478bd9Sstevel@tonic-gate #include <sys/stat.h> 447c478bd9Sstevel@tonic-gate #include <unistd.h> 457c478bd9Sstevel@tonic-gate #include <stdlib.h> 467c478bd9Sstevel@tonic-gate #include <locale.h> 477c478bd9Sstevel@tonic-gate #include <string.h> 4819d32b9aSRobert Mustacchi #include <sys/time.h> 4919d32b9aSRobert Mustacchi #include <errno.h> 5019d32b9aSRobert Mustacchi #include <strings.h> 517c478bd9Sstevel@tonic-gate 527c478bd9Sstevel@tonic-gate /* The BIG parameter is machine dependent. It should be a long integer */ 537c478bd9Sstevel@tonic-gate /* constant that can be used by the number parser to check the validity */ 547c478bd9Sstevel@tonic-gate /* of numeric parameters. On 16-bit machines, it should probably be */ 557c478bd9Sstevel@tonic-gate /* the maximum unsigned integer, 0177777L. On 32-bit machines where */ 567c478bd9Sstevel@tonic-gate /* longs are the same size as ints, the maximum signed integer is more */ 577c478bd9Sstevel@tonic-gate /* appropriate. This value is 017777777777L. In 64 bit environments, */ 587c478bd9Sstevel@tonic-gate /* the maximum signed integer value is 0777777777777777777777LL */ 597c478bd9Sstevel@tonic-gate 607c478bd9Sstevel@tonic-gate #define BIG 0777777777777777777777LL 617c478bd9Sstevel@tonic-gate 627c478bd9Sstevel@tonic-gate #define BSIZE 512 637c478bd9Sstevel@tonic-gate 647c478bd9Sstevel@tonic-gate /* Option parameters */ 657c478bd9Sstevel@tonic-gate 667c478bd9Sstevel@tonic-gate #define COPY 0 /* file copy, preserve input block size */ 677c478bd9Sstevel@tonic-gate #define REBLOCK 1 /* file copy, change block size */ 687c478bd9Sstevel@tonic-gate #define LCREBLOCK 2 /* file copy, convert to lower case */ 697c478bd9Sstevel@tonic-gate #define UCREBLOCK 3 /* file copy, convert to upper case */ 707c478bd9Sstevel@tonic-gate #define NBASCII 4 /* file copy, convert from EBCDIC to ASCII */ 717c478bd9Sstevel@tonic-gate #define LCNBASCII 5 /* file copy, EBCDIC to lower case ASCII */ 727c478bd9Sstevel@tonic-gate #define UCNBASCII 6 /* file copy, EBCDIC to upper case ASCII */ 737c478bd9Sstevel@tonic-gate #define NBEBCDIC 7 /* file copy, convert from ASCII to EBCDIC */ 747c478bd9Sstevel@tonic-gate #define LCNBEBCDIC 8 /* file copy, ASCII to lower case EBCDIC */ 757c478bd9Sstevel@tonic-gate #define UCNBEBCDIC 9 /* file copy, ASCII to upper case EBCDIC */ 767c478bd9Sstevel@tonic-gate #define NBIBM 10 /* file copy, convert from ASCII to IBM */ 777c478bd9Sstevel@tonic-gate #define LCNBIBM 11 /* file copy, ASCII to lower case IBM */ 787c478bd9Sstevel@tonic-gate #define UCNBIBM 12 /* file copy, ASCII to upper case IBM */ 797c478bd9Sstevel@tonic-gate #define UNBLOCK 13 /* convert blocked ASCII to ASCII */ 807c478bd9Sstevel@tonic-gate #define LCUNBLOCK 14 /* convert blocked ASCII to lower case ASCII */ 817c478bd9Sstevel@tonic-gate #define UCUNBLOCK 15 /* convert blocked ASCII to upper case ASCII */ 827c478bd9Sstevel@tonic-gate #define ASCII 16 /* convert blocked EBCDIC to ASCII */ 837c478bd9Sstevel@tonic-gate #define LCASCII 17 /* convert blocked EBCDIC to lower case ASCII */ 847c478bd9Sstevel@tonic-gate #define UCASCII 18 /* convert blocked EBCDIC to upper case ASCII */ 857c478bd9Sstevel@tonic-gate #define BLOCK 19 /* convert ASCII to blocked ASCII */ 867c478bd9Sstevel@tonic-gate #define LCBLOCK 20 /* convert ASCII to lower case blocked ASCII */ 877c478bd9Sstevel@tonic-gate #define UCBLOCK 21 /* convert ASCII to upper case blocked ASCII */ 887c478bd9Sstevel@tonic-gate #define EBCDIC 22 /* convert ASCII to blocked EBCDIC */ 897c478bd9Sstevel@tonic-gate #define LCEBCDIC 23 /* convert ASCII to lower case blocked EBCDIC */ 907c478bd9Sstevel@tonic-gate #define UCEBCDIC 24 /* convert ASCII to upper case blocked EBCDIC */ 917c478bd9Sstevel@tonic-gate #define IBM 25 /* convert ASCII to blocked IBM */ 927c478bd9Sstevel@tonic-gate #define LCIBM 26 /* convert ASCII to lower case blocked IBM */ 937c478bd9Sstevel@tonic-gate #define UCIBM 27 /* convert ASCII to upper case blocked IBM */ 947c478bd9Sstevel@tonic-gate #define LCASE 01 /* flag - convert to lower case */ 957c478bd9Sstevel@tonic-gate #define UCASE 02 /* flag - convert to upper case */ 967c478bd9Sstevel@tonic-gate #define SWAB 04 /* flag - swap bytes before conversion */ 977c478bd9Sstevel@tonic-gate #define NERR 010 /* flag - proceed on input errors */ 987c478bd9Sstevel@tonic-gate #define SYNC 020 /* flag - pad short input blocks with nulls */ 997c478bd9Sstevel@tonic-gate #define BADLIMIT 5 /* give up if no progress after BADLIMIT trys */ 1007c478bd9Sstevel@tonic-gate #define SVR4XLATE 0 /* use default EBCDIC translation */ 1017c478bd9Sstevel@tonic-gate #define BSDXLATE 1 /* use BSD-compatible EBCDIC translation */ 1027c478bd9Sstevel@tonic-gate 1037c478bd9Sstevel@tonic-gate #define USAGE\ 1047c478bd9Sstevel@tonic-gate "usage: dd [if=file] [of=file] [ibs=n|nk|nb|nxm] [obs=n|nk|nb|nxm]\n"\ 1057c478bd9Sstevel@tonic-gate " [bs=n|nk|nb|nxm] [cbs=n|nk|nb|nxm] [files=n] [skip=n]\n"\ 1067c478bd9Sstevel@tonic-gate " [iseek=n] [oseek=n] [seek=n] [count=n] [conv=[ascii]\n"\ 1077c478bd9Sstevel@tonic-gate " [,ebcdic][,ibm][,asciib][,ebcdicb][,ibmb]\n"\ 1087c478bd9Sstevel@tonic-gate " [,block|unblock][,lcase|ucase][,swab]\n"\ 10919d32b9aSRobert Mustacchi " [,noerror][,notrunc][,sync]]\n"\ 11019d32b9aSRobert Mustacchi " [oflag=[dsync][sync]]\n" 1117c478bd9Sstevel@tonic-gate 1127c478bd9Sstevel@tonic-gate /* Global references */ 1137c478bd9Sstevel@tonic-gate 1147c478bd9Sstevel@tonic-gate /* Local routine declarations */ 1157c478bd9Sstevel@tonic-gate 1167c478bd9Sstevel@tonic-gate static int match(char *); 1177c478bd9Sstevel@tonic-gate static void term(); 1187c478bd9Sstevel@tonic-gate static unsigned long long number(); 1197c478bd9Sstevel@tonic-gate static unsigned char *flsh(); 1207c478bd9Sstevel@tonic-gate static void stats(); 1217c478bd9Sstevel@tonic-gate 1227c478bd9Sstevel@tonic-gate /* Local data definitions */ 1237c478bd9Sstevel@tonic-gate 1247c478bd9Sstevel@tonic-gate static unsigned ibs; /* input buffer size */ 1257c478bd9Sstevel@tonic-gate static unsigned obs; /* output buffer size */ 1267c478bd9Sstevel@tonic-gate static unsigned bs; /* buffer size, overrules ibs and obs */ 1277c478bd9Sstevel@tonic-gate static unsigned cbs; /* conversion buffer size, used for block conversions */ 1287c478bd9Sstevel@tonic-gate static unsigned ibc; /* number of bytes still in the input buffer */ 1297c478bd9Sstevel@tonic-gate static unsigned obc; /* number of bytes in the output buffer */ 1307c478bd9Sstevel@tonic-gate static unsigned cbc; /* number of bytes in the conversion buffer */ 1317c478bd9Sstevel@tonic-gate 1327c478bd9Sstevel@tonic-gate static int ibf; /* input file descriptor */ 1337c478bd9Sstevel@tonic-gate static int obf; /* output file descriptor */ 1347c478bd9Sstevel@tonic-gate static int cflag; /* conversion option flags */ 13519d32b9aSRobert Mustacchi static int oflag; /* output flag options */ 1367c478bd9Sstevel@tonic-gate static int skipf; /* if skipf == 1, skip rest of input line */ 1377c478bd9Sstevel@tonic-gate static unsigned long long nifr; /* count of full input records */ 1387c478bd9Sstevel@tonic-gate static unsigned long long nipr; /* count of partial input records */ 1397c478bd9Sstevel@tonic-gate static unsigned long long nofr; /* count of full output records */ 1407c478bd9Sstevel@tonic-gate static unsigned long long nopr; /* count of partial output records */ 1417c478bd9Sstevel@tonic-gate static unsigned long long ntrunc; /* count of truncated input lines */ 1427c478bd9Sstevel@tonic-gate static unsigned long long nbad; /* count of bad records since last */ 1437c478bd9Sstevel@tonic-gate /* good one */ 1447c478bd9Sstevel@tonic-gate static int files; /* number of input files to concatenate (tape only) */ 1457c478bd9Sstevel@tonic-gate static off_t skip; /* number of input records to skip */ 1467c478bd9Sstevel@tonic-gate static off_t iseekn; /* number of input records to seek past */ 1477c478bd9Sstevel@tonic-gate static off_t oseekn; /* number of output records to seek past */ 1487c478bd9Sstevel@tonic-gate static unsigned long long count; /* number of input records to copy */ 1497c478bd9Sstevel@tonic-gate /* (0 = all) */ 150*e3bee069SRobert Mustacchi static boolean_t ecount; /* explicit count given */ 1517c478bd9Sstevel@tonic-gate static int trantype; /* BSD or SVr4 compatible EBCDIC */ 1527c478bd9Sstevel@tonic-gate 1537c478bd9Sstevel@tonic-gate static char *string; /* command arg pointer */ 1547c478bd9Sstevel@tonic-gate static char *ifile; /* input file name pointer */ 1557c478bd9Sstevel@tonic-gate static char *ofile; /* output file name pointer */ 1567c478bd9Sstevel@tonic-gate static unsigned char *ibuf; /* input buffer pointer */ 1577c478bd9Sstevel@tonic-gate static unsigned char *obuf; /* output buffer pointer */ 1587c478bd9Sstevel@tonic-gate 15919d32b9aSRobert Mustacchi static hrtime_t startt; /* hrtime copy started */ 16019d32b9aSRobert Mustacchi static unsigned long long obytes; /* output bytes */ 16119d32b9aSRobert Mustacchi static sig_atomic_t nstats; /* do we need to output stats */ 16219d32b9aSRobert Mustacchi 1637c478bd9Sstevel@tonic-gate /* This is an EBCDIC to ASCII conversion table */ 1647c478bd9Sstevel@tonic-gate /* from a proposed BTL standard April 16, 1979 */ 1657c478bd9Sstevel@tonic-gate 1667c478bd9Sstevel@tonic-gate static unsigned char svr4_etoa [] = 1677c478bd9Sstevel@tonic-gate { 1687c478bd9Sstevel@tonic-gate 0000, 0001, 0002, 0003, 0234, 0011, 0206, 0177, 1697c478bd9Sstevel@tonic-gate 0227, 0215, 0216, 0013, 0014, 0015, 0016, 0017, 1707c478bd9Sstevel@tonic-gate 0020, 0021, 0022, 0023, 0235, 0205, 0010, 0207, 1717c478bd9Sstevel@tonic-gate 0030, 0031, 0222, 0217, 0034, 0035, 0036, 0037, 1727c478bd9Sstevel@tonic-gate 0200, 0201, 0202, 0203, 0204, 0012, 0027, 0033, 1737c478bd9Sstevel@tonic-gate 0210, 0211, 0212, 0213, 0214, 0005, 0006, 0007, 1747c478bd9Sstevel@tonic-gate 0220, 0221, 0026, 0223, 0224, 0225, 0226, 0004, 1757c478bd9Sstevel@tonic-gate 0230, 0231, 0232, 0233, 0024, 0025, 0236, 0032, 1767c478bd9Sstevel@tonic-gate 0040, 0240, 0241, 0242, 0243, 0244, 0245, 0246, 1777c478bd9Sstevel@tonic-gate 0247, 0250, 0325, 0056, 0074, 0050, 0053, 0174, 1787c478bd9Sstevel@tonic-gate 0046, 0251, 0252, 0253, 0254, 0255, 0256, 0257, 1797c478bd9Sstevel@tonic-gate 0260, 0261, 0041, 0044, 0052, 0051, 0073, 0176, 1807c478bd9Sstevel@tonic-gate 0055, 0057, 0262, 0263, 0264, 0265, 0266, 0267, 1817c478bd9Sstevel@tonic-gate 0270, 0271, 0313, 0054, 0045, 0137, 0076, 0077, 1827c478bd9Sstevel@tonic-gate 0272, 0273, 0274, 0275, 0276, 0277, 0300, 0301, 1837c478bd9Sstevel@tonic-gate 0302, 0140, 0072, 0043, 0100, 0047, 0075, 0042, 1847c478bd9Sstevel@tonic-gate 0303, 0141, 0142, 0143, 0144, 0145, 0146, 0147, 1857c478bd9Sstevel@tonic-gate 0150, 0151, 0304, 0305, 0306, 0307, 0310, 0311, 1867c478bd9Sstevel@tonic-gate 0312, 0152, 0153, 0154, 0155, 0156, 0157, 0160, 1877c478bd9Sstevel@tonic-gate 0161, 0162, 0136, 0314, 0315, 0316, 0317, 0320, 1887c478bd9Sstevel@tonic-gate 0321, 0345, 0163, 0164, 0165, 0166, 0167, 0170, 1897c478bd9Sstevel@tonic-gate 0171, 0172, 0322, 0323, 0324, 0133, 0326, 0327, 1907c478bd9Sstevel@tonic-gate 0330, 0331, 0332, 0333, 0334, 0335, 0336, 0337, 1917c478bd9Sstevel@tonic-gate 0340, 0341, 0342, 0343, 0344, 0135, 0346, 0347, 1927c478bd9Sstevel@tonic-gate 0173, 0101, 0102, 0103, 0104, 0105, 0106, 0107, 1937c478bd9Sstevel@tonic-gate 0110, 0111, 0350, 0351, 0352, 0353, 0354, 0355, 1947c478bd9Sstevel@tonic-gate 0175, 0112, 0113, 0114, 0115, 0116, 0117, 0120, 1957c478bd9Sstevel@tonic-gate 0121, 0122, 0356, 0357, 0360, 0361, 0362, 0363, 1967c478bd9Sstevel@tonic-gate 0134, 0237, 0123, 0124, 0125, 0126, 0127, 0130, 1977c478bd9Sstevel@tonic-gate 0131, 0132, 0364, 0365, 0366, 0367, 0370, 0371, 1987c478bd9Sstevel@tonic-gate 0060, 0061, 0062, 0063, 0064, 0065, 0066, 0067, 1997c478bd9Sstevel@tonic-gate 0070, 0071, 0372, 0373, 0374, 0375, 0376, 0377, 2007c478bd9Sstevel@tonic-gate }; 2017c478bd9Sstevel@tonic-gate 2027c478bd9Sstevel@tonic-gate /* This is an ASCII to EBCDIC conversion table */ 2037c478bd9Sstevel@tonic-gate /* from a proposed BTL standard April 16, 1979 */ 2047c478bd9Sstevel@tonic-gate 2057c478bd9Sstevel@tonic-gate static unsigned char svr4_atoe [] = 2067c478bd9Sstevel@tonic-gate { 2077c478bd9Sstevel@tonic-gate 0000, 0001, 0002, 0003, 0067, 0055, 0056, 0057, 2087c478bd9Sstevel@tonic-gate 0026, 0005, 0045, 0013, 0014, 0015, 0016, 0017, 2097c478bd9Sstevel@tonic-gate 0020, 0021, 0022, 0023, 0074, 0075, 0062, 0046, 2107c478bd9Sstevel@tonic-gate 0030, 0031, 0077, 0047, 0034, 0035, 0036, 0037, 2117c478bd9Sstevel@tonic-gate 0100, 0132, 0177, 0173, 0133, 0154, 0120, 0175, 2127c478bd9Sstevel@tonic-gate 0115, 0135, 0134, 0116, 0153, 0140, 0113, 0141, 2137c478bd9Sstevel@tonic-gate 0360, 0361, 0362, 0363, 0364, 0365, 0366, 0367, 2147c478bd9Sstevel@tonic-gate 0370, 0371, 0172, 0136, 0114, 0176, 0156, 0157, 2157c478bd9Sstevel@tonic-gate 0174, 0301, 0302, 0303, 0304, 0305, 0306, 0307, 2167c478bd9Sstevel@tonic-gate 0310, 0311, 0321, 0322, 0323, 0324, 0325, 0326, 2177c478bd9Sstevel@tonic-gate 0327, 0330, 0331, 0342, 0343, 0344, 0345, 0346, 2187c478bd9Sstevel@tonic-gate 0347, 0350, 0351, 0255, 0340, 0275, 0232, 0155, 2197c478bd9Sstevel@tonic-gate 0171, 0201, 0202, 0203, 0204, 0205, 0206, 0207, 2207c478bd9Sstevel@tonic-gate 0210, 0211, 0221, 0222, 0223, 0224, 0225, 0226, 2217c478bd9Sstevel@tonic-gate 0227, 0230, 0231, 0242, 0243, 0244, 0245, 0246, 2227c478bd9Sstevel@tonic-gate 0247, 0250, 0251, 0300, 0117, 0320, 0137, 0007, 2237c478bd9Sstevel@tonic-gate 0040, 0041, 0042, 0043, 0044, 0025, 0006, 0027, 2247c478bd9Sstevel@tonic-gate 0050, 0051, 0052, 0053, 0054, 0011, 0012, 0033, 2257c478bd9Sstevel@tonic-gate 0060, 0061, 0032, 0063, 0064, 0065, 0066, 0010, 2267c478bd9Sstevel@tonic-gate 0070, 0071, 0072, 0073, 0004, 0024, 0076, 0341, 2277c478bd9Sstevel@tonic-gate 0101, 0102, 0103, 0104, 0105, 0106, 0107, 0110, 2287c478bd9Sstevel@tonic-gate 0111, 0121, 0122, 0123, 0124, 0125, 0126, 0127, 2297c478bd9Sstevel@tonic-gate 0130, 0131, 0142, 0143, 0144, 0145, 0146, 0147, 2307c478bd9Sstevel@tonic-gate 0150, 0151, 0160, 0161, 0162, 0163, 0164, 0165, 2317c478bd9Sstevel@tonic-gate 0166, 0167, 0170, 0200, 0212, 0213, 0214, 0215, 2327c478bd9Sstevel@tonic-gate 0216, 0217, 0220, 0152, 0233, 0234, 0235, 0236, 2337c478bd9Sstevel@tonic-gate 0237, 0240, 0252, 0253, 0254, 0112, 0256, 0257, 2347c478bd9Sstevel@tonic-gate 0260, 0261, 0262, 0263, 0264, 0265, 0266, 0267, 2357c478bd9Sstevel@tonic-gate 0270, 0271, 0272, 0273, 0274, 0241, 0276, 0277, 2367c478bd9Sstevel@tonic-gate 0312, 0313, 0314, 0315, 0316, 0317, 0332, 0333, 2377c478bd9Sstevel@tonic-gate 0334, 0335, 0336, 0337, 0352, 0353, 0354, 0355, 2387c478bd9Sstevel@tonic-gate 0356, 0357, 0372, 0373, 0374, 0375, 0376, 0377, 2397c478bd9Sstevel@tonic-gate }; 2407c478bd9Sstevel@tonic-gate 2417c478bd9Sstevel@tonic-gate /* Table for ASCII to IBM (alternate EBCDIC) code conversion */ 2427c478bd9Sstevel@tonic-gate 2437c478bd9Sstevel@tonic-gate static unsigned char svr4_atoibm[] = 2447c478bd9Sstevel@tonic-gate { 2457c478bd9Sstevel@tonic-gate 0000, 0001, 0002, 0003, 0067, 0055, 0056, 0057, 2467c478bd9Sstevel@tonic-gate 0026, 0005, 0045, 0013, 0014, 0015, 0016, 0017, 2477c478bd9Sstevel@tonic-gate 0020, 0021, 0022, 0023, 0074, 0075, 0062, 0046, 2487c478bd9Sstevel@tonic-gate 0030, 0031, 0077, 0047, 0034, 0035, 0036, 0037, 2497c478bd9Sstevel@tonic-gate 0100, 0132, 0177, 0173, 0133, 0154, 0120, 0175, 2507c478bd9Sstevel@tonic-gate 0115, 0135, 0134, 0116, 0153, 0140, 0113, 0141, 2517c478bd9Sstevel@tonic-gate 0360, 0361, 0362, 0363, 0364, 0365, 0366, 0367, 2527c478bd9Sstevel@tonic-gate 0370, 0371, 0172, 0136, 0114, 0176, 0156, 0157, 2537c478bd9Sstevel@tonic-gate 0174, 0301, 0302, 0303, 0304, 0305, 0306, 0307, 2547c478bd9Sstevel@tonic-gate 0310, 0311, 0321, 0322, 0323, 0324, 0325, 0326, 2557c478bd9Sstevel@tonic-gate 0327, 0330, 0331, 0342, 0343, 0344, 0345, 0346, 2567c478bd9Sstevel@tonic-gate 0347, 0350, 0351, 0255, 0340, 0275, 0137, 0155, 2577c478bd9Sstevel@tonic-gate 0171, 0201, 0202, 0203, 0204, 0205, 0206, 0207, 2587c478bd9Sstevel@tonic-gate 0210, 0211, 0221, 0222, 0223, 0224, 0225, 0226, 2597c478bd9Sstevel@tonic-gate 0227, 0230, 0231, 0242, 0243, 0244, 0245, 0246, 2607c478bd9Sstevel@tonic-gate 0247, 0250, 0251, 0300, 0117, 0320, 0241, 0007, 2617c478bd9Sstevel@tonic-gate 0040, 0041, 0042, 0043, 0044, 0025, 0006, 0027, 2627c478bd9Sstevel@tonic-gate 0050, 0051, 0052, 0053, 0054, 0011, 0012, 0033, 2637c478bd9Sstevel@tonic-gate 0060, 0061, 0032, 0063, 0064, 0065, 0066, 0010, 2647c478bd9Sstevel@tonic-gate 0070, 0071, 0072, 0073, 0004, 0024, 0076, 0341, 2657c478bd9Sstevel@tonic-gate 0101, 0102, 0103, 0104, 0105, 0106, 0107, 0110, 2667c478bd9Sstevel@tonic-gate 0111, 0121, 0122, 0123, 0124, 0125, 0126, 0127, 2677c478bd9Sstevel@tonic-gate 0130, 0131, 0142, 0143, 0144, 0145, 0146, 0147, 2687c478bd9Sstevel@tonic-gate 0150, 0151, 0160, 0161, 0162, 0163, 0164, 0165, 2697c478bd9Sstevel@tonic-gate 0166, 0167, 0170, 0200, 0212, 0213, 0214, 0215, 2707c478bd9Sstevel@tonic-gate 0216, 0217, 0220, 0232, 0233, 0234, 0235, 0236, 2717c478bd9Sstevel@tonic-gate 0237, 0240, 0252, 0253, 0254, 0255, 0256, 0257, 2727c478bd9Sstevel@tonic-gate 0260, 0261, 0262, 0263, 0264, 0265, 0266, 0267, 2737c478bd9Sstevel@tonic-gate 0270, 0271, 0272, 0273, 0274, 0275, 0276, 0277, 2747c478bd9Sstevel@tonic-gate 0312, 0313, 0314, 0315, 0316, 0317, 0332, 0333, 2757c478bd9Sstevel@tonic-gate 0334, 0335, 0336, 0337, 0352, 0353, 0354, 0355, 2767c478bd9Sstevel@tonic-gate 0356, 0357, 0372, 0373, 0374, 0375, 0376, 0377, 2777c478bd9Sstevel@tonic-gate }; 2787c478bd9Sstevel@tonic-gate 2797c478bd9Sstevel@tonic-gate /* Table for conversion of ASCII to lower case ASCII */ 2807c478bd9Sstevel@tonic-gate 2817c478bd9Sstevel@tonic-gate static unsigned char utol[] = 2827c478bd9Sstevel@tonic-gate { 2837c478bd9Sstevel@tonic-gate 0000, 0001, 0002, 0003, 0004, 0005, 0006, 0007, 2847c478bd9Sstevel@tonic-gate 0010, 0011, 0012, 0013, 0014, 0015, 0016, 0017, 2857c478bd9Sstevel@tonic-gate 0020, 0021, 0022, 0023, 0024, 0025, 0026, 0027, 2867c478bd9Sstevel@tonic-gate 0030, 0031, 0032, 0033, 0034, 0035, 0036, 0037, 2877c478bd9Sstevel@tonic-gate 0040, 0041, 0042, 0043, 0044, 0045, 0046, 0047, 2887c478bd9Sstevel@tonic-gate 0050, 0051, 0052, 0053, 0054, 0055, 0056, 0057, 2897c478bd9Sstevel@tonic-gate 0060, 0061, 0062, 0063, 0064, 0065, 0066, 0067, 2907c478bd9Sstevel@tonic-gate 0070, 0071, 0072, 0073, 0074, 0075, 0076, 0077, 2917c478bd9Sstevel@tonic-gate 0100, 0141, 0142, 0143, 0144, 0145, 0146, 0147, 2927c478bd9Sstevel@tonic-gate 0150, 0151, 0152, 0153, 0154, 0155, 0156, 0157, 2937c478bd9Sstevel@tonic-gate 0160, 0161, 0162, 0163, 0164, 0165, 0166, 0167, 2947c478bd9Sstevel@tonic-gate 0170, 0171, 0172, 0133, 0134, 0135, 0136, 0137, 2957c478bd9Sstevel@tonic-gate 0140, 0141, 0142, 0143, 0144, 0145, 0146, 0147, 2967c478bd9Sstevel@tonic-gate 0150, 0151, 0152, 0153, 0154, 0155, 0156, 0157, 2977c478bd9Sstevel@tonic-gate 0160, 0161, 0162, 0163, 0164, 0165, 0166, 0167, 2987c478bd9Sstevel@tonic-gate 0170, 0171, 0172, 0173, 0174, 0175, 0176, 0177, 2997c478bd9Sstevel@tonic-gate 0200, 0201, 0202, 0203, 0204, 0205, 0206, 0207, 3007c478bd9Sstevel@tonic-gate 0210, 0211, 0212, 0213, 0214, 0215, 0216, 0217, 3017c478bd9Sstevel@tonic-gate 0220, 0221, 0222, 0223, 0224, 0225, 0226, 0227, 3027c478bd9Sstevel@tonic-gate 0230, 0231, 0232, 0233, 0234, 0235, 0236, 0237, 3037c478bd9Sstevel@tonic-gate 0240, 0241, 0242, 0243, 0244, 0245, 0246, 0247, 3047c478bd9Sstevel@tonic-gate 0250, 0251, 0252, 0253, 0254, 0255, 0256, 0257, 3057c478bd9Sstevel@tonic-gate 0260, 0261, 0262, 0263, 0264, 0265, 0266, 0267, 3067c478bd9Sstevel@tonic-gate 0270, 0271, 0272, 0273, 0274, 0275, 0276, 0277, 3077c478bd9Sstevel@tonic-gate 0300, 0301, 0302, 0303, 0304, 0305, 0306, 0307, 3087c478bd9Sstevel@tonic-gate 0310, 0311, 0312, 0313, 0314, 0315, 0316, 0317, 3097c478bd9Sstevel@tonic-gate 0320, 0321, 0322, 0323, 0324, 0325, 0326, 0327, 3107c478bd9Sstevel@tonic-gate 0330, 0331, 0332, 0333, 0334, 0335, 0336, 0337, 3117c478bd9Sstevel@tonic-gate 0340, 0341, 0342, 0343, 0344, 0345, 0346, 0347, 3127c478bd9Sstevel@tonic-gate 0350, 0351, 0352, 0353, 0354, 0355, 0356, 0357, 3137c478bd9Sstevel@tonic-gate 0360, 0361, 0362, 0363, 0364, 0365, 0366, 0367, 3147c478bd9Sstevel@tonic-gate 0370, 0371, 0372, 0373, 0374, 0375, 0376, 0377, 3157c478bd9Sstevel@tonic-gate }; 3167c478bd9Sstevel@tonic-gate 3177c478bd9Sstevel@tonic-gate /* Table for conversion of ASCII to upper case ASCII */ 3187c478bd9Sstevel@tonic-gate 3197c478bd9Sstevel@tonic-gate static unsigned char ltou[] = 3207c478bd9Sstevel@tonic-gate { 3217c478bd9Sstevel@tonic-gate 0000, 0001, 0002, 0003, 0004, 0005, 0006, 0007, 3227c478bd9Sstevel@tonic-gate 0010, 0011, 0012, 0013, 0014, 0015, 0016, 0017, 3237c478bd9Sstevel@tonic-gate 0020, 0021, 0022, 0023, 0024, 0025, 0026, 0027, 3247c478bd9Sstevel@tonic-gate 0030, 0031, 0032, 0033, 0034, 0035, 0036, 0037, 3257c478bd9Sstevel@tonic-gate 0040, 0041, 0042, 0043, 0044, 0045, 0046, 0047, 3267c478bd9Sstevel@tonic-gate 0050, 0051, 0052, 0053, 0054, 0055, 0056, 0057, 3277c478bd9Sstevel@tonic-gate 0060, 0061, 0062, 0063, 0064, 0065, 0066, 0067, 3287c478bd9Sstevel@tonic-gate 0070, 0071, 0072, 0073, 0074, 0075, 0076, 0077, 3297c478bd9Sstevel@tonic-gate 0100, 0101, 0102, 0103, 0104, 0105, 0106, 0107, 3307c478bd9Sstevel@tonic-gate 0110, 0111, 0112, 0113, 0114, 0115, 0116, 0117, 3317c478bd9Sstevel@tonic-gate 0120, 0121, 0122, 0123, 0124, 0125, 0126, 0127, 3327c478bd9Sstevel@tonic-gate 0130, 0131, 0132, 0133, 0134, 0135, 0136, 0137, 3337c478bd9Sstevel@tonic-gate 0140, 0101, 0102, 0103, 0104, 0105, 0106, 0107, 3347c478bd9Sstevel@tonic-gate 0110, 0111, 0112, 0113, 0114, 0115, 0116, 0117, 3357c478bd9Sstevel@tonic-gate 0120, 0121, 0122, 0123, 0124, 0125, 0126, 0127, 3367c478bd9Sstevel@tonic-gate 0130, 0131, 0132, 0173, 0174, 0175, 0176, 0177, 3377c478bd9Sstevel@tonic-gate 0200, 0201, 0202, 0203, 0204, 0205, 0206, 0207, 3387c478bd9Sstevel@tonic-gate 0210, 0211, 0212, 0213, 0214, 0215, 0216, 0217, 3397c478bd9Sstevel@tonic-gate 0220, 0221, 0222, 0223, 0224, 0225, 0226, 0227, 3407c478bd9Sstevel@tonic-gate 0230, 0231, 0232, 0233, 0234, 0235, 0236, 0237, 3417c478bd9Sstevel@tonic-gate 0240, 0241, 0242, 0243, 0244, 0245, 0246, 0247, 3427c478bd9Sstevel@tonic-gate 0250, 0251, 0252, 0253, 0254, 0255, 0256, 0257, 3437c478bd9Sstevel@tonic-gate 0260, 0261, 0262, 0263, 0264, 0265, 0266, 0267, 3447c478bd9Sstevel@tonic-gate 0270, 0271, 0272, 0273, 0274, 0275, 0276, 0277, 3457c478bd9Sstevel@tonic-gate 0300, 0301, 0302, 0303, 0304, 0305, 0306, 0307, 3467c478bd9Sstevel@tonic-gate 0310, 0311, 0312, 0313, 0314, 0315, 0316, 0317, 3477c478bd9Sstevel@tonic-gate 0320, 0321, 0322, 0323, 0324, 0325, 0326, 0327, 3487c478bd9Sstevel@tonic-gate 0330, 0331, 0332, 0333, 0334, 0335, 0336, 0337, 3497c478bd9Sstevel@tonic-gate 0340, 0341, 0342, 0343, 0344, 0345, 0346, 0347, 3507c478bd9Sstevel@tonic-gate 0350, 0351, 0352, 0353, 0354, 0355, 0356, 0357, 3517c478bd9Sstevel@tonic-gate 0360, 0361, 0362, 0363, 0364, 0365, 0366, 0367, 3527c478bd9Sstevel@tonic-gate 0370, 0371, 0372, 0373, 0374, 0375, 0376, 0377, 3537c478bd9Sstevel@tonic-gate }; 3547c478bd9Sstevel@tonic-gate 3557c478bd9Sstevel@tonic-gate /* BSD-compatible EBCDIC to ASCII translate table */ 3567c478bd9Sstevel@tonic-gate 3577c478bd9Sstevel@tonic-gate static unsigned char bsd_etoa[] = 3587c478bd9Sstevel@tonic-gate { 3597c478bd9Sstevel@tonic-gate 0000, 0001, 0002, 0003, 0234, 0011, 0206, 0177, 3607c478bd9Sstevel@tonic-gate 0227, 0215, 0216, 0013, 0014, 0015, 0016, 0017, 3617c478bd9Sstevel@tonic-gate 0020, 0021, 0022, 0023, 0235, 0205, 0010, 0207, 3627c478bd9Sstevel@tonic-gate 0030, 0031, 0222, 0217, 0034, 0035, 0036, 0037, 3637c478bd9Sstevel@tonic-gate 0200, 0201, 0202, 0203, 0204, 0012, 0027, 0033, 3647c478bd9Sstevel@tonic-gate 0210, 0211, 0212, 0213, 0214, 0005, 0006, 0007, 3657c478bd9Sstevel@tonic-gate 0220, 0221, 0026, 0223, 0224, 0225, 0226, 0004, 3667c478bd9Sstevel@tonic-gate 0230, 0231, 0232, 0233, 0024, 0025, 0236, 0032, 3677c478bd9Sstevel@tonic-gate 0040, 0240, 0241, 0242, 0243, 0244, 0245, 0246, 3687c478bd9Sstevel@tonic-gate 0247, 0250, 0133, 0056, 0074, 0050, 0053, 0041, 3697c478bd9Sstevel@tonic-gate 0046, 0251, 0252, 0253, 0254, 0255, 0256, 0257, 3707c478bd9Sstevel@tonic-gate 0260, 0261, 0135, 0044, 0052, 0051, 0073, 0136, 3717c478bd9Sstevel@tonic-gate 0055, 0057, 0262, 0263, 0264, 0265, 0266, 0267, 3727c478bd9Sstevel@tonic-gate 0270, 0271, 0174, 0054, 0045, 0137, 0076, 0077, 3737c478bd9Sstevel@tonic-gate 0272, 0273, 0274, 0275, 0276, 0277, 0300, 0301, 3747c478bd9Sstevel@tonic-gate 0302, 0140, 0072, 0043, 0100, 0047, 0075, 0042, 3757c478bd9Sstevel@tonic-gate 0303, 0141, 0142, 0143, 0144, 0145, 0146, 0147, 3767c478bd9Sstevel@tonic-gate 0150, 0151, 0304, 0305, 0306, 0307, 0310, 0311, 3777c478bd9Sstevel@tonic-gate 0312, 0152, 0153, 0154, 0155, 0156, 0157, 0160, 3787c478bd9Sstevel@tonic-gate 0161, 0162, 0313, 0314, 0315, 0316, 0317, 0320, 3797c478bd9Sstevel@tonic-gate 0321, 0176, 0163, 0164, 0165, 0166, 0167, 0170, 3807c478bd9Sstevel@tonic-gate 0171, 0172, 0322, 0323, 0324, 0325, 0326, 0327, 3817c478bd9Sstevel@tonic-gate 0330, 0331, 0332, 0333, 0334, 0335, 0336, 0337, 3827c478bd9Sstevel@tonic-gate 0340, 0341, 0342, 0343, 0344, 0345, 0346, 0347, 3837c478bd9Sstevel@tonic-gate 0173, 0101, 0102, 0103, 0104, 0105, 0106, 0107, 3847c478bd9Sstevel@tonic-gate 0110, 0111, 0350, 0351, 0352, 0353, 0354, 0355, 3857c478bd9Sstevel@tonic-gate 0175, 0112, 0113, 0114, 0115, 0116, 0117, 0120, 3867c478bd9Sstevel@tonic-gate 0121, 0122, 0356, 0357, 0360, 0361, 0362, 0363, 3877c478bd9Sstevel@tonic-gate 0134, 0237, 0123, 0124, 0125, 0126, 0127, 0130, 3887c478bd9Sstevel@tonic-gate 0131, 0132, 0364, 0365, 0366, 0367, 0370, 0371, 3897c478bd9Sstevel@tonic-gate 0060, 0061, 0062, 0063, 0064, 0065, 0066, 0067, 3907c478bd9Sstevel@tonic-gate 0070, 0071, 0372, 0373, 0374, 0375, 0376, 0377, 3917c478bd9Sstevel@tonic-gate }; 3927c478bd9Sstevel@tonic-gate 3937c478bd9Sstevel@tonic-gate /* BSD-compatible ASCII to EBCDIC translate table */ 3947c478bd9Sstevel@tonic-gate 3957c478bd9Sstevel@tonic-gate static unsigned char bsd_atoe[] = 3967c478bd9Sstevel@tonic-gate { 3977c478bd9Sstevel@tonic-gate 0000, 0001, 0002, 0003, 0067, 0055, 0056, 0057, 3987c478bd9Sstevel@tonic-gate 0026, 0005, 0045, 0013, 0014, 0015, 0016, 0017, 3997c478bd9Sstevel@tonic-gate 0020, 0021, 0022, 0023, 0074, 0075, 0062, 0046, 4007c478bd9Sstevel@tonic-gate 0030, 0031, 0077, 0047, 0034, 0035, 0036, 0037, 4017c478bd9Sstevel@tonic-gate 0100, 0117, 0177, 0173, 0133, 0154, 0120, 0175, 4027c478bd9Sstevel@tonic-gate 0115, 0135, 0134, 0116, 0153, 0140, 0113, 0141, 4037c478bd9Sstevel@tonic-gate 0360, 0361, 0362, 0363, 0364, 0365, 0366, 0367, 4047c478bd9Sstevel@tonic-gate 0370, 0371, 0172, 0136, 0114, 0176, 0156, 0157, 4057c478bd9Sstevel@tonic-gate 0174, 0301, 0302, 0303, 0304, 0305, 0306, 0307, 4067c478bd9Sstevel@tonic-gate 0310, 0311, 0321, 0322, 0323, 0324, 0325, 0326, 4077c478bd9Sstevel@tonic-gate 0327, 0330, 0331, 0342, 0343, 0344, 0345, 0346, 4087c478bd9Sstevel@tonic-gate 0347, 0350, 0351, 0112, 0340, 0132, 0137, 0155, 4097c478bd9Sstevel@tonic-gate 0171, 0201, 0202, 0203, 0204, 0205, 0206, 0207, 4107c478bd9Sstevel@tonic-gate 0210, 0211, 0221, 0222, 0223, 0224, 0225, 0226, 4117c478bd9Sstevel@tonic-gate 0227, 0230, 0231, 0242, 0243, 0244, 0245, 0246, 4127c478bd9Sstevel@tonic-gate 0247, 0250, 0251, 0300, 0152, 0320, 0241, 0007, 4137c478bd9Sstevel@tonic-gate 0040, 0041, 0042, 0043, 0044, 0025, 0006, 0027, 4147c478bd9Sstevel@tonic-gate 0050, 0051, 0052, 0053, 0054, 0011, 0012, 0033, 4157c478bd9Sstevel@tonic-gate 0060, 0061, 0032, 0063, 0064, 0065, 0066, 0010, 4167c478bd9Sstevel@tonic-gate 0070, 0071, 0072, 0073, 0004, 0024, 0076, 0341, 4177c478bd9Sstevel@tonic-gate 0101, 0102, 0103, 0104, 0105, 0106, 0107, 0110, 4187c478bd9Sstevel@tonic-gate 0111, 0121, 0122, 0123, 0124, 0125, 0126, 0127, 4197c478bd9Sstevel@tonic-gate 0130, 0131, 0142, 0143, 0144, 0145, 0146, 0147, 4207c478bd9Sstevel@tonic-gate 0150, 0151, 0160, 0161, 0162, 0163, 0164, 0165, 4217c478bd9Sstevel@tonic-gate 0166, 0167, 0170, 0200, 0212, 0213, 0214, 0215, 4227c478bd9Sstevel@tonic-gate 0216, 0217, 0220, 0232, 0233, 0234, 0235, 0236, 4237c478bd9Sstevel@tonic-gate 0237, 0240, 0252, 0253, 0254, 0255, 0256, 0257, 4247c478bd9Sstevel@tonic-gate 0260, 0261, 0262, 0263, 0264, 0265, 0266, 0267, 4257c478bd9Sstevel@tonic-gate 0270, 0271, 0272, 0273, 0274, 0275, 0276, 0277, 4267c478bd9Sstevel@tonic-gate 0312, 0313, 0314, 0315, 0316, 0317, 0332, 0333, 4277c478bd9Sstevel@tonic-gate 0334, 0335, 0336, 0337, 0352, 0353, 0354, 0355, 4287c478bd9Sstevel@tonic-gate 0356, 0357, 0372, 0373, 0374, 0375, 0376, 0377, 4297c478bd9Sstevel@tonic-gate }; 4307c478bd9Sstevel@tonic-gate 4317c478bd9Sstevel@tonic-gate /* BSD-compatible ASCII to IBM translate table */ 4327c478bd9Sstevel@tonic-gate 4337c478bd9Sstevel@tonic-gate static unsigned char bsd_atoibm[] = 4347c478bd9Sstevel@tonic-gate { 4357c478bd9Sstevel@tonic-gate 0000, 0001, 0002, 0003, 0067, 0055, 0056, 0057, 4367c478bd9Sstevel@tonic-gate 0026, 0005, 0045, 0013, 0014, 0015, 0016, 0017, 4377c478bd9Sstevel@tonic-gate 0020, 0021, 0022, 0023, 0074, 0075, 0062, 0046, 4387c478bd9Sstevel@tonic-gate 0030, 0031, 0077, 0047, 0034, 0035, 0036, 0037, 4397c478bd9Sstevel@tonic-gate 0100, 0132, 0177, 0173, 0133, 0154, 0120, 0175, 4407c478bd9Sstevel@tonic-gate 0115, 0135, 0134, 0116, 0153, 0140, 0113, 0141, 4417c478bd9Sstevel@tonic-gate 0360, 0361, 0362, 0363, 0364, 0365, 0366, 0367, 4427c478bd9Sstevel@tonic-gate 0370, 0371, 0172, 0136, 0114, 0176, 0156, 0157, 4437c478bd9Sstevel@tonic-gate 0174, 0301, 0302, 0303, 0304, 0305, 0306, 0307, 4447c478bd9Sstevel@tonic-gate 0310, 0311, 0321, 0322, 0323, 0324, 0325, 0326, 4457c478bd9Sstevel@tonic-gate 0327, 0330, 0331, 0342, 0343, 0344, 0345, 0346, 4467c478bd9Sstevel@tonic-gate 0347, 0350, 0351, 0255, 0340, 0275, 0137, 0155, 4477c478bd9Sstevel@tonic-gate 0171, 0201, 0202, 0203, 0204, 0205, 0206, 0207, 4487c478bd9Sstevel@tonic-gate 0210, 0211, 0221, 0222, 0223, 0224, 0225, 0226, 4497c478bd9Sstevel@tonic-gate 0227, 0230, 0231, 0242, 0243, 0244, 0245, 0246, 4507c478bd9Sstevel@tonic-gate 0247, 0250, 0251, 0300, 0117, 0320, 0241, 0007, 4517c478bd9Sstevel@tonic-gate 0040, 0041, 0042, 0043, 0044, 0025, 0006, 0027, 4527c478bd9Sstevel@tonic-gate 0050, 0051, 0052, 0053, 0054, 0011, 0012, 0033, 4537c478bd9Sstevel@tonic-gate 0060, 0061, 0032, 0063, 0064, 0065, 0066, 0010, 4547c478bd9Sstevel@tonic-gate 0070, 0071, 0072, 0073, 0004, 0024, 0076, 0341, 4557c478bd9Sstevel@tonic-gate 0101, 0102, 0103, 0104, 0105, 0106, 0107, 0110, 4567c478bd9Sstevel@tonic-gate 0111, 0121, 0122, 0123, 0124, 0125, 0126, 0127, 4577c478bd9Sstevel@tonic-gate 0130, 0131, 0142, 0143, 0144, 0145, 0146, 0147, 4587c478bd9Sstevel@tonic-gate 0150, 0151, 0160, 0161, 0162, 0163, 0164, 0165, 4597c478bd9Sstevel@tonic-gate 0166, 0167, 0170, 0200, 0212, 0213, 0214, 0215, 4607c478bd9Sstevel@tonic-gate 0216, 0217, 0220, 0232, 0233, 0234, 0235, 0236, 4617c478bd9Sstevel@tonic-gate 0237, 0240, 0252, 0253, 0254, 0255, 0256, 0257, 4627c478bd9Sstevel@tonic-gate 0260, 0261, 0262, 0263, 0264, 0265, 0266, 0267, 4637c478bd9Sstevel@tonic-gate 0270, 0271, 0272, 0273, 0274, 0275, 0276, 0277, 4647c478bd9Sstevel@tonic-gate 0312, 0313, 0314, 0315, 0316, 0317, 0332, 0333, 4657c478bd9Sstevel@tonic-gate 0334, 0335, 0336, 0337, 0352, 0353, 0354, 0355, 4667c478bd9Sstevel@tonic-gate 0356, 0357, 0372, 0373, 0374, 0375, 0376, 0377, 4677c478bd9Sstevel@tonic-gate }; 4687c478bd9Sstevel@tonic-gate 4697c478bd9Sstevel@tonic-gate /* set up to use SVr4 ascii-ebcdic translation by default */ 4707c478bd9Sstevel@tonic-gate 4717c478bd9Sstevel@tonic-gate static unsigned char *atoe = svr4_atoe; 4727c478bd9Sstevel@tonic-gate static unsigned char *etoa = svr4_etoa; 4737c478bd9Sstevel@tonic-gate static unsigned char *atoibm = svr4_atoibm; 4747c478bd9Sstevel@tonic-gate 47519d32b9aSRobert Mustacchi /*ARGSUSED*/ 47619d32b9aSRobert Mustacchi static void 47719d32b9aSRobert Mustacchi siginfo_handler(int sig, siginfo_t *sip, void *ucp) 47819d32b9aSRobert Mustacchi { 47919d32b9aSRobert Mustacchi nstats = 1; 48019d32b9aSRobert Mustacchi } 4817c478bd9Sstevel@tonic-gate 482a77d64afScf46844 int 483a77d64afScf46844 main(int argc, char **argv) 4847c478bd9Sstevel@tonic-gate { 4857c478bd9Sstevel@tonic-gate unsigned char *ip, *op; /* input and output buffer pointers */ 4867c478bd9Sstevel@tonic-gate int c; /* character counter */ 4877c478bd9Sstevel@tonic-gate int ic; /* input character */ 4887c478bd9Sstevel@tonic-gate int conv; /* conversion option code */ 4897c478bd9Sstevel@tonic-gate int trunc; /* whether output file is truncated */ 4907c478bd9Sstevel@tonic-gate struct stat file_stat; 49119d32b9aSRobert Mustacchi struct sigaction sact; 4927c478bd9Sstevel@tonic-gate 4937c478bd9Sstevel@tonic-gate /* Set option defaults */ 4947c478bd9Sstevel@tonic-gate 4957c478bd9Sstevel@tonic-gate ibs = BSIZE; 4967c478bd9Sstevel@tonic-gate obs = BSIZE; 4977c478bd9Sstevel@tonic-gate files = 1; 4987c478bd9Sstevel@tonic-gate conv = COPY; 4997c478bd9Sstevel@tonic-gate trunc = 1; /* default: truncate output file */ 5007c478bd9Sstevel@tonic-gate trantype = SVR4XLATE; /* use SVR4 EBCDIC by default */ 5017c478bd9Sstevel@tonic-gate 5027c478bd9Sstevel@tonic-gate /* Parse command options */ 5037c478bd9Sstevel@tonic-gate 5047c478bd9Sstevel@tonic-gate (void) setlocale(LC_ALL, ""); 5057c478bd9Sstevel@tonic-gate #if !defined(TEXT_DOMAIN) /* Should be defined by cc -D */ 5067c478bd9Sstevel@tonic-gate #define TEXT_DOMAIN "SYS_TEST" /* Use this only if it weren't */ 5077c478bd9Sstevel@tonic-gate #endif 5087c478bd9Sstevel@tonic-gate (void) textdomain(TEXT_DOMAIN); 5097c478bd9Sstevel@tonic-gate 5107c478bd9Sstevel@tonic-gate while ((c = getopt(argc, argv, "")) != EOF) 5117c478bd9Sstevel@tonic-gate switch (c) { 5127c478bd9Sstevel@tonic-gate case '?': 5137c478bd9Sstevel@tonic-gate (void) fprintf(stderr, USAGE); 5147c478bd9Sstevel@tonic-gate exit(2); 5157c478bd9Sstevel@tonic-gate } 5167c478bd9Sstevel@tonic-gate 5177c478bd9Sstevel@tonic-gate /* not getopt()'ed because dd has no options but only operand(s) */ 5187c478bd9Sstevel@tonic-gate 5197c478bd9Sstevel@tonic-gate for (c = optind; c < argc; c++) 5207c478bd9Sstevel@tonic-gate { 5217c478bd9Sstevel@tonic-gate string = argv[c]; 5227c478bd9Sstevel@tonic-gate if (match("ibs=")) 5237c478bd9Sstevel@tonic-gate { 5247c478bd9Sstevel@tonic-gate ibs = (unsigned)number(BIG); 5257c478bd9Sstevel@tonic-gate continue; 5267c478bd9Sstevel@tonic-gate } 5277c478bd9Sstevel@tonic-gate if (match("obs=")) 5287c478bd9Sstevel@tonic-gate { 5297c478bd9Sstevel@tonic-gate obs = (unsigned)number(BIG); 5307c478bd9Sstevel@tonic-gate continue; 5317c478bd9Sstevel@tonic-gate } 5327c478bd9Sstevel@tonic-gate if (match("cbs=")) 5337c478bd9Sstevel@tonic-gate { 5347c478bd9Sstevel@tonic-gate cbs = (unsigned)number(BIG); 5357c478bd9Sstevel@tonic-gate continue; 5367c478bd9Sstevel@tonic-gate } 5377c478bd9Sstevel@tonic-gate if (match("bs=")) 5387c478bd9Sstevel@tonic-gate { 5397c478bd9Sstevel@tonic-gate bs = (unsigned)number(BIG); 5407c478bd9Sstevel@tonic-gate continue; 5417c478bd9Sstevel@tonic-gate } 5427c478bd9Sstevel@tonic-gate if (match("if=")) 5437c478bd9Sstevel@tonic-gate { 5447c478bd9Sstevel@tonic-gate ifile = string; 5457c478bd9Sstevel@tonic-gate continue; 5467c478bd9Sstevel@tonic-gate } 5477c478bd9Sstevel@tonic-gate if (match("of=")) 5487c478bd9Sstevel@tonic-gate { 5497c478bd9Sstevel@tonic-gate ofile = string; 5507c478bd9Sstevel@tonic-gate continue; 5517c478bd9Sstevel@tonic-gate } 5527c478bd9Sstevel@tonic-gate if (match("skip=")) 5537c478bd9Sstevel@tonic-gate { 5547c478bd9Sstevel@tonic-gate skip = number(BIG); 5557c478bd9Sstevel@tonic-gate continue; 5567c478bd9Sstevel@tonic-gate } 5577c478bd9Sstevel@tonic-gate if (match("iseek=")) 5587c478bd9Sstevel@tonic-gate { 5597c478bd9Sstevel@tonic-gate iseekn = number(BIG); 5607c478bd9Sstevel@tonic-gate continue; 5617c478bd9Sstevel@tonic-gate } 5627c478bd9Sstevel@tonic-gate if (match("oseek=")) 5637c478bd9Sstevel@tonic-gate { 5647c478bd9Sstevel@tonic-gate oseekn = number(BIG); 5657c478bd9Sstevel@tonic-gate continue; 5667c478bd9Sstevel@tonic-gate } 5677c478bd9Sstevel@tonic-gate if (match("seek=")) /* retained for compatibility */ 5687c478bd9Sstevel@tonic-gate { 5697c478bd9Sstevel@tonic-gate oseekn = number(BIG); 5707c478bd9Sstevel@tonic-gate continue; 5717c478bd9Sstevel@tonic-gate } 5727c478bd9Sstevel@tonic-gate if (match("count=")) 5737c478bd9Sstevel@tonic-gate { 5747c478bd9Sstevel@tonic-gate count = number(BIG); 575*e3bee069SRobert Mustacchi ecount = B_TRUE; 5767c478bd9Sstevel@tonic-gate continue; 5777c478bd9Sstevel@tonic-gate } 5787c478bd9Sstevel@tonic-gate if (match("files=")) 5797c478bd9Sstevel@tonic-gate { 5807c478bd9Sstevel@tonic-gate files = (int)number(BIG); 5817c478bd9Sstevel@tonic-gate continue; 5827c478bd9Sstevel@tonic-gate } 5837c478bd9Sstevel@tonic-gate if (match("conv=")) 5847c478bd9Sstevel@tonic-gate { 5857c478bd9Sstevel@tonic-gate for (;;) 5867c478bd9Sstevel@tonic-gate { 5877c478bd9Sstevel@tonic-gate if (match(",")) 5887c478bd9Sstevel@tonic-gate { 5897c478bd9Sstevel@tonic-gate continue; 5907c478bd9Sstevel@tonic-gate } 5917c478bd9Sstevel@tonic-gate if (*string == '\0') 5927c478bd9Sstevel@tonic-gate { 5937c478bd9Sstevel@tonic-gate break; 5947c478bd9Sstevel@tonic-gate } 5957c478bd9Sstevel@tonic-gate if (match("block")) 5967c478bd9Sstevel@tonic-gate { 5977c478bd9Sstevel@tonic-gate conv = BLOCK; 5987c478bd9Sstevel@tonic-gate continue; 5997c478bd9Sstevel@tonic-gate } 6007c478bd9Sstevel@tonic-gate if (match("unblock")) 6017c478bd9Sstevel@tonic-gate { 6027c478bd9Sstevel@tonic-gate conv = UNBLOCK; 6037c478bd9Sstevel@tonic-gate continue; 6047c478bd9Sstevel@tonic-gate } 6057c478bd9Sstevel@tonic-gate 6067c478bd9Sstevel@tonic-gate /* ebcdicb, ibmb, and asciib must precede */ 6077c478bd9Sstevel@tonic-gate /* ebcdic, ibm, and ascii in this test */ 6087c478bd9Sstevel@tonic-gate 6097c478bd9Sstevel@tonic-gate if (match("ebcdicb")) 6107c478bd9Sstevel@tonic-gate { 6117c478bd9Sstevel@tonic-gate conv = EBCDIC; 6127c478bd9Sstevel@tonic-gate trantype = BSDXLATE; 6137c478bd9Sstevel@tonic-gate continue; 6147c478bd9Sstevel@tonic-gate } 6157c478bd9Sstevel@tonic-gate if (match("ibmb")) 6167c478bd9Sstevel@tonic-gate { 6177c478bd9Sstevel@tonic-gate conv = IBM; 6187c478bd9Sstevel@tonic-gate trantype = BSDXLATE; 6197c478bd9Sstevel@tonic-gate continue; 6207c478bd9Sstevel@tonic-gate } 6217c478bd9Sstevel@tonic-gate if (match("asciib")) 6227c478bd9Sstevel@tonic-gate { 6237c478bd9Sstevel@tonic-gate conv = ASCII; 6247c478bd9Sstevel@tonic-gate trantype = BSDXLATE; 6257c478bd9Sstevel@tonic-gate continue; 6267c478bd9Sstevel@tonic-gate } 6277c478bd9Sstevel@tonic-gate if (match("ebcdic")) 6287c478bd9Sstevel@tonic-gate { 6297c478bd9Sstevel@tonic-gate conv = EBCDIC; 6307c478bd9Sstevel@tonic-gate trantype = SVR4XLATE; 6317c478bd9Sstevel@tonic-gate continue; 6327c478bd9Sstevel@tonic-gate } 6337c478bd9Sstevel@tonic-gate if (match("ibm")) 6347c478bd9Sstevel@tonic-gate { 6357c478bd9Sstevel@tonic-gate conv = IBM; 6367c478bd9Sstevel@tonic-gate trantype = SVR4XLATE; 6377c478bd9Sstevel@tonic-gate continue; 6387c478bd9Sstevel@tonic-gate } 6397c478bd9Sstevel@tonic-gate if (match("ascii")) 6407c478bd9Sstevel@tonic-gate { 6417c478bd9Sstevel@tonic-gate conv = ASCII; 6427c478bd9Sstevel@tonic-gate trantype = SVR4XLATE; 6437c478bd9Sstevel@tonic-gate continue; 6447c478bd9Sstevel@tonic-gate } 6457c478bd9Sstevel@tonic-gate if (match("lcase")) 6467c478bd9Sstevel@tonic-gate { 6477c478bd9Sstevel@tonic-gate cflag |= LCASE; 6487c478bd9Sstevel@tonic-gate continue; 6497c478bd9Sstevel@tonic-gate } 6507c478bd9Sstevel@tonic-gate if (match("ucase")) 6517c478bd9Sstevel@tonic-gate { 6527c478bd9Sstevel@tonic-gate cflag |= UCASE; 6537c478bd9Sstevel@tonic-gate continue; 6547c478bd9Sstevel@tonic-gate } 6557c478bd9Sstevel@tonic-gate if (match("swab")) 6567c478bd9Sstevel@tonic-gate { 6577c478bd9Sstevel@tonic-gate cflag |= SWAB; 6587c478bd9Sstevel@tonic-gate continue; 6597c478bd9Sstevel@tonic-gate } 6607c478bd9Sstevel@tonic-gate if (match("noerror")) 6617c478bd9Sstevel@tonic-gate { 6627c478bd9Sstevel@tonic-gate cflag |= NERR; 6637c478bd9Sstevel@tonic-gate continue; 6647c478bd9Sstevel@tonic-gate } 6657c478bd9Sstevel@tonic-gate if (match("notrunc")) 6667c478bd9Sstevel@tonic-gate { 6677c478bd9Sstevel@tonic-gate trunc = 0; 6687c478bd9Sstevel@tonic-gate continue; 6697c478bd9Sstevel@tonic-gate } 6707c478bd9Sstevel@tonic-gate if (match("sync")) 6717c478bd9Sstevel@tonic-gate { 6727c478bd9Sstevel@tonic-gate cflag |= SYNC; 6737c478bd9Sstevel@tonic-gate continue; 6747c478bd9Sstevel@tonic-gate } 6757c478bd9Sstevel@tonic-gate goto badarg; 6767c478bd9Sstevel@tonic-gate } 6777c478bd9Sstevel@tonic-gate continue; 6787c478bd9Sstevel@tonic-gate } 67919d32b9aSRobert Mustacchi if (match("oflag=")) 68019d32b9aSRobert Mustacchi { 68119d32b9aSRobert Mustacchi for (;;) 68219d32b9aSRobert Mustacchi { 68319d32b9aSRobert Mustacchi if (match(",")) 68419d32b9aSRobert Mustacchi { 68519d32b9aSRobert Mustacchi continue; 68619d32b9aSRobert Mustacchi } 68719d32b9aSRobert Mustacchi if (*string == '\0') 68819d32b9aSRobert Mustacchi { 68919d32b9aSRobert Mustacchi break; 69019d32b9aSRobert Mustacchi } 69119d32b9aSRobert Mustacchi if (match("dsync")) 69219d32b9aSRobert Mustacchi { 69319d32b9aSRobert Mustacchi oflag |= O_DSYNC; 69419d32b9aSRobert Mustacchi continue; 69519d32b9aSRobert Mustacchi } 69619d32b9aSRobert Mustacchi if (match("sync")) 69719d32b9aSRobert Mustacchi { 69819d32b9aSRobert Mustacchi oflag |= O_SYNC; 69919d32b9aSRobert Mustacchi continue; 70019d32b9aSRobert Mustacchi } 70119d32b9aSRobert Mustacchi goto badarg; 70219d32b9aSRobert Mustacchi } 70319d32b9aSRobert Mustacchi continue; 70419d32b9aSRobert Mustacchi } 7057c478bd9Sstevel@tonic-gate badarg: 7067c478bd9Sstevel@tonic-gate (void) fprintf(stderr, "dd: %s \"%s\"\n", 7077c478bd9Sstevel@tonic-gate gettext("bad argument:"), string); 7087c478bd9Sstevel@tonic-gate exit(2); 7097c478bd9Sstevel@tonic-gate } 7107c478bd9Sstevel@tonic-gate 7117c478bd9Sstevel@tonic-gate /* Perform consistency checks on options, decode strange conventions */ 7127c478bd9Sstevel@tonic-gate 7137c478bd9Sstevel@tonic-gate if (bs) 7147c478bd9Sstevel@tonic-gate { 7157c478bd9Sstevel@tonic-gate ibs = obs = bs; 7167c478bd9Sstevel@tonic-gate } 7177c478bd9Sstevel@tonic-gate if ((ibs == 0) || (obs == 0)) 7187c478bd9Sstevel@tonic-gate { 7197c478bd9Sstevel@tonic-gate (void) fprintf(stderr, "dd: %s\n", 7207c478bd9Sstevel@tonic-gate gettext("buffer sizes cannot be zero")); 7217c478bd9Sstevel@tonic-gate exit(2); 7227c478bd9Sstevel@tonic-gate } 7237c478bd9Sstevel@tonic-gate if (conv == COPY) 7247c478bd9Sstevel@tonic-gate { 7257c478bd9Sstevel@tonic-gate if ((bs == 0) || (cflag&(LCASE|UCASE))) 7267c478bd9Sstevel@tonic-gate { 7277c478bd9Sstevel@tonic-gate conv = REBLOCK; 7287c478bd9Sstevel@tonic-gate } 7297c478bd9Sstevel@tonic-gate } 7307c478bd9Sstevel@tonic-gate if (cbs == 0) 7317c478bd9Sstevel@tonic-gate { 7327c478bd9Sstevel@tonic-gate switch (conv) 7337c478bd9Sstevel@tonic-gate { 7347c478bd9Sstevel@tonic-gate case BLOCK: 7357c478bd9Sstevel@tonic-gate case UNBLOCK: 7367c478bd9Sstevel@tonic-gate conv = REBLOCK; 7377c478bd9Sstevel@tonic-gate break; 7387c478bd9Sstevel@tonic-gate 7397c478bd9Sstevel@tonic-gate case ASCII: 7407c478bd9Sstevel@tonic-gate conv = NBASCII; 7417c478bd9Sstevel@tonic-gate break; 7427c478bd9Sstevel@tonic-gate 7437c478bd9Sstevel@tonic-gate case EBCDIC: 7447c478bd9Sstevel@tonic-gate conv = NBEBCDIC; 7457c478bd9Sstevel@tonic-gate break; 7467c478bd9Sstevel@tonic-gate 7477c478bd9Sstevel@tonic-gate case IBM: 7487c478bd9Sstevel@tonic-gate conv = NBIBM; 7497c478bd9Sstevel@tonic-gate break; 7507c478bd9Sstevel@tonic-gate } 7517c478bd9Sstevel@tonic-gate } 7527c478bd9Sstevel@tonic-gate 7537c478bd9Sstevel@tonic-gate /* Expand options into lower and upper case versions if necessary */ 7547c478bd9Sstevel@tonic-gate 7557c478bd9Sstevel@tonic-gate switch (conv) 7567c478bd9Sstevel@tonic-gate { 7577c478bd9Sstevel@tonic-gate case REBLOCK: 7587c478bd9Sstevel@tonic-gate if (cflag&LCASE) 7597c478bd9Sstevel@tonic-gate conv = LCREBLOCK; 7607c478bd9Sstevel@tonic-gate else if (cflag&UCASE) 7617c478bd9Sstevel@tonic-gate conv = UCREBLOCK; 7627c478bd9Sstevel@tonic-gate break; 7637c478bd9Sstevel@tonic-gate 7647c478bd9Sstevel@tonic-gate case UNBLOCK: 7657c478bd9Sstevel@tonic-gate if (cflag&LCASE) 7667c478bd9Sstevel@tonic-gate conv = LCUNBLOCK; 7677c478bd9Sstevel@tonic-gate else if (cflag&UCASE) 7687c478bd9Sstevel@tonic-gate conv = UCUNBLOCK; 7697c478bd9Sstevel@tonic-gate break; 7707c478bd9Sstevel@tonic-gate 7717c478bd9Sstevel@tonic-gate case BLOCK: 7727c478bd9Sstevel@tonic-gate if (cflag&LCASE) 7737c478bd9Sstevel@tonic-gate conv = LCBLOCK; 7747c478bd9Sstevel@tonic-gate else if (cflag&UCASE) 7757c478bd9Sstevel@tonic-gate conv = UCBLOCK; 7767c478bd9Sstevel@tonic-gate break; 7777c478bd9Sstevel@tonic-gate 7787c478bd9Sstevel@tonic-gate case ASCII: 7797c478bd9Sstevel@tonic-gate if (cflag&LCASE) 7807c478bd9Sstevel@tonic-gate conv = LCASCII; 7817c478bd9Sstevel@tonic-gate else if (cflag&UCASE) 7827c478bd9Sstevel@tonic-gate conv = UCASCII; 7837c478bd9Sstevel@tonic-gate break; 7847c478bd9Sstevel@tonic-gate 7857c478bd9Sstevel@tonic-gate case NBASCII: 7867c478bd9Sstevel@tonic-gate if (cflag&LCASE) 7877c478bd9Sstevel@tonic-gate conv = LCNBASCII; 7887c478bd9Sstevel@tonic-gate else if (cflag&UCASE) 7897c478bd9Sstevel@tonic-gate conv = UCNBASCII; 7907c478bd9Sstevel@tonic-gate break; 7917c478bd9Sstevel@tonic-gate 7927c478bd9Sstevel@tonic-gate case EBCDIC: 7937c478bd9Sstevel@tonic-gate if (cflag&LCASE) 7947c478bd9Sstevel@tonic-gate conv = LCEBCDIC; 7957c478bd9Sstevel@tonic-gate else if (cflag&UCASE) 7967c478bd9Sstevel@tonic-gate conv = UCEBCDIC; 7977c478bd9Sstevel@tonic-gate break; 7987c478bd9Sstevel@tonic-gate 7997c478bd9Sstevel@tonic-gate case NBEBCDIC: 8007c478bd9Sstevel@tonic-gate if (cflag&LCASE) 8017c478bd9Sstevel@tonic-gate conv = LCNBEBCDIC; 8027c478bd9Sstevel@tonic-gate else if (cflag&UCASE) 8037c478bd9Sstevel@tonic-gate conv = UCNBEBCDIC; 8047c478bd9Sstevel@tonic-gate break; 8057c478bd9Sstevel@tonic-gate 8067c478bd9Sstevel@tonic-gate case IBM: 8077c478bd9Sstevel@tonic-gate if (cflag&LCASE) 8087c478bd9Sstevel@tonic-gate conv = LCIBM; 8097c478bd9Sstevel@tonic-gate else if (cflag&UCASE) 8107c478bd9Sstevel@tonic-gate conv = UCIBM; 8117c478bd9Sstevel@tonic-gate break; 8127c478bd9Sstevel@tonic-gate 8137c478bd9Sstevel@tonic-gate case NBIBM: 8147c478bd9Sstevel@tonic-gate if (cflag&LCASE) 8157c478bd9Sstevel@tonic-gate conv = LCNBIBM; 8167c478bd9Sstevel@tonic-gate else if (cflag&UCASE) 8177c478bd9Sstevel@tonic-gate conv = UCNBIBM; 8187c478bd9Sstevel@tonic-gate break; 8197c478bd9Sstevel@tonic-gate } 8207c478bd9Sstevel@tonic-gate 8217c478bd9Sstevel@tonic-gate /* If BSD-compatible translation is selected, change the tables */ 8227c478bd9Sstevel@tonic-gate 8237c478bd9Sstevel@tonic-gate if (trantype == BSDXLATE) { 8247c478bd9Sstevel@tonic-gate atoe = bsd_atoe; 8257c478bd9Sstevel@tonic-gate atoibm = bsd_atoibm; 8267c478bd9Sstevel@tonic-gate etoa = bsd_etoa; 8277c478bd9Sstevel@tonic-gate } 8287c478bd9Sstevel@tonic-gate /* Open the input file, or duplicate standard input */ 8297c478bd9Sstevel@tonic-gate 8307c478bd9Sstevel@tonic-gate ibf = -1; 8317c478bd9Sstevel@tonic-gate if (ifile) 8327c478bd9Sstevel@tonic-gate { 8337c478bd9Sstevel@tonic-gate ibf = open(ifile, 0); 8347c478bd9Sstevel@tonic-gate } 8357c478bd9Sstevel@tonic-gate else 8367c478bd9Sstevel@tonic-gate { 8377c478bd9Sstevel@tonic-gate ifile = ""; 8387c478bd9Sstevel@tonic-gate ibf = dup(0); 8397c478bd9Sstevel@tonic-gate } 84019d32b9aSRobert Mustacchi 8417c478bd9Sstevel@tonic-gate if (ibf == -1) 8427c478bd9Sstevel@tonic-gate { 8437c478bd9Sstevel@tonic-gate (void) fprintf(stderr, "dd: %s: ", ifile); 8447c478bd9Sstevel@tonic-gate perror("open"); 8457c478bd9Sstevel@tonic-gate exit(2); 8467c478bd9Sstevel@tonic-gate } 8477c478bd9Sstevel@tonic-gate 8487c478bd9Sstevel@tonic-gate /* Open the output file, or duplicate standard output */ 8497c478bd9Sstevel@tonic-gate 8507c478bd9Sstevel@tonic-gate obf = -1; 8517c478bd9Sstevel@tonic-gate if (ofile) 8527c478bd9Sstevel@tonic-gate { 8537c478bd9Sstevel@tonic-gate if (trunc == 0) /* do not truncate output file */ 85419d32b9aSRobert Mustacchi obf = open(ofile, (O_WRONLY|O_CREAT|oflag), 8557c478bd9Sstevel@tonic-gate (S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH)); 8567c478bd9Sstevel@tonic-gate else if (oseekn && (trunc == 1)) 8577c478bd9Sstevel@tonic-gate { 85819d32b9aSRobert Mustacchi obf = open(ofile, O_WRONLY|O_CREAT|oflag, 8597c478bd9Sstevel@tonic-gate (S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH)); 8607c478bd9Sstevel@tonic-gate if (obf == -1) 8617c478bd9Sstevel@tonic-gate { 8627c478bd9Sstevel@tonic-gate (void) fprintf(stderr, "dd: %s: ", ofile); 8637c478bd9Sstevel@tonic-gate perror("open"); 8647c478bd9Sstevel@tonic-gate exit(2); 8657c478bd9Sstevel@tonic-gate } 8667c478bd9Sstevel@tonic-gate (void) fstat(obf, &file_stat); 8677c478bd9Sstevel@tonic-gate if (((file_stat.st_mode & S_IFMT) == S_IFREG) && 8687c478bd9Sstevel@tonic-gate (ftruncate(obf, (((off_t)oseekn) * ((off_t)obs))) 8697c478bd9Sstevel@tonic-gate == -1)) 8707c478bd9Sstevel@tonic-gate { 8717c478bd9Sstevel@tonic-gate perror("ftruncate"); 8727c478bd9Sstevel@tonic-gate exit(2); 8737c478bd9Sstevel@tonic-gate } 8747c478bd9Sstevel@tonic-gate } 8757c478bd9Sstevel@tonic-gate else 87619d32b9aSRobert Mustacchi obf = open(ofile, O_WRONLY|O_CREAT|O_TRUNC|oflag, 8777c478bd9Sstevel@tonic-gate (S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH)); 8787c478bd9Sstevel@tonic-gate } 8797c478bd9Sstevel@tonic-gate else 8807c478bd9Sstevel@tonic-gate { 8817c478bd9Sstevel@tonic-gate ofile = ""; 8827c478bd9Sstevel@tonic-gate obf = dup(1); 8837c478bd9Sstevel@tonic-gate } 88419d32b9aSRobert Mustacchi 8857c478bd9Sstevel@tonic-gate if (obf == -1) 8867c478bd9Sstevel@tonic-gate { 8877c478bd9Sstevel@tonic-gate (void) fprintf(stderr, "dd: %s: ", ofile); 8887c478bd9Sstevel@tonic-gate perror("open"); 8897c478bd9Sstevel@tonic-gate exit(2); 8907c478bd9Sstevel@tonic-gate } 8917c478bd9Sstevel@tonic-gate 8927c478bd9Sstevel@tonic-gate /* Expand memory to get an input buffer */ 8937c478bd9Sstevel@tonic-gate 8947c478bd9Sstevel@tonic-gate ibuf = (unsigned char *)valloc(ibs + 10); 8957c478bd9Sstevel@tonic-gate 8967c478bd9Sstevel@tonic-gate /* If no conversions, the input buffer is the output buffer */ 8977c478bd9Sstevel@tonic-gate 8987c478bd9Sstevel@tonic-gate if (conv == COPY) 8997c478bd9Sstevel@tonic-gate { 9007c478bd9Sstevel@tonic-gate obuf = ibuf; 9017c478bd9Sstevel@tonic-gate } 9027c478bd9Sstevel@tonic-gate 9037c478bd9Sstevel@tonic-gate /* Expand memory to get an output buffer. Leave enough room at the */ 9047c478bd9Sstevel@tonic-gate /* end to convert a logical record when doing block conversions. */ 9057c478bd9Sstevel@tonic-gate 9067c478bd9Sstevel@tonic-gate else 9077c478bd9Sstevel@tonic-gate { 9087c478bd9Sstevel@tonic-gate obuf = (unsigned char *)valloc(obs + cbs + 10); 9097c478bd9Sstevel@tonic-gate } 9107c478bd9Sstevel@tonic-gate if ((ibuf == (unsigned char *)NULL) || (obuf == (unsigned char *)NULL)) 9117c478bd9Sstevel@tonic-gate { 9127c478bd9Sstevel@tonic-gate (void) fprintf(stderr, 9137c478bd9Sstevel@tonic-gate "dd: %s\n", gettext("not enough memory")); 9147c478bd9Sstevel@tonic-gate exit(2); 9157c478bd9Sstevel@tonic-gate } 9167c478bd9Sstevel@tonic-gate 91719d32b9aSRobert Mustacchi /* 91819d32b9aSRobert Mustacchi * Enable a statistics message when we terminate on SIGINT 91919d32b9aSRobert Mustacchi * Also enable it to be queried via SIGINFO and SIGUSR1 92019d32b9aSRobert Mustacchi */ 9217c478bd9Sstevel@tonic-gate 9227c478bd9Sstevel@tonic-gate if (signal(SIGINT, SIG_IGN) != SIG_IGN) 9237c478bd9Sstevel@tonic-gate { 9247c478bd9Sstevel@tonic-gate (void) signal(SIGINT, term); 9257c478bd9Sstevel@tonic-gate } 92619d32b9aSRobert Mustacchi 92719d32b9aSRobert Mustacchi bzero(&sact, sizeof (struct sigaction)); 92819d32b9aSRobert Mustacchi sact.sa_flags = SA_SIGINFO; 92919d32b9aSRobert Mustacchi sact.sa_sigaction = siginfo_handler; 93019d32b9aSRobert Mustacchi (void) sigemptyset(&sact.sa_mask); 93119d32b9aSRobert Mustacchi if (sigaction(SIGINFO, &sact, NULL) != 0) { 93219d32b9aSRobert Mustacchi (void) fprintf(stderr, "dd: %s: %s\n", 93319d32b9aSRobert Mustacchi gettext("failed to enable siginfo handler"), 93419d32b9aSRobert Mustacchi gettext(strerror(errno))); 93519d32b9aSRobert Mustacchi exit(2); 93619d32b9aSRobert Mustacchi } 93719d32b9aSRobert Mustacchi if (sigaction(SIGUSR1, &sact, NULL) != 0) { 93819d32b9aSRobert Mustacchi (void) fprintf(stderr, "dd: %s: %s\n", 93919d32b9aSRobert Mustacchi gettext("failed to enable sigusr1 handler"), 94019d32b9aSRobert Mustacchi gettext(strerror(errno))); 94119d32b9aSRobert Mustacchi exit(2); 94219d32b9aSRobert Mustacchi } 94319d32b9aSRobert Mustacchi 9447c478bd9Sstevel@tonic-gate /* Skip input blocks */ 9457c478bd9Sstevel@tonic-gate 9467c478bd9Sstevel@tonic-gate while (skip) 9477c478bd9Sstevel@tonic-gate { 9487c478bd9Sstevel@tonic-gate ibc = read(ibf, (char *)ibuf, ibs); 9497c478bd9Sstevel@tonic-gate if (ibc == (unsigned)-1) 9507c478bd9Sstevel@tonic-gate { 9517c478bd9Sstevel@tonic-gate if (++nbad > BADLIMIT) 9527c478bd9Sstevel@tonic-gate { 9537c478bd9Sstevel@tonic-gate (void) fprintf(stderr, "dd: %s\n", 9547c478bd9Sstevel@tonic-gate gettext("skip failed")); 9557c478bd9Sstevel@tonic-gate exit(2); 9567c478bd9Sstevel@tonic-gate } 9577c478bd9Sstevel@tonic-gate else 9587c478bd9Sstevel@tonic-gate { 9597c478bd9Sstevel@tonic-gate perror("read"); 9607c478bd9Sstevel@tonic-gate } 9617c478bd9Sstevel@tonic-gate } 9627c478bd9Sstevel@tonic-gate else 9637c478bd9Sstevel@tonic-gate { 9647c478bd9Sstevel@tonic-gate if (ibc == 0) 9657c478bd9Sstevel@tonic-gate { 9667c478bd9Sstevel@tonic-gate (void) fprintf(stderr, "dd: %s\n", 9677c478bd9Sstevel@tonic-gate gettext("cannot skip past end-of-file")); 9687c478bd9Sstevel@tonic-gate exit(3); 9697c478bd9Sstevel@tonic-gate } 9707c478bd9Sstevel@tonic-gate else 9717c478bd9Sstevel@tonic-gate { 9727c478bd9Sstevel@tonic-gate nbad = 0; 9737c478bd9Sstevel@tonic-gate } 9747c478bd9Sstevel@tonic-gate } 9757c478bd9Sstevel@tonic-gate skip--; 9767c478bd9Sstevel@tonic-gate } 9777c478bd9Sstevel@tonic-gate 9787c478bd9Sstevel@tonic-gate /* Seek past input blocks */ 9797c478bd9Sstevel@tonic-gate 9807c478bd9Sstevel@tonic-gate if (iseekn && lseek(ibf, (((off_t)iseekn) * ((off_t)ibs)), 1) == -1) 9817c478bd9Sstevel@tonic-gate { 9827c478bd9Sstevel@tonic-gate perror("lseek"); 9837c478bd9Sstevel@tonic-gate exit(2); 9847c478bd9Sstevel@tonic-gate } 9857c478bd9Sstevel@tonic-gate 9867c478bd9Sstevel@tonic-gate /* Seek past output blocks */ 9877c478bd9Sstevel@tonic-gate 9887c478bd9Sstevel@tonic-gate if (oseekn && lseek(obf, (((off_t)oseekn) * ((off_t)obs)), 1) == -1) 9897c478bd9Sstevel@tonic-gate { 9907c478bd9Sstevel@tonic-gate perror("lseek"); 9917c478bd9Sstevel@tonic-gate exit(2); 9927c478bd9Sstevel@tonic-gate } 9937c478bd9Sstevel@tonic-gate 9947c478bd9Sstevel@tonic-gate /* Initialize all buffer pointers */ 9957c478bd9Sstevel@tonic-gate 9967c478bd9Sstevel@tonic-gate skipf = 0; /* not skipping an input line */ 9977c478bd9Sstevel@tonic-gate ibc = 0; /* no input characters yet */ 9987c478bd9Sstevel@tonic-gate obc = 0; /* no output characters yet */ 9997c478bd9Sstevel@tonic-gate cbc = 0; /* the conversion buffer is empty */ 10007c478bd9Sstevel@tonic-gate op = obuf; /* point to the output buffer */ 10017c478bd9Sstevel@tonic-gate 10027c478bd9Sstevel@tonic-gate /* Read and convert input blocks until end of file(s) */ 10037c478bd9Sstevel@tonic-gate 100419d32b9aSRobert Mustacchi /* Grab our start time for siginfo purposes */ 100519d32b9aSRobert Mustacchi startt = gethrtime(); 100619d32b9aSRobert Mustacchi 10077c478bd9Sstevel@tonic-gate for (;;) 10087c478bd9Sstevel@tonic-gate { 100919d32b9aSRobert Mustacchi if (nstats != 0) { 101019d32b9aSRobert Mustacchi stats(); 101119d32b9aSRobert Mustacchi nstats = 0; 101219d32b9aSRobert Mustacchi } 101319d32b9aSRobert Mustacchi 1014*e3bee069SRobert Mustacchi if ((count == 0 && ecount == B_FALSE) || (nifr+nipr < count)) { 10157c478bd9Sstevel@tonic-gate /* If proceed on error is enabled, zero the input buffer */ 10167c478bd9Sstevel@tonic-gate 10177c478bd9Sstevel@tonic-gate if (cflag&NERR) 10187c478bd9Sstevel@tonic-gate { 10197c478bd9Sstevel@tonic-gate ip = ibuf + ibs; 10207c478bd9Sstevel@tonic-gate c = ibs; 10217c478bd9Sstevel@tonic-gate if (c & 1) /* if the size is odd, */ 10227c478bd9Sstevel@tonic-gate { 10237c478bd9Sstevel@tonic-gate *--ip = 0; /* clear the odd byte */ 10247c478bd9Sstevel@tonic-gate } 10257c478bd9Sstevel@tonic-gate if (c >>= 1) /* divide by two */ 10267c478bd9Sstevel@tonic-gate { 10277c478bd9Sstevel@tonic-gate do { /* clear two at a time */ 10287c478bd9Sstevel@tonic-gate *--ip = 0; 10297c478bd9Sstevel@tonic-gate *--ip = 0; 10307c478bd9Sstevel@tonic-gate } while (--c); 10317c478bd9Sstevel@tonic-gate } 10327c478bd9Sstevel@tonic-gate } 10337c478bd9Sstevel@tonic-gate 10347c478bd9Sstevel@tonic-gate /* Read the next input block */ 10357c478bd9Sstevel@tonic-gate 10367c478bd9Sstevel@tonic-gate ibc = read(ibf, (char *)ibuf, ibs); 10377c478bd9Sstevel@tonic-gate 10387c478bd9Sstevel@tonic-gate /* Process input errors */ 10397c478bd9Sstevel@tonic-gate 10407c478bd9Sstevel@tonic-gate if (ibc == (unsigned)-1) 10417c478bd9Sstevel@tonic-gate { 10427c478bd9Sstevel@tonic-gate perror("read"); 10437c478bd9Sstevel@tonic-gate if (((cflag&NERR) == 0) || (++nbad > BADLIMIT)) 10447c478bd9Sstevel@tonic-gate { 10457c478bd9Sstevel@tonic-gate while (obc) 10467c478bd9Sstevel@tonic-gate { 10477c478bd9Sstevel@tonic-gate (void) flsh(); 10487c478bd9Sstevel@tonic-gate } 10497c478bd9Sstevel@tonic-gate term(2); 10507c478bd9Sstevel@tonic-gate } 10517c478bd9Sstevel@tonic-gate else 10527c478bd9Sstevel@tonic-gate { 10537c478bd9Sstevel@tonic-gate stats(); 10547c478bd9Sstevel@tonic-gate ibc = ibs; /* assume a full block */ 10557c478bd9Sstevel@tonic-gate } 10567c478bd9Sstevel@tonic-gate } 10577c478bd9Sstevel@tonic-gate else 10587c478bd9Sstevel@tonic-gate { 10597c478bd9Sstevel@tonic-gate nbad = 0; 10607c478bd9Sstevel@tonic-gate } 10617c478bd9Sstevel@tonic-gate } 10627c478bd9Sstevel@tonic-gate 10637c478bd9Sstevel@tonic-gate /* Record count satisfied, simulate end of file */ 10647c478bd9Sstevel@tonic-gate 10657c478bd9Sstevel@tonic-gate else 10667c478bd9Sstevel@tonic-gate { 10677c478bd9Sstevel@tonic-gate ibc = 0; 10687c478bd9Sstevel@tonic-gate files = 1; 10697c478bd9Sstevel@tonic-gate } 10707c478bd9Sstevel@tonic-gate 10717c478bd9Sstevel@tonic-gate /* Process end of file */ 10727c478bd9Sstevel@tonic-gate 10737c478bd9Sstevel@tonic-gate if (ibc == 0) 10747c478bd9Sstevel@tonic-gate { 10757c478bd9Sstevel@tonic-gate switch (conv) 10767c478bd9Sstevel@tonic-gate { 10777c478bd9Sstevel@tonic-gate case UNBLOCK: 10787c478bd9Sstevel@tonic-gate case LCUNBLOCK: 10797c478bd9Sstevel@tonic-gate case UCUNBLOCK: 10807c478bd9Sstevel@tonic-gate case ASCII: 10817c478bd9Sstevel@tonic-gate case LCASCII: 10827c478bd9Sstevel@tonic-gate case UCASCII: 10837c478bd9Sstevel@tonic-gate 10847c478bd9Sstevel@tonic-gate /* Trim trailing blanks from the last line */ 10857c478bd9Sstevel@tonic-gate 10867c478bd9Sstevel@tonic-gate if ((c = cbc) != 0) 10877c478bd9Sstevel@tonic-gate { 10887c478bd9Sstevel@tonic-gate do { 10897c478bd9Sstevel@tonic-gate if ((*--op) != ' ') 10907c478bd9Sstevel@tonic-gate { 10917c478bd9Sstevel@tonic-gate op++; 10927c478bd9Sstevel@tonic-gate break; 10937c478bd9Sstevel@tonic-gate } 10947c478bd9Sstevel@tonic-gate } while (--c); 10957c478bd9Sstevel@tonic-gate *op++ = '\n'; 10967c478bd9Sstevel@tonic-gate obc -= cbc - c - 1; 10977c478bd9Sstevel@tonic-gate cbc = 0; 10987c478bd9Sstevel@tonic-gate 10997c478bd9Sstevel@tonic-gate /* Flush the output buffer if full */ 11007c478bd9Sstevel@tonic-gate 11017c478bd9Sstevel@tonic-gate while (obc >= obs) 11027c478bd9Sstevel@tonic-gate { 11037c478bd9Sstevel@tonic-gate op = flsh(); 11047c478bd9Sstevel@tonic-gate } 11057c478bd9Sstevel@tonic-gate } 11067c478bd9Sstevel@tonic-gate break; 11077c478bd9Sstevel@tonic-gate 11087c478bd9Sstevel@tonic-gate case BLOCK: 11097c478bd9Sstevel@tonic-gate case LCBLOCK: 11107c478bd9Sstevel@tonic-gate case UCBLOCK: 11117c478bd9Sstevel@tonic-gate case EBCDIC: 11127c478bd9Sstevel@tonic-gate case LCEBCDIC: 11137c478bd9Sstevel@tonic-gate case UCEBCDIC: 11147c478bd9Sstevel@tonic-gate case IBM: 11157c478bd9Sstevel@tonic-gate case LCIBM: 11167c478bd9Sstevel@tonic-gate case UCIBM: 11177c478bd9Sstevel@tonic-gate 11187c478bd9Sstevel@tonic-gate /* Pad trailing blanks if the last line is short */ 11197c478bd9Sstevel@tonic-gate 11207c478bd9Sstevel@tonic-gate if (cbc) 11217c478bd9Sstevel@tonic-gate { 11227c478bd9Sstevel@tonic-gate obc += c = cbs - cbc; 11237c478bd9Sstevel@tonic-gate cbc = 0; 11247c478bd9Sstevel@tonic-gate if (c > 0) 11257c478bd9Sstevel@tonic-gate { 11267c478bd9Sstevel@tonic-gate /* Use the right kind of blank */ 11277c478bd9Sstevel@tonic-gate 11287c478bd9Sstevel@tonic-gate switch (conv) 11297c478bd9Sstevel@tonic-gate { 11307c478bd9Sstevel@tonic-gate case BLOCK: 11317c478bd9Sstevel@tonic-gate case LCBLOCK: 11327c478bd9Sstevel@tonic-gate case UCBLOCK: 11337c478bd9Sstevel@tonic-gate ic = ' '; 11347c478bd9Sstevel@tonic-gate break; 11357c478bd9Sstevel@tonic-gate 11367c478bd9Sstevel@tonic-gate case EBCDIC: 11377c478bd9Sstevel@tonic-gate case LCEBCDIC: 11387c478bd9Sstevel@tonic-gate case UCEBCDIC: 11397c478bd9Sstevel@tonic-gate ic = atoe[' ']; 11407c478bd9Sstevel@tonic-gate break; 11417c478bd9Sstevel@tonic-gate 11427c478bd9Sstevel@tonic-gate case IBM: 11437c478bd9Sstevel@tonic-gate case LCIBM: 11447c478bd9Sstevel@tonic-gate case UCIBM: 11457c478bd9Sstevel@tonic-gate ic = atoibm[' ']; 11467c478bd9Sstevel@tonic-gate break; 11477c478bd9Sstevel@tonic-gate } 11487c478bd9Sstevel@tonic-gate 11497c478bd9Sstevel@tonic-gate /* Pad with trailing blanks */ 11507c478bd9Sstevel@tonic-gate 11517c478bd9Sstevel@tonic-gate do { 11527c478bd9Sstevel@tonic-gate *op++ = ic; 11537c478bd9Sstevel@tonic-gate } while (--c); 11547c478bd9Sstevel@tonic-gate } 11557c478bd9Sstevel@tonic-gate } 11567c478bd9Sstevel@tonic-gate 11577c478bd9Sstevel@tonic-gate 11587c478bd9Sstevel@tonic-gate /* Flush the output buffer if full */ 11597c478bd9Sstevel@tonic-gate 11607c478bd9Sstevel@tonic-gate while (obc >= obs) 11617c478bd9Sstevel@tonic-gate { 11627c478bd9Sstevel@tonic-gate op = flsh(); 11637c478bd9Sstevel@tonic-gate } 11647c478bd9Sstevel@tonic-gate break; 11657c478bd9Sstevel@tonic-gate } 11667c478bd9Sstevel@tonic-gate 11677c478bd9Sstevel@tonic-gate /* If no more files to read, flush the output buffer */ 11687c478bd9Sstevel@tonic-gate 11697c478bd9Sstevel@tonic-gate if (--files <= 0) 11707c478bd9Sstevel@tonic-gate { 11717c478bd9Sstevel@tonic-gate (void) flsh(); 11727c478bd9Sstevel@tonic-gate if ((close(obf) != 0) || (fclose(stdout) != 0)) 11737c478bd9Sstevel@tonic-gate { 11747c478bd9Sstevel@tonic-gate perror(gettext("dd: close error")); 11757c478bd9Sstevel@tonic-gate exit(2); 11767c478bd9Sstevel@tonic-gate } 11777c478bd9Sstevel@tonic-gate term(0); /* successful exit */ 11787c478bd9Sstevel@tonic-gate } 11797c478bd9Sstevel@tonic-gate else 11807c478bd9Sstevel@tonic-gate { 11817c478bd9Sstevel@tonic-gate continue; /* read the next file */ 11827c478bd9Sstevel@tonic-gate } 11837c478bd9Sstevel@tonic-gate } 11847c478bd9Sstevel@tonic-gate 11857c478bd9Sstevel@tonic-gate /* Normal read, check for special cases */ 11867c478bd9Sstevel@tonic-gate 11877c478bd9Sstevel@tonic-gate else if (ibc == ibs) 11887c478bd9Sstevel@tonic-gate { 11897c478bd9Sstevel@tonic-gate nifr++; /* count another full input record */ 11907c478bd9Sstevel@tonic-gate } 11917c478bd9Sstevel@tonic-gate else 11927c478bd9Sstevel@tonic-gate { 11937c478bd9Sstevel@tonic-gate nipr++; /* count a partial input record */ 11947c478bd9Sstevel@tonic-gate 11957c478bd9Sstevel@tonic-gate /* If `sync' enabled, pad nulls */ 11967c478bd9Sstevel@tonic-gate 11977c478bd9Sstevel@tonic-gate if ((cflag&SYNC) && ((cflag&NERR) == 0)) 11987c478bd9Sstevel@tonic-gate { 11997c478bd9Sstevel@tonic-gate c = ibs - ibc; 12007c478bd9Sstevel@tonic-gate ip = ibuf + ibs; 12017c478bd9Sstevel@tonic-gate do { 12027c478bd9Sstevel@tonic-gate if ((conv == BLOCK) || (conv == UNBLOCK)) 12037c478bd9Sstevel@tonic-gate *--ip = ' '; 12047c478bd9Sstevel@tonic-gate else 12057c478bd9Sstevel@tonic-gate *--ip = '\0'; 12067c478bd9Sstevel@tonic-gate } while (--c); 12077c478bd9Sstevel@tonic-gate ibc = ibs; 12087c478bd9Sstevel@tonic-gate } 12097c478bd9Sstevel@tonic-gate } 12107c478bd9Sstevel@tonic-gate 12117c478bd9Sstevel@tonic-gate /* Swap the bytes in the input buffer if necessary */ 12127c478bd9Sstevel@tonic-gate 12137c478bd9Sstevel@tonic-gate if (cflag&SWAB) 12147c478bd9Sstevel@tonic-gate { 12157c478bd9Sstevel@tonic-gate ip = ibuf; 12167c478bd9Sstevel@tonic-gate if (ibc & 1) /* if the byte count is odd, */ 12177c478bd9Sstevel@tonic-gate { 12187c478bd9Sstevel@tonic-gate ip[ibc] = 0; /* make it even, pad with zero */ 12197c478bd9Sstevel@tonic-gate } 12207c478bd9Sstevel@tonic-gate c = ibc >> 1; /* compute the pair count */ 12217c478bd9Sstevel@tonic-gate do { 12227c478bd9Sstevel@tonic-gate ic = *ip++; 12237c478bd9Sstevel@tonic-gate ip[-1] = *ip; 12247c478bd9Sstevel@tonic-gate *ip++ = ic; 12257c478bd9Sstevel@tonic-gate } while (--c); /* do two bytes at a time */ 12267c478bd9Sstevel@tonic-gate } 12277c478bd9Sstevel@tonic-gate 12287c478bd9Sstevel@tonic-gate /* Select the appropriate conversion loop */ 12297c478bd9Sstevel@tonic-gate 12307c478bd9Sstevel@tonic-gate ip = ibuf; 12317c478bd9Sstevel@tonic-gate switch (conv) 12327c478bd9Sstevel@tonic-gate { 12337c478bd9Sstevel@tonic-gate 12347c478bd9Sstevel@tonic-gate /* Simple copy: no conversion, preserve the input block size */ 12357c478bd9Sstevel@tonic-gate 12367c478bd9Sstevel@tonic-gate case COPY: 12377c478bd9Sstevel@tonic-gate obc = ibc; 12387c478bd9Sstevel@tonic-gate (void) flsh(); 12397c478bd9Sstevel@tonic-gate break; 12407c478bd9Sstevel@tonic-gate 12417c478bd9Sstevel@tonic-gate /* Simple copy: pack all output into equal sized blocks */ 12427c478bd9Sstevel@tonic-gate 12437c478bd9Sstevel@tonic-gate case REBLOCK: 12447c478bd9Sstevel@tonic-gate case LCREBLOCK: 12457c478bd9Sstevel@tonic-gate case UCREBLOCK: 12467c478bd9Sstevel@tonic-gate case NBASCII: 12477c478bd9Sstevel@tonic-gate case LCNBASCII: 12487c478bd9Sstevel@tonic-gate case UCNBASCII: 12497c478bd9Sstevel@tonic-gate case NBEBCDIC: 12507c478bd9Sstevel@tonic-gate case LCNBEBCDIC: 12517c478bd9Sstevel@tonic-gate case UCNBEBCDIC: 12527c478bd9Sstevel@tonic-gate case NBIBM: 12537c478bd9Sstevel@tonic-gate case LCNBIBM: 12547c478bd9Sstevel@tonic-gate case UCNBIBM: 12557c478bd9Sstevel@tonic-gate while ((c = ibc) != 0) 12567c478bd9Sstevel@tonic-gate { 12577c478bd9Sstevel@tonic-gate if (c > (obs - obc)) 12587c478bd9Sstevel@tonic-gate { 12597c478bd9Sstevel@tonic-gate c = obs - obc; 12607c478bd9Sstevel@tonic-gate } 12617c478bd9Sstevel@tonic-gate ibc -= c; 12627c478bd9Sstevel@tonic-gate obc += c; 12637c478bd9Sstevel@tonic-gate switch (conv) 12647c478bd9Sstevel@tonic-gate { 12657c478bd9Sstevel@tonic-gate case REBLOCK: 12667c478bd9Sstevel@tonic-gate do { 12677c478bd9Sstevel@tonic-gate *op++ = *ip++; 12687c478bd9Sstevel@tonic-gate } while (--c); 12697c478bd9Sstevel@tonic-gate break; 12707c478bd9Sstevel@tonic-gate 12717c478bd9Sstevel@tonic-gate case LCREBLOCK: 12727c478bd9Sstevel@tonic-gate do { 12737c478bd9Sstevel@tonic-gate *op++ = utol[*ip++]; 12747c478bd9Sstevel@tonic-gate } while (--c); 12757c478bd9Sstevel@tonic-gate break; 12767c478bd9Sstevel@tonic-gate 12777c478bd9Sstevel@tonic-gate case UCREBLOCK: 12787c478bd9Sstevel@tonic-gate do { 12797c478bd9Sstevel@tonic-gate *op++ = ltou[*ip++]; 12807c478bd9Sstevel@tonic-gate } while (--c); 12817c478bd9Sstevel@tonic-gate break; 12827c478bd9Sstevel@tonic-gate 12837c478bd9Sstevel@tonic-gate case NBASCII: 12847c478bd9Sstevel@tonic-gate do { 12857c478bd9Sstevel@tonic-gate *op++ = etoa[*ip++]; 12867c478bd9Sstevel@tonic-gate } while (--c); 12877c478bd9Sstevel@tonic-gate break; 12887c478bd9Sstevel@tonic-gate 12897c478bd9Sstevel@tonic-gate case LCNBASCII: 12907c478bd9Sstevel@tonic-gate do { 12917c478bd9Sstevel@tonic-gate *op++ = utol[etoa[*ip++]]; 12927c478bd9Sstevel@tonic-gate } while (--c); 12937c478bd9Sstevel@tonic-gate break; 12947c478bd9Sstevel@tonic-gate 12957c478bd9Sstevel@tonic-gate case UCNBASCII: 12967c478bd9Sstevel@tonic-gate do { 12977c478bd9Sstevel@tonic-gate *op++ = ltou[etoa[*ip++]]; 12987c478bd9Sstevel@tonic-gate } while (--c); 12997c478bd9Sstevel@tonic-gate break; 13007c478bd9Sstevel@tonic-gate 13017c478bd9Sstevel@tonic-gate case NBEBCDIC: 13027c478bd9Sstevel@tonic-gate do { 13037c478bd9Sstevel@tonic-gate *op++ = atoe[*ip++]; 13047c478bd9Sstevel@tonic-gate } while (--c); 13057c478bd9Sstevel@tonic-gate break; 13067c478bd9Sstevel@tonic-gate 13077c478bd9Sstevel@tonic-gate case LCNBEBCDIC: 13087c478bd9Sstevel@tonic-gate do { 13097c478bd9Sstevel@tonic-gate *op++ = atoe[utol[*ip++]]; 13107c478bd9Sstevel@tonic-gate } while (--c); 13117c478bd9Sstevel@tonic-gate break; 13127c478bd9Sstevel@tonic-gate 13137c478bd9Sstevel@tonic-gate case UCNBEBCDIC: 13147c478bd9Sstevel@tonic-gate do { 13157c478bd9Sstevel@tonic-gate *op++ = atoe[ltou[*ip++]]; 13167c478bd9Sstevel@tonic-gate } while (--c); 13177c478bd9Sstevel@tonic-gate break; 13187c478bd9Sstevel@tonic-gate 13197c478bd9Sstevel@tonic-gate case NBIBM: 13207c478bd9Sstevel@tonic-gate do { 13217c478bd9Sstevel@tonic-gate *op++ = atoibm[*ip++]; 13227c478bd9Sstevel@tonic-gate } while (--c); 13237c478bd9Sstevel@tonic-gate break; 13247c478bd9Sstevel@tonic-gate 13257c478bd9Sstevel@tonic-gate case LCNBIBM: 13267c478bd9Sstevel@tonic-gate do { 13277c478bd9Sstevel@tonic-gate *op++ = atoibm[utol[*ip++]]; 13287c478bd9Sstevel@tonic-gate } while (--c); 13297c478bd9Sstevel@tonic-gate break; 13307c478bd9Sstevel@tonic-gate 13317c478bd9Sstevel@tonic-gate case UCNBIBM: 13327c478bd9Sstevel@tonic-gate do { 13337c478bd9Sstevel@tonic-gate *op++ = atoibm[ltou[*ip++]]; 13347c478bd9Sstevel@tonic-gate } while (--c); 13357c478bd9Sstevel@tonic-gate break; 13367c478bd9Sstevel@tonic-gate } 13377c478bd9Sstevel@tonic-gate if (obc >= obs) 13387c478bd9Sstevel@tonic-gate { 13397c478bd9Sstevel@tonic-gate op = flsh(); 13407c478bd9Sstevel@tonic-gate } 13417c478bd9Sstevel@tonic-gate } 13427c478bd9Sstevel@tonic-gate break; 13437c478bd9Sstevel@tonic-gate 13447c478bd9Sstevel@tonic-gate /* Convert from blocked records to lines terminated by newline */ 13457c478bd9Sstevel@tonic-gate 13467c478bd9Sstevel@tonic-gate case UNBLOCK: 13477c478bd9Sstevel@tonic-gate case LCUNBLOCK: 13487c478bd9Sstevel@tonic-gate case UCUNBLOCK: 13497c478bd9Sstevel@tonic-gate case ASCII: 13507c478bd9Sstevel@tonic-gate case LCASCII: 13517c478bd9Sstevel@tonic-gate case UCASCII: 13527c478bd9Sstevel@tonic-gate while ((c = ibc) != 0) 13537c478bd9Sstevel@tonic-gate { 13547c478bd9Sstevel@tonic-gate if (c > (cbs - cbc)) 13557c478bd9Sstevel@tonic-gate /* if more than one record, */ 13567c478bd9Sstevel@tonic-gate { 13577c478bd9Sstevel@tonic-gate c = cbs - cbc; 13587c478bd9Sstevel@tonic-gate /* only copy one record */ 13597c478bd9Sstevel@tonic-gate } 13607c478bd9Sstevel@tonic-gate ibc -= c; 13617c478bd9Sstevel@tonic-gate cbc += c; 13627c478bd9Sstevel@tonic-gate obc += c; 13637c478bd9Sstevel@tonic-gate switch (conv) 13647c478bd9Sstevel@tonic-gate { 13657c478bd9Sstevel@tonic-gate case UNBLOCK: 13667c478bd9Sstevel@tonic-gate do { 13677c478bd9Sstevel@tonic-gate *op++ = *ip++; 13687c478bd9Sstevel@tonic-gate } while (--c); 13697c478bd9Sstevel@tonic-gate break; 13707c478bd9Sstevel@tonic-gate 13717c478bd9Sstevel@tonic-gate case LCUNBLOCK: 13727c478bd9Sstevel@tonic-gate do { 13737c478bd9Sstevel@tonic-gate *op++ = utol[*ip++]; 13747c478bd9Sstevel@tonic-gate } while (--c); 13757c478bd9Sstevel@tonic-gate break; 13767c478bd9Sstevel@tonic-gate 13777c478bd9Sstevel@tonic-gate case UCUNBLOCK: 13787c478bd9Sstevel@tonic-gate do { 13797c478bd9Sstevel@tonic-gate *op++ = ltou[*ip++]; 13807c478bd9Sstevel@tonic-gate } while (--c); 13817c478bd9Sstevel@tonic-gate break; 13827c478bd9Sstevel@tonic-gate 13837c478bd9Sstevel@tonic-gate case ASCII: 13847c478bd9Sstevel@tonic-gate do { 13857c478bd9Sstevel@tonic-gate *op++ = etoa[*ip++]; 13867c478bd9Sstevel@tonic-gate } while (--c); 13877c478bd9Sstevel@tonic-gate break; 13887c478bd9Sstevel@tonic-gate 13897c478bd9Sstevel@tonic-gate case LCASCII: 13907c478bd9Sstevel@tonic-gate do { 13917c478bd9Sstevel@tonic-gate *op++ = utol[etoa[*ip++]]; 13927c478bd9Sstevel@tonic-gate } while (--c); 13937c478bd9Sstevel@tonic-gate break; 13947c478bd9Sstevel@tonic-gate 13957c478bd9Sstevel@tonic-gate case UCASCII: 13967c478bd9Sstevel@tonic-gate do { 13977c478bd9Sstevel@tonic-gate *op++ = ltou[etoa[*ip++]]; 13987c478bd9Sstevel@tonic-gate } while (--c); 13997c478bd9Sstevel@tonic-gate break; 14007c478bd9Sstevel@tonic-gate } 14017c478bd9Sstevel@tonic-gate 14027c478bd9Sstevel@tonic-gate /* Trim trailing blanks if the line is full */ 14037c478bd9Sstevel@tonic-gate 14047c478bd9Sstevel@tonic-gate if (cbc == cbs) 14057c478bd9Sstevel@tonic-gate { 14067c478bd9Sstevel@tonic-gate c = cbs; /* `do - while' is usually */ 14077c478bd9Sstevel@tonic-gate do { /* faster than `for' */ 14087c478bd9Sstevel@tonic-gate if ((*--op) != ' ') 14097c478bd9Sstevel@tonic-gate { 14107c478bd9Sstevel@tonic-gate op++; 14117c478bd9Sstevel@tonic-gate break; 14127c478bd9Sstevel@tonic-gate } 14137c478bd9Sstevel@tonic-gate } while (--c); 14147c478bd9Sstevel@tonic-gate *op++ = '\n'; 14157c478bd9Sstevel@tonic-gate obc -= cbs - c - 1; 14167c478bd9Sstevel@tonic-gate cbc = 0; 14177c478bd9Sstevel@tonic-gate 14187c478bd9Sstevel@tonic-gate /* Flush the output buffer if full */ 14197c478bd9Sstevel@tonic-gate 14207c478bd9Sstevel@tonic-gate while (obc >= obs) 14217c478bd9Sstevel@tonic-gate { 14227c478bd9Sstevel@tonic-gate op = flsh(); 14237c478bd9Sstevel@tonic-gate } 14247c478bd9Sstevel@tonic-gate } 14257c478bd9Sstevel@tonic-gate } 14267c478bd9Sstevel@tonic-gate break; 14277c478bd9Sstevel@tonic-gate 14287c478bd9Sstevel@tonic-gate /* Convert to blocked records */ 14297c478bd9Sstevel@tonic-gate 14307c478bd9Sstevel@tonic-gate case BLOCK: 14317c478bd9Sstevel@tonic-gate case LCBLOCK: 14327c478bd9Sstevel@tonic-gate case UCBLOCK: 14337c478bd9Sstevel@tonic-gate case EBCDIC: 14347c478bd9Sstevel@tonic-gate case LCEBCDIC: 14357c478bd9Sstevel@tonic-gate case UCEBCDIC: 14367c478bd9Sstevel@tonic-gate case IBM: 14377c478bd9Sstevel@tonic-gate case LCIBM: 14387c478bd9Sstevel@tonic-gate case UCIBM: 14397c478bd9Sstevel@tonic-gate while ((c = ibc) != 0) 14407c478bd9Sstevel@tonic-gate { 14417c478bd9Sstevel@tonic-gate int nlflag = 0; 14427c478bd9Sstevel@tonic-gate 14437c478bd9Sstevel@tonic-gate /* We may have to skip to the end of a long line */ 14447c478bd9Sstevel@tonic-gate 14457c478bd9Sstevel@tonic-gate if (skipf) 14467c478bd9Sstevel@tonic-gate { 14477c478bd9Sstevel@tonic-gate do { 14487c478bd9Sstevel@tonic-gate if ((ic = *ip++) == '\n') 14497c478bd9Sstevel@tonic-gate { 14507c478bd9Sstevel@tonic-gate skipf = 0; 14517c478bd9Sstevel@tonic-gate c--; 14527c478bd9Sstevel@tonic-gate break; 14537c478bd9Sstevel@tonic-gate } 14547c478bd9Sstevel@tonic-gate } while (--c); 14557c478bd9Sstevel@tonic-gate if ((ibc = c) == 0) 14567c478bd9Sstevel@tonic-gate { 14577c478bd9Sstevel@tonic-gate continue; 14587c478bd9Sstevel@tonic-gate /* read another block */ 14597c478bd9Sstevel@tonic-gate } 14607c478bd9Sstevel@tonic-gate } 14617c478bd9Sstevel@tonic-gate 14627c478bd9Sstevel@tonic-gate /* If anything left, copy until newline */ 14637c478bd9Sstevel@tonic-gate 14647c478bd9Sstevel@tonic-gate if (c > (cbs - cbc + 1)) 14657c478bd9Sstevel@tonic-gate { 14667c478bd9Sstevel@tonic-gate c = cbs - cbc + 1; 14677c478bd9Sstevel@tonic-gate } 14687c478bd9Sstevel@tonic-gate ibc -= c; 14697c478bd9Sstevel@tonic-gate cbc += c; 14707c478bd9Sstevel@tonic-gate obc += c; 14717c478bd9Sstevel@tonic-gate 14727c478bd9Sstevel@tonic-gate switch (conv) 14737c478bd9Sstevel@tonic-gate { 14747c478bd9Sstevel@tonic-gate case BLOCK: 14757c478bd9Sstevel@tonic-gate do { 14767c478bd9Sstevel@tonic-gate if ((ic = *ip++) != '\n') 14777c478bd9Sstevel@tonic-gate { 14787c478bd9Sstevel@tonic-gate *op++ = ic; 14797c478bd9Sstevel@tonic-gate } 14807c478bd9Sstevel@tonic-gate else 14817c478bd9Sstevel@tonic-gate { 14827c478bd9Sstevel@tonic-gate nlflag = 1; 14837c478bd9Sstevel@tonic-gate break; 14847c478bd9Sstevel@tonic-gate } 14857c478bd9Sstevel@tonic-gate } while (--c); 14867c478bd9Sstevel@tonic-gate break; 14877c478bd9Sstevel@tonic-gate 14887c478bd9Sstevel@tonic-gate case LCBLOCK: 14897c478bd9Sstevel@tonic-gate do { 14907c478bd9Sstevel@tonic-gate if ((ic = *ip++) != '\n') 14917c478bd9Sstevel@tonic-gate { 14927c478bd9Sstevel@tonic-gate *op++ = utol[ic]; 14937c478bd9Sstevel@tonic-gate } 14947c478bd9Sstevel@tonic-gate else 14957c478bd9Sstevel@tonic-gate { 14967c478bd9Sstevel@tonic-gate nlflag = 1; 14977c478bd9Sstevel@tonic-gate break; 14987c478bd9Sstevel@tonic-gate } 14997c478bd9Sstevel@tonic-gate } while (--c); 15007c478bd9Sstevel@tonic-gate break; 15017c478bd9Sstevel@tonic-gate 15027c478bd9Sstevel@tonic-gate case UCBLOCK: 15037c478bd9Sstevel@tonic-gate do { 15047c478bd9Sstevel@tonic-gate if ((ic = *ip++) != '\n') 15057c478bd9Sstevel@tonic-gate { 15067c478bd9Sstevel@tonic-gate *op++ = ltou[ic]; 15077c478bd9Sstevel@tonic-gate } 15087c478bd9Sstevel@tonic-gate else 15097c478bd9Sstevel@tonic-gate { 15107c478bd9Sstevel@tonic-gate nlflag = 1; 15117c478bd9Sstevel@tonic-gate break; 15127c478bd9Sstevel@tonic-gate } 15137c478bd9Sstevel@tonic-gate } while (--c); 15147c478bd9Sstevel@tonic-gate break; 15157c478bd9Sstevel@tonic-gate 15167c478bd9Sstevel@tonic-gate case EBCDIC: 15177c478bd9Sstevel@tonic-gate do { 15187c478bd9Sstevel@tonic-gate if ((ic = *ip++) != '\n') 15197c478bd9Sstevel@tonic-gate { 15207c478bd9Sstevel@tonic-gate *op++ = atoe[ic]; 15217c478bd9Sstevel@tonic-gate } 15227c478bd9Sstevel@tonic-gate else 15237c478bd9Sstevel@tonic-gate { 15247c478bd9Sstevel@tonic-gate nlflag = 1; 15257c478bd9Sstevel@tonic-gate break; 15267c478bd9Sstevel@tonic-gate } 15277c478bd9Sstevel@tonic-gate } while (--c); 15287c478bd9Sstevel@tonic-gate break; 15297c478bd9Sstevel@tonic-gate 15307c478bd9Sstevel@tonic-gate case LCEBCDIC: 15317c478bd9Sstevel@tonic-gate do { 15327c478bd9Sstevel@tonic-gate if ((ic = *ip++) != '\n') 15337c478bd9Sstevel@tonic-gate { 15347c478bd9Sstevel@tonic-gate *op++ = atoe[utol[ic]]; 15357c478bd9Sstevel@tonic-gate } 15367c478bd9Sstevel@tonic-gate else 15377c478bd9Sstevel@tonic-gate { 15387c478bd9Sstevel@tonic-gate nlflag = 1; 15397c478bd9Sstevel@tonic-gate break; 15407c478bd9Sstevel@tonic-gate } 15417c478bd9Sstevel@tonic-gate } while (--c); 15427c478bd9Sstevel@tonic-gate break; 15437c478bd9Sstevel@tonic-gate 15447c478bd9Sstevel@tonic-gate case UCEBCDIC: 15457c478bd9Sstevel@tonic-gate do { 15467c478bd9Sstevel@tonic-gate if ((ic = *ip++) != '\n') 15477c478bd9Sstevel@tonic-gate { 15487c478bd9Sstevel@tonic-gate *op++ = atoe[ltou[ic]]; 15497c478bd9Sstevel@tonic-gate } 15507c478bd9Sstevel@tonic-gate else 15517c478bd9Sstevel@tonic-gate { 15527c478bd9Sstevel@tonic-gate nlflag = 1; 15537c478bd9Sstevel@tonic-gate break; 15547c478bd9Sstevel@tonic-gate } 15557c478bd9Sstevel@tonic-gate } while (--c); 15567c478bd9Sstevel@tonic-gate break; 15577c478bd9Sstevel@tonic-gate 15587c478bd9Sstevel@tonic-gate case IBM: 15597c478bd9Sstevel@tonic-gate do { 15607c478bd9Sstevel@tonic-gate if ((ic = *ip++) != '\n') 15617c478bd9Sstevel@tonic-gate { 15627c478bd9Sstevel@tonic-gate *op++ = atoibm[ic]; 15637c478bd9Sstevel@tonic-gate } 15647c478bd9Sstevel@tonic-gate else 15657c478bd9Sstevel@tonic-gate { 15667c478bd9Sstevel@tonic-gate nlflag = 1; 15677c478bd9Sstevel@tonic-gate break; 15687c478bd9Sstevel@tonic-gate } 15697c478bd9Sstevel@tonic-gate } while (--c); 15707c478bd9Sstevel@tonic-gate break; 15717c478bd9Sstevel@tonic-gate 15727c478bd9Sstevel@tonic-gate case LCIBM: 15737c478bd9Sstevel@tonic-gate do { 15747c478bd9Sstevel@tonic-gate if ((ic = *ip++) != '\n') 15757c478bd9Sstevel@tonic-gate { 15767c478bd9Sstevel@tonic-gate *op++ = atoibm[utol[ic]]; 15777c478bd9Sstevel@tonic-gate } 15787c478bd9Sstevel@tonic-gate else 15797c478bd9Sstevel@tonic-gate { 15807c478bd9Sstevel@tonic-gate nlflag = 1; 15817c478bd9Sstevel@tonic-gate break; 15827c478bd9Sstevel@tonic-gate } 15837c478bd9Sstevel@tonic-gate } while (--c); 15847c478bd9Sstevel@tonic-gate break; 15857c478bd9Sstevel@tonic-gate 15867c478bd9Sstevel@tonic-gate case UCIBM: 15877c478bd9Sstevel@tonic-gate do { 15887c478bd9Sstevel@tonic-gate if ((ic = *ip++) != '\n') 15897c478bd9Sstevel@tonic-gate { 15907c478bd9Sstevel@tonic-gate *op++ = atoibm[ltou[ic]]; 15917c478bd9Sstevel@tonic-gate } 15927c478bd9Sstevel@tonic-gate else 15937c478bd9Sstevel@tonic-gate { 15947c478bd9Sstevel@tonic-gate nlflag = 1; 15957c478bd9Sstevel@tonic-gate break; 15967c478bd9Sstevel@tonic-gate } 15977c478bd9Sstevel@tonic-gate } while (--c); 15987c478bd9Sstevel@tonic-gate break; 15997c478bd9Sstevel@tonic-gate } 16007c478bd9Sstevel@tonic-gate 16017c478bd9Sstevel@tonic-gate /* If newline found, update all the counters and */ 16027c478bd9Sstevel@tonic-gate /* pointers, pad with trailing blanks if necessary */ 16037c478bd9Sstevel@tonic-gate 16047c478bd9Sstevel@tonic-gate if (nlflag) 16057c478bd9Sstevel@tonic-gate { 16067c478bd9Sstevel@tonic-gate ibc += c - 1; 16077c478bd9Sstevel@tonic-gate obc += cbs - cbc; 16087c478bd9Sstevel@tonic-gate c += cbs - cbc; 16097c478bd9Sstevel@tonic-gate cbc = 0; 16107c478bd9Sstevel@tonic-gate if (c > 0) 16117c478bd9Sstevel@tonic-gate { 16127c478bd9Sstevel@tonic-gate /* Use the right kind of blank */ 16137c478bd9Sstevel@tonic-gate 16147c478bd9Sstevel@tonic-gate switch (conv) 16157c478bd9Sstevel@tonic-gate { 16167c478bd9Sstevel@tonic-gate case BLOCK: 16177c478bd9Sstevel@tonic-gate case LCBLOCK: 16187c478bd9Sstevel@tonic-gate case UCBLOCK: 16197c478bd9Sstevel@tonic-gate ic = ' '; 16207c478bd9Sstevel@tonic-gate break; 16217c478bd9Sstevel@tonic-gate 16227c478bd9Sstevel@tonic-gate case EBCDIC: 16237c478bd9Sstevel@tonic-gate case LCEBCDIC: 16247c478bd9Sstevel@tonic-gate case UCEBCDIC: 16257c478bd9Sstevel@tonic-gate ic = atoe[' ']; 16267c478bd9Sstevel@tonic-gate break; 16277c478bd9Sstevel@tonic-gate 16287c478bd9Sstevel@tonic-gate case IBM: 16297c478bd9Sstevel@tonic-gate case LCIBM: 16307c478bd9Sstevel@tonic-gate case UCIBM: 16317c478bd9Sstevel@tonic-gate ic = atoibm[' ']; 16327c478bd9Sstevel@tonic-gate break; 16337c478bd9Sstevel@tonic-gate } 16347c478bd9Sstevel@tonic-gate 16357c478bd9Sstevel@tonic-gate /* Pad with trailing blanks */ 16367c478bd9Sstevel@tonic-gate 16377c478bd9Sstevel@tonic-gate do { 16387c478bd9Sstevel@tonic-gate *op++ = ic; 16397c478bd9Sstevel@tonic-gate } while (--c); 16407c478bd9Sstevel@tonic-gate } 16417c478bd9Sstevel@tonic-gate } 16427c478bd9Sstevel@tonic-gate 16437c478bd9Sstevel@tonic-gate /* If not end of line, this line may be too long */ 16447c478bd9Sstevel@tonic-gate 16457c478bd9Sstevel@tonic-gate else if (cbc > cbs) 16467c478bd9Sstevel@tonic-gate { 16477c478bd9Sstevel@tonic-gate skipf = 1; /* note skip in progress */ 16487c478bd9Sstevel@tonic-gate obc--; 16497c478bd9Sstevel@tonic-gate op--; 16507c478bd9Sstevel@tonic-gate cbc = 0; 16517c478bd9Sstevel@tonic-gate ntrunc++; /* count another long line */ 16527c478bd9Sstevel@tonic-gate } 16537c478bd9Sstevel@tonic-gate 16547c478bd9Sstevel@tonic-gate /* Flush the output buffer if full */ 16557c478bd9Sstevel@tonic-gate 16567c478bd9Sstevel@tonic-gate while (obc >= obs) 16577c478bd9Sstevel@tonic-gate { 16587c478bd9Sstevel@tonic-gate op = flsh(); 16597c478bd9Sstevel@tonic-gate } 16607c478bd9Sstevel@tonic-gate } 16617c478bd9Sstevel@tonic-gate break; 16627c478bd9Sstevel@tonic-gate } 16637c478bd9Sstevel@tonic-gate } 1664a77d64afScf46844 /* NOTREACHED */ 1665a77d64afScf46844 return (0); 16667c478bd9Sstevel@tonic-gate } 16677c478bd9Sstevel@tonic-gate 16687c478bd9Sstevel@tonic-gate /* match ************************************************************** */ 16697c478bd9Sstevel@tonic-gate /* */ 16707c478bd9Sstevel@tonic-gate /* Compare two text strings for equality */ 16717c478bd9Sstevel@tonic-gate /* */ 16727c478bd9Sstevel@tonic-gate /* Arg: s - pointer to string to match with a command arg */ 16737c478bd9Sstevel@tonic-gate /* Global arg: string - pointer to command arg */ 16747c478bd9Sstevel@tonic-gate /* */ 16757c478bd9Sstevel@tonic-gate /* Return: 1 if match, 0 if no match */ 16767c478bd9Sstevel@tonic-gate /* If match, also reset `string' to point to the text */ 16777c478bd9Sstevel@tonic-gate /* that follows the matching text. */ 16787c478bd9Sstevel@tonic-gate /* */ 16797c478bd9Sstevel@tonic-gate /* ******************************************************************** */ 16807c478bd9Sstevel@tonic-gate 16817c478bd9Sstevel@tonic-gate static int 16827c478bd9Sstevel@tonic-gate match(s) 16837c478bd9Sstevel@tonic-gate char *s; 16847c478bd9Sstevel@tonic-gate { 16857c478bd9Sstevel@tonic-gate char *cs; 16867c478bd9Sstevel@tonic-gate 16877c478bd9Sstevel@tonic-gate cs = string; 16887c478bd9Sstevel@tonic-gate while (*cs++ == *s) 16897c478bd9Sstevel@tonic-gate { 16907c478bd9Sstevel@tonic-gate if (*s++ == '\0') 16917c478bd9Sstevel@tonic-gate { 16927c478bd9Sstevel@tonic-gate goto true; 16937c478bd9Sstevel@tonic-gate } 16947c478bd9Sstevel@tonic-gate } 16957c478bd9Sstevel@tonic-gate if (*s != '\0') 16967c478bd9Sstevel@tonic-gate { 16977c478bd9Sstevel@tonic-gate return (0); 16987c478bd9Sstevel@tonic-gate } 16997c478bd9Sstevel@tonic-gate 17007c478bd9Sstevel@tonic-gate true: 17017c478bd9Sstevel@tonic-gate cs--; 17027c478bd9Sstevel@tonic-gate string = cs; 17037c478bd9Sstevel@tonic-gate return (1); 17047c478bd9Sstevel@tonic-gate } 17057c478bd9Sstevel@tonic-gate 17067c478bd9Sstevel@tonic-gate /* number ************************************************************* */ 17077c478bd9Sstevel@tonic-gate /* */ 17087c478bd9Sstevel@tonic-gate /* Convert a numeric arg to binary */ 17097c478bd9Sstevel@tonic-gate /* */ 17107c478bd9Sstevel@tonic-gate /* Arg: big - maximum valid input number */ 17117c478bd9Sstevel@tonic-gate /* Global arg: string - pointer to command arg */ 17127c478bd9Sstevel@tonic-gate /* */ 17134cddff70SJosef 'Jeff' Sipek /* Valid forms: 123 | 123k | 123M | 123G | 123T | 123P | 123E | 123Z | */ 17144cddff70SJosef 'Jeff' Sipek /* 123w | 123b | 123*123 | 123x123 */ 17157c478bd9Sstevel@tonic-gate /* plus combinations such as 2b*3kw*4w */ 17167c478bd9Sstevel@tonic-gate /* */ 17177c478bd9Sstevel@tonic-gate /* Return: converted number */ 17187c478bd9Sstevel@tonic-gate /* */ 17197c478bd9Sstevel@tonic-gate /* ******************************************************************** */ 17207c478bd9Sstevel@tonic-gate 17217c478bd9Sstevel@tonic-gate static unsigned long long 17227c478bd9Sstevel@tonic-gate number(big) 17237c478bd9Sstevel@tonic-gate long long big; 17247c478bd9Sstevel@tonic-gate { 17257c478bd9Sstevel@tonic-gate char *cs; 17267c478bd9Sstevel@tonic-gate long long n; 17277c478bd9Sstevel@tonic-gate long long cut = BIG / 10; /* limit to avoid overflow */ 17287c478bd9Sstevel@tonic-gate 17297c478bd9Sstevel@tonic-gate cs = string; 17307c478bd9Sstevel@tonic-gate n = 0; 17317c478bd9Sstevel@tonic-gate while ((*cs >= '0') && (*cs <= '9') && (n <= cut)) 17327c478bd9Sstevel@tonic-gate { 17337c478bd9Sstevel@tonic-gate n = n*10 + *cs++ - '0'; 17347c478bd9Sstevel@tonic-gate } 17357c478bd9Sstevel@tonic-gate for (;;) 17367c478bd9Sstevel@tonic-gate { 17377c478bd9Sstevel@tonic-gate switch (*cs++) 17387c478bd9Sstevel@tonic-gate { 17397c478bd9Sstevel@tonic-gate 17404cddff70SJosef 'Jeff' Sipek case 'Z': 17414cddff70SJosef 'Jeff' Sipek n *= 1024; 17424cddff70SJosef 'Jeff' Sipek /* FALLTHROUGH */ 17434cddff70SJosef 'Jeff' Sipek 17444cddff70SJosef 'Jeff' Sipek case 'E': 17454cddff70SJosef 'Jeff' Sipek n *= 1024; 17464cddff70SJosef 'Jeff' Sipek /* FALLTHROUGH */ 17474cddff70SJosef 'Jeff' Sipek 17484cddff70SJosef 'Jeff' Sipek case 'P': 17494cddff70SJosef 'Jeff' Sipek n *= 1024; 17504cddff70SJosef 'Jeff' Sipek /* FALLTHROUGH */ 17514cddff70SJosef 'Jeff' Sipek 17524cddff70SJosef 'Jeff' Sipek case 'T': 17534cddff70SJosef 'Jeff' Sipek n *= 1024; 17544cddff70SJosef 'Jeff' Sipek /* FALLTHROUGH */ 17554cddff70SJosef 'Jeff' Sipek 17564cddff70SJosef 'Jeff' Sipek case 'G': 17574cddff70SJosef 'Jeff' Sipek n *= 1024; 17584cddff70SJosef 'Jeff' Sipek /* FALLTHROUGH */ 17594cddff70SJosef 'Jeff' Sipek 17604cddff70SJosef 'Jeff' Sipek case 'M': 17614cddff70SJosef 'Jeff' Sipek n *= 1024; 17624cddff70SJosef 'Jeff' Sipek /* FALLTHROUGH */ 17634cddff70SJosef 'Jeff' Sipek 17647c478bd9Sstevel@tonic-gate case 'k': 17657c478bd9Sstevel@tonic-gate n *= 1024; 17667c478bd9Sstevel@tonic-gate continue; 17677c478bd9Sstevel@tonic-gate 17687c478bd9Sstevel@tonic-gate case 'w': 17697c478bd9Sstevel@tonic-gate n *= 2; 17707c478bd9Sstevel@tonic-gate continue; 17717c478bd9Sstevel@tonic-gate 17727c478bd9Sstevel@tonic-gate case 'b': 17737c478bd9Sstevel@tonic-gate n *= BSIZE; 17747c478bd9Sstevel@tonic-gate continue; 17757c478bd9Sstevel@tonic-gate 17767c478bd9Sstevel@tonic-gate case '*': 17777c478bd9Sstevel@tonic-gate case 'x': 17787c478bd9Sstevel@tonic-gate string = cs; 17797c478bd9Sstevel@tonic-gate n *= number(BIG); 17807c478bd9Sstevel@tonic-gate 17817c478bd9Sstevel@tonic-gate /* FALLTHROUGH */ 17827c478bd9Sstevel@tonic-gate /* Fall into exit test, recursion has read rest of string */ 17837c478bd9Sstevel@tonic-gate /* End of string, check for a valid number */ 17847c478bd9Sstevel@tonic-gate 17857c478bd9Sstevel@tonic-gate case '\0': 17867c478bd9Sstevel@tonic-gate if ((n > big) || (n < 0)) 17877c478bd9Sstevel@tonic-gate { 17887c478bd9Sstevel@tonic-gate (void) fprintf(stderr, "dd: %s \"%llu\"\n", 17897c478bd9Sstevel@tonic-gate gettext("argument out of range:"), n); 17907c478bd9Sstevel@tonic-gate exit(2); 17917c478bd9Sstevel@tonic-gate } 17927c478bd9Sstevel@tonic-gate return (n); 17937c478bd9Sstevel@tonic-gate 17947c478bd9Sstevel@tonic-gate default: 17957c478bd9Sstevel@tonic-gate (void) fprintf(stderr, "dd: %s \"%s\"\n", 17967c478bd9Sstevel@tonic-gate gettext("bad numeric argument:"), string); 17977c478bd9Sstevel@tonic-gate exit(2); 17987c478bd9Sstevel@tonic-gate } 17997c478bd9Sstevel@tonic-gate } /* never gets here */ 18007c478bd9Sstevel@tonic-gate } 18017c478bd9Sstevel@tonic-gate 18027c478bd9Sstevel@tonic-gate /* flsh *************************************************************** */ 18037c478bd9Sstevel@tonic-gate /* */ 18047c478bd9Sstevel@tonic-gate /* Flush the output buffer, move any excess bytes down to the beginning */ 18057c478bd9Sstevel@tonic-gate /* */ 18067c478bd9Sstevel@tonic-gate /* Arg: none */ 18077c478bd9Sstevel@tonic-gate /* Global args: obuf, obc, obs, nofr, nopr */ 18087c478bd9Sstevel@tonic-gate /* */ 18097c478bd9Sstevel@tonic-gate /* Return: Pointer to the first free byte in the output buffer. */ 18107c478bd9Sstevel@tonic-gate /* Also reset `obc' to account for moved bytes. */ 18117c478bd9Sstevel@tonic-gate /* */ 18127c478bd9Sstevel@tonic-gate /* ******************************************************************** */ 18137c478bd9Sstevel@tonic-gate 18147c478bd9Sstevel@tonic-gate static unsigned char 18157c478bd9Sstevel@tonic-gate *flsh() 18167c478bd9Sstevel@tonic-gate { 18177c478bd9Sstevel@tonic-gate unsigned char *op, *cp; 18187c478bd9Sstevel@tonic-gate int bc; 18197c478bd9Sstevel@tonic-gate unsigned int oc; 18207c478bd9Sstevel@tonic-gate 18217c478bd9Sstevel@tonic-gate if (obc) /* don't flush if the buffer is empty */ 18227c478bd9Sstevel@tonic-gate { 18237c478bd9Sstevel@tonic-gate if (obc >= obs) { 18247c478bd9Sstevel@tonic-gate oc = obs; 18257c478bd9Sstevel@tonic-gate nofr++; /* count a full output buffer */ 18267c478bd9Sstevel@tonic-gate } 18277c478bd9Sstevel@tonic-gate else 18287c478bd9Sstevel@tonic-gate { 18297c478bd9Sstevel@tonic-gate oc = obc; 18307c478bd9Sstevel@tonic-gate nopr++; /* count a partial output buffer */ 18317c478bd9Sstevel@tonic-gate } 18327c478bd9Sstevel@tonic-gate bc = write(obf, (char *)obuf, oc); 18337c478bd9Sstevel@tonic-gate if (bc != oc) { 18347c478bd9Sstevel@tonic-gate if (bc < 0) 18357c478bd9Sstevel@tonic-gate perror("write"); 18367c478bd9Sstevel@tonic-gate else 18377c478bd9Sstevel@tonic-gate (void) fprintf(stderr, 18387c478bd9Sstevel@tonic-gate gettext("dd: unexpected short write, " 18397c478bd9Sstevel@tonic-gate "wrote %d bytes, expected %d\n"), bc, oc); 18407c478bd9Sstevel@tonic-gate term(2); 18417c478bd9Sstevel@tonic-gate } 18427c478bd9Sstevel@tonic-gate obc -= oc; 18437c478bd9Sstevel@tonic-gate op = obuf; 184419d32b9aSRobert Mustacchi obytes += bc; 18457c478bd9Sstevel@tonic-gate 18467c478bd9Sstevel@tonic-gate /* If any data in the conversion buffer, move it into */ 18477c478bd9Sstevel@tonic-gate /* the output buffer */ 18487c478bd9Sstevel@tonic-gate 18497c478bd9Sstevel@tonic-gate if (obc) { 18507c478bd9Sstevel@tonic-gate cp = obuf + obs; 18517c478bd9Sstevel@tonic-gate bc = obc; 18527c478bd9Sstevel@tonic-gate do { 18537c478bd9Sstevel@tonic-gate *op++ = *cp++; 18547c478bd9Sstevel@tonic-gate } while (--bc); 18557c478bd9Sstevel@tonic-gate } 18567c478bd9Sstevel@tonic-gate return (op); 18577c478bd9Sstevel@tonic-gate } 18587c478bd9Sstevel@tonic-gate return (obuf); 18597c478bd9Sstevel@tonic-gate } 18607c478bd9Sstevel@tonic-gate 18617c478bd9Sstevel@tonic-gate /* term *************************************************************** */ 18627c478bd9Sstevel@tonic-gate /* */ 18637c478bd9Sstevel@tonic-gate /* Write record statistics, then exit */ 18647c478bd9Sstevel@tonic-gate /* */ 18657c478bd9Sstevel@tonic-gate /* Arg: c - exit status code */ 18667c478bd9Sstevel@tonic-gate /* */ 18677c478bd9Sstevel@tonic-gate /* Return: no return, calls exit */ 18687c478bd9Sstevel@tonic-gate /* */ 18697c478bd9Sstevel@tonic-gate /* ******************************************************************** */ 18707c478bd9Sstevel@tonic-gate 18717c478bd9Sstevel@tonic-gate static void 18727c478bd9Sstevel@tonic-gate term(c) 18737c478bd9Sstevel@tonic-gate int c; 18747c478bd9Sstevel@tonic-gate { 18757c478bd9Sstevel@tonic-gate stats(); 18767c478bd9Sstevel@tonic-gate exit(c); 18777c478bd9Sstevel@tonic-gate } 18787c478bd9Sstevel@tonic-gate 18797c478bd9Sstevel@tonic-gate /* stats ************************************************************** */ 18807c478bd9Sstevel@tonic-gate /* */ 18817c478bd9Sstevel@tonic-gate /* Write record statistics onto standard error */ 18827c478bd9Sstevel@tonic-gate /* */ 18837c478bd9Sstevel@tonic-gate /* Args: none */ 18847c478bd9Sstevel@tonic-gate /* Global args: nifr, nipr, nofr, nopr, ntrunc */ 18857c478bd9Sstevel@tonic-gate /* */ 18867c478bd9Sstevel@tonic-gate /* Return: void */ 18877c478bd9Sstevel@tonic-gate /* */ 18887c478bd9Sstevel@tonic-gate /* ******************************************************************** */ 18897c478bd9Sstevel@tonic-gate 18907c478bd9Sstevel@tonic-gate static void 18917c478bd9Sstevel@tonic-gate stats() 18927c478bd9Sstevel@tonic-gate { 189319d32b9aSRobert Mustacchi hrtime_t delta = gethrtime() - startt; 189419d32b9aSRobert Mustacchi double secs = delta * 1e-9; 189519d32b9aSRobert Mustacchi 18967c478bd9Sstevel@tonic-gate (void) fprintf(stderr, gettext("%llu+%llu records in\n"), nifr, nipr); 18977c478bd9Sstevel@tonic-gate (void) fprintf(stderr, gettext("%llu+%llu records out\n"), nofr, nopr); 18987c478bd9Sstevel@tonic-gate if (ntrunc) { 18997c478bd9Sstevel@tonic-gate (void) fprintf(stderr, 19007c478bd9Sstevel@tonic-gate gettext("%llu truncated record(s)\n"), ntrunc); 19017c478bd9Sstevel@tonic-gate } 190219d32b9aSRobert Mustacchi 190319d32b9aSRobert Mustacchi /* 190419d32b9aSRobert Mustacchi * If we got here before we started copying somehow, don't bother 190519d32b9aSRobert Mustacchi * printing the rest. 190619d32b9aSRobert Mustacchi */ 190719d32b9aSRobert Mustacchi if (startt == 0) 190819d32b9aSRobert Mustacchi return; 190919d32b9aSRobert Mustacchi 191019d32b9aSRobert Mustacchi (void) fprintf(stderr, 191119d32b9aSRobert Mustacchi gettext("%llu bytes transferred in %.6f secs (%.0f bytes/sec)\n"), 191219d32b9aSRobert Mustacchi obytes, secs, obytes / secs); 19137c478bd9Sstevel@tonic-gate } 1914