NCEPLIBS-w3emc  2.11.0
sbyte.f
Go to the documentation of this file.
1 C> @file
2 C> @brief This is the fortran 32 bit version of sbyte().
3 C> @author Robert Gammill @date 1972-07
4 
5 C> @param[out] IOUT
6 C> @param[in] IN Unpacked array input
7 C> @param[in] ISKIP Initial number of bits to skip
8 C> @param[in] NBYTE Number of bits to pack
9 C>
10 C> @author Robert Gammill @date 1972-07
11  SUBROUTINE sbyte(IOUT,IN,ISKIP,NBYTE)
12  INTEGER IN
13  INTEGER IOUT(*)
14  INTEGER MASKS(32)
15 C
16  SAVE
17 C
18  DATA nbitsw/32/
19 C
20 C DATA MASKS /Z'00000001',Z'00000003',Z'00000007',Z'0000000F',
21 C & Z'0000001F',Z'0000003F',Z'0000007F',Z'000000FF',
22 C & Z'000001FF',Z'000003FF',Z'000007FF',Z'00000FFF',
23 C & Z'00001FFF',Z'00003FFF',Z'00007FFF',Z'0000FFFF',
24 C & Z'0001FFFF',Z'0003FFFF',Z'0007FFFF',Z'000FFFFF',
25 C & Z'001FFFFF',Z'003FFFFF',Z'007FFFFF',Z'00FFFFFF',
26 C & Z'01FFFFFF',Z'03FFFFFF',Z'07FFFFFF',Z'0FFFFFFF',
27 C & Z'1FFFFFFF',Z'3FFFFFFF',Z'7FFFFFFF',Z'FFFFFFFF'/
28 C
29 C MASK TABLE PUT IN DECIMAL SO IT WILL COMPILE ON AN 32 BIT
30 C COMPUTER
31 C
32  DATA masks / 1, 3, 7, 15, 31, 63, 127, 255, 511, 1023, 2047,
33  & 4095, 8191, 16383, 32767, 65535, 131071, 262143, 524287,
34  & 1048575, 2097151, 4194303, 8388607, 16777215, 33554431,
35  & 67108863, 134217727, 268435455, 536870911, 1073741823,
36  & 2147483647, -1/
37 C
38 C NBYTE MUST BE LESS THAN OR EQUAL TO NBITSW
39 C
40  icon = nbitsw - nbyte
41  IF (icon.LT.0) RETURN
42  mask = masks(nbyte)
43 C
44 C INDEX TELLS HOW MANY WORDS INTO IOUT THE NEXT BYTE IS TO BE STORED.
45 C
46  index = ishft(iskip,-5)
47 C
48 C II TELLS HOW MANY BITS IN FROM THE LEFT SIDE OF THE WORD TO STORE IT.
49 C
50  ii = mod(iskip,nbitsw)
51 C
52  j = iand(mask,in)
53  movel = icon - ii
54 C
55 C BYTE IS TO BE STORED IN MIDDLE OF WORD. SHIFT LEFT.
56 C
57  IF (movel.GT.0) THEN
58  msk = ishft(mask,movel)
59  iout(index+1) = ior(iand(not(msk),iout(index+1)),
60  & ishft(j,movel))
61 C
62 C THE BYTE IS TO BE SPLIT ACROSS A WORD BREAK.
63 C
64  ELSE IF (movel.LT.0) THEN
65  msk = masks(nbyte+movel)
66  iout(index+1) = ior(iand(not(msk),iout(index+1)),
67  & ishft(j,movel))
68  itemp = iand(masks(nbitsw+movel),iout(index+2))
69  iout(index+2) = ior(itemp,ishft(j,nbitsw+movel))
70 C
71 C BYTE IS TO BE STORED RIGHT-ADJUSTED.
72 C
73  ELSE
74  iout(index+1) = ior(iand(not(mask),iout(index+1)),j)
75  ENDIF
76 C
77  RETURN
78  END
subroutine sbyte(IOUT, IN, ISKIP, NBYTE)
Definition: sbyte.f:12