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
siginfo_handler(int sig,siginfo_t * sip,void * ucp)47719d32b9aSRobert Mustacchi siginfo_handler(int sig, siginfo_t *sip, void *ucp)
47819d32b9aSRobert Mustacchi {
47919d32b9aSRobert Mustacchi nstats = 1;
48019d32b9aSRobert Mustacchi }
4817c478bd9Sstevel@tonic-gate
482a77d64afScf46844 int
main(int argc,char ** argv)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
match(s)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
number(big)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
flsh()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
term(c)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
stats()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