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