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