|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metricsIndex: % C L M R T U a e f g h l m n r s t
Length: 2630129 (0x2821f1) Types: Tarfile Notes: Tarfile, Uncompressed file
└─⟦9ae75bfbd⟧ Bits:30007242 EUUGD3: Starter Kit └─⟦6429e39db⟧ »EurOpenD3/news/tmnn.7.8.tar.Z« └─⟦this⟧
mode | link | uid | gid | size | mtime | name | artifact |
---|---|---|---|---|---|---|---|
-r--r--r-- | 0 | 101 | 1 | 9222 | 1989-07-10T17:07:47 | LICENSE | ⟦746865b25⟧ TextFile |
-rw-rw-rw- | 0 | 101 | 1 | 1632 | 1989-08-28T12:50:20 | Makefile | ⟦f1c504823⟧ TextFile |
-r--r--r-- | 0 | 101 | 1 | 530 | 1989-07-10T17:07:48 | READ.ME | ⟦3431f1cf9⟧ TextFile |
-r--r--r-- | 0 | 101 | 1 | 1163 | 1989-07-10T17:09:20 | src | «none» |
-r--r--r-- | 0 | 101 | 1 | 1163 | 1989-07-10T17:09:20 | src/%distributions | ⟦18ab05484⟧ TextFile |
-r--r--r-- | 0 | 101 | 1 | 229 | 1989-07-20T01:35:21 | src/%feeds | ⟦85af3318c⟧ TextFile |
-r--r--r-- | 0 | 101 | 1 | 2570 | 1989-07-10T17:09:20 | src/%mailpaths | ⟦6d876d6db⟧ TextFile |
-r--r--r-- | 0 | 101 | 1 | 19875 | 1989-07-10T17:09:20 | src/%newsgroups | ⟦0b7638aee⟧ TextFile |
-r-xr-xr-- | 0 | 101 | 1 | 41494 | 1989-08-01T12:14:57 | src/Configure | ⟦000951ef6⟧ TextFile |
-r-xr-xr-- | 0 | 101 | 1 | 17542 | 1989-08-11T03:22:31 | src/ConfigureMap | ⟦e0fa1ca59⟧ TextFile |
-r-xr-xr-- | 0 | 101 | 1 | 45269 | 1989-08-28T13:50:52 | src/ConfigureSys | ⟦c5de668f0⟧ TextFile |
-r-xr-xr-- | 0 | 101 | 1 | 3598 | 1989-07-10T17:09:21 | src/ConfigureUtils | ⟦38af02ed0⟧ TextFile |
-r--r--r-- | 0 | 101 | 1 | 2567 | 1989-08-28T13:20:46 | src/D.filt | «none» |
-r--r--r-- | 0 | 101 | 1 | 2567 | 1989-08-28T13:20:46 | src/D.filt/Makefile.dst | ⟦1ef53039d⟧ TextFile |
-r--r--r-- | 0 | 101 | 1 | 9526 | 1989-08-15T23:18:35 | src/D.filt/filter.c | ⟦10bf48aa3⟧ TextFile |
-r--r--r-- | 0 | 101 | 1 | 1026 | 1989-07-10T17:08:42 | src/D.filt/libfilt.h | ⟦e80932208⟧ TextFile |
-r--r--r-- | 0 | 101 | 1 | 11105 | 1989-08-15T21:07:54 | src/D.filt/lnfilter.c | ⟦bf102acff⟧ TextFile |
-r--r--r-- | 0 | 101 | 1 | 1723 | 1989-07-10T17:08:43 | src/D.filt/savescore.c | ⟦01a5f828b⟧ TextFile |
-r--r--r-- | 0 | 101 | 1 | 7490 | 1989-08-03T06:49:31 | src/D.filt/tofilter.c | ⟦e5e296d3e⟧ TextFile |
-r--r--r-- | 0 | 101 | 1 | 3512 | 1989-07-10T17:08:43 | src/D.filt/transact.c | ⟦a7e539230⟧ TextFile |
-r--r--r-- | 0 | 101 | 1 | 331 | 1989-07-10T17:08:42 | src/D.filt/transact.h | ⟦3f020df56⟧ TextFile |
-r--r--r-- | 0 | 101 | 1 | 2248 | 1989-08-28T13:18:57 | src/D.network | «none» |
-r--r--r-- | 0 | 101 | 1 | 2248 | 1989-08-28T13:18:57 | src/D.network/Makefile.dst | ⟦2ba98f2c4⟧ TextFile |
-r--r--r-- | 0 | 101 | 1 | 2817 | 1989-07-10T17:08:45 | src/D.network/nntp.h | ⟦c8622d2ca⟧ TextFile |
-r--r--r-- | 0 | 101 | 1 | 8058 | 1989-07-10T17:08:46 | src/D.network/nntpclient.c | ⟦137e59254⟧ TextFile |
-r--r--r-- | 0 | 101 | 1 | 2223 | 1989-07-10T17:08:46 | src/D.network/nntppost.c | ⟦b44159a02⟧ TextFile |
-r--r--r-- | 0 | 101 | 1 | 6333 | 1989-07-10T17:08:46 | src/D.network/nntpread.c | ⟦5d116f8fa⟧ TextFile |
-r--r--r-- | 0 | 101 | 1 | 3046 | 1989-08-28T13:22:19 | src/D.news | «none» |
-r--r--r-- | 0 | 101 | 1 | 3046 | 1989-08-28T13:22:19 | src/D.news/Makefile.dst | ⟦099dad68e⟧ TextFile |
-r--r--r-- | 0 | 101 | 1 | 6740 | 1989-07-10T17:08:48 | src/D.news/active.h | ⟦a46ba6f29⟧ TextFile |
-r--r--r-- | 0 | 101 | 1 | 9049 | 1989-07-14T01:41:24 | src/D.news/articleid.c | ⟦408ced115⟧ TextFile |
-r--r--r-- | 0 | 101 | 1 | 4701 | 1989-07-13T23:22:03 | src/D.news/artlist.c | ⟦c2b90fdc6⟧ TextFile |
-r--r--r-- | 0 | 101 | 1 | 11373 | 1989-07-19T22:13:42 | src/D.news/escapes.c | ⟦3ceea6706⟧ TextFile |
-r--r--r-- | 0 | 101 | 1 | 9206 | 1989-07-10T17:08:49 | src/D.news/fascist.c | ⟦f44fbf15e⟧ TextFile |
-r--r--r-- | 0 | 101 | 1 | 534 | 1989-07-10T17:08:47 | src/D.news/fascist.h | ⟦3d476eb28⟧ TextFile |
-r--r--r-- | 0 | 101 | 1 | 7983 | 1989-08-01T11:36:30 | src/D.news/feeds.c | ⟦06d87a119⟧ TextFile |
-r--r--r-- | 0 | 101 | 1 | 1707 | 1989-07-10T17:08:48 | src/D.news/feeds.h | ⟦bc834da1a⟧ TextFile |
-r--r--r-- | 0 | 101 | 1 | 1868 | 1989-08-01T11:36:07 | src/D.news/getfiles.c | ⟦2459fac87⟧ TextFile |
-r--r--r-- | 0 | 101 | 1 | 2700 | 1989-07-10T17:08:49 | src/D.news/header.h | ⟦676258d2d⟧ TextFile |
-r--r--r-- | 0 | 101 | 1 | 2859 | 1989-07-10T17:08:50 | src/D.news/history.h | ⟦ad3f91751⟧ TextFile |
-r--r--r-- | 0 | 101 | 1 | 3857 | 1989-07-10T17:08:50 | src/D.news/mailbox.c | ⟦f1abf3688⟧ TextFile |
-r--r--r-- | 0 | 101 | 1 | 944 | 1989-07-10T17:08:50 | src/D.news/mailbox.h | ⟦125c7cc25⟧ TextFile |
-r--r--r-- | 0 | 101 | 1 | 2266 | 1989-07-10T17:08:50 | src/D.news/msgopen.c | ⟦d74320f90⟧ TextFile |
-r--r--r-- | 0 | 101 | 1 | 3171 | 1989-07-14T03:54:45 | src/D.news/myorg.c | ⟦398253fdf⟧ TextFile |
-r--r--r-- | 0 | 101 | 1 | 5923 | 1989-08-01T11:36:18 | src/D.news/news.h | ⟦a7c020198⟧ TextFile |
-r--r--r-- | 0 | 101 | 1 | 9974 | 1989-08-24T12:26:55 | src/D.news/rdhistory.c | ⟦2212bbfde⟧ TextFile |
0x000000…000200 TarEntry {name=»READ.ME«, mode=»444«, uid=»145«, gid=»1«, size=»1022«, mtime=»4456153744«, checksum=»5023«, flag=»«, linkname=»«, magic=»«, version=»«, uname=»«, gname=»«, devmajor=»«, devminor=»«, prefix=»«} 0x000200…000412 ⟦3431f1cf9⟧ 0x000412…000600 FilePadding[0x1ee] 0x000600…000800 TarEntry {name=»LICENSE«, mode=»444«, uid=»145«, gid=»1«, size=»22006«, mtime=»4456153743«, checksum=»5116«, flag=»«, linkname=»«, magic=»«, version=»«, uname=»«, gname=»«, devmajor=»«, devminor=»«, prefix=»«} 0x000800…002c06 ⟦746865b25⟧ 0x002c06…002e00 FilePadding[0x1fa] 0x002e00…003000 TarEntry {name=»Makefile«, mode=»666«, uid=»145«, gid=»1«, size=»3140«, mtime=»4476232414«, checksum=»5530«, flag=»«, linkname=»«, magic=»«, version=»«, uname=»«, gname=»«, devmajor=»«, devminor=»«, prefix=»«} 0x003000…003660 ⟦f1c504823⟧ 0x003660…003800 FilePadding[0x1a0] 0x003800…003a00 TarEntry {name=»src/%distributions«, mode=»444«, uid=»145«, gid=»1«, size=»2213«, mtime=»4456154100«, checksum=»7534«, flag=»«, linkname=»«, magic=»«, version=»«, uname=»«, gname=»«, devmajor=»«, devminor=»«, prefix=»«} 0x003a00…003e8b ⟦18ab05484⟧ 0x003e8b…004000 FilePadding[0x175] 0x004000…004200 TarEntry {name=»src/%feeds«, mode=»444«, uid=»145«, gid=»1«, size=»345«, mtime=»4461226131«, checksum=»5704«, flag=»«, linkname=»«, magic=»«, version=»«, uname=»«, gname=»«, devmajor=»«, devminor=»«, prefix=»«} 0x004200…0042e5 ⟦85af3318c⟧ 0x0042e5…004400 FilePadding[0x11b] 0x004400…004600 TarEntry {name=»src/%mailpaths«, mode=»444«, uid=»145«, gid=»1«, size=»5012«, mtime=»4456154100«, checksum=»6614«, flag=»«, linkname=»«, magic=»«, version=»«, uname=»«, gname=»«, devmajor=»«, devminor=»«, prefix=»«} 0x004600…00500a ⟦6d876d6db⟧ 0x00500a…005200 FilePadding[0x1f6] 0x005200…005400 TarEntry {name=»src/%newsgroups«, mode=»444«, uid=»145«, gid=»1«, size=»46643«, mtime=»4456154100«, checksum=»7105«, flag=»«, linkname=»«, magic=»«, version=»«, uname=»«, gname=»«, devmajor=»«, devminor=»«, prefix=»«} 0x005400…00a1a3 ⟦0b7638aee⟧ 0x00a1a3…00a200 FilePadding[0x5d] 0x00a200…00a400 TarEntry {name=»src/Configure«, mode=»555«, uid=»145«, gid=»1«, size=»121026«, mtime=»4465312101«, checksum=»6552«, flag=»«, linkname=»«, magic=»«, version=»«, uname=»«, gname=»«, devmajor=»«, devminor=»«, prefix=»«} 0x00a400…014616 ⟦000951ef6⟧ 0x014616…014800 FilePadding[0x1ea] 0x014800…014a00 TarEntry {name=»src/ConfigureMap«, mode=»555«, uid=»145«, gid=»1«, size=»42206«, mtime=»4470443167«, checksum=»7207«, flag=»«, linkname=»«, magic=»«, version=»«, uname=»«, gname=»«, devmajor=»«, devminor=»«, prefix=»«} 0x014a00…018e86 ⟦e0fa1ca59⟧ 0x018e86…019000 FilePadding[0x17a] 0x019000…019200 TarEntry {name=»src/ConfigureSys«, mode=»555«, uid=»145«, gid=»1«, size=»130325«, mtime=»4476241474«, checksum=»7273«, flag=»«, linkname=»«, magic=»«, version=»«, uname=»«, gname=»«, devmajor=»«, devminor=»«, prefix=»«} 0x019200…0242d5 ⟦c5de668f0⟧ 0x0242d5…024400 FilePadding[0x12b] 0x024400…024600 TarEntry {name=»src/ConfigureUtils«, mode=»555«, uid=»145«, gid=»1«, size=»7016«, mtime=»4456154101«, checksum=»7541«, flag=»«, linkname=»«, magic=»«, version=»«, uname=»«, gname=»«, devmajor=»«, devminor=»«, prefix=»«} 0x024600…02540e ⟦38af02ed0⟧ 0x02540e…025600 FilePadding[0x1f2] 0x025600…025800 TarEntry {name=»src/D.filt/Makefile.dst«, mode=»444«, uid=»145«, gid=»1«, size=»5007«, mtime=»4476236056«, checksum=»10234«, flag=»«, linkname=»«, magic=»«, version=»«, uname=»«, gname=»«, devmajor=»«, devminor=»«, prefix=»«} 0x025800…026207 ⟦1ef53039d⟧ 0x026207…026400 FilePadding[0x1f9] 0x026400…026600 TarEntry {name=»src/D.filt/filter.c«, mode=»444«, uid=»145«, gid=»1«, size=»22466«, mtime=»4472122313«, checksum=»7446«, flag=»«, linkname=»«, magic=»«, version=»«, uname=»«, gname=»«, devmajor=»«, devminor=»«, prefix=»«} 0x026600…028b36 ⟦10bf48aa3⟧ 0x028b36…028c00 FilePadding[0xca] 0x028c00…028e00 TarEntry {name=»src/D.filt/libfilt.h«, mode=»444«, uid=»145«, gid=»1«, size=»2002«, mtime=»4456154032«, checksum=»7560«, flag=»«, linkname=»«, magic=»«, version=»«, uname=»«, gname=»«, devmajor=»«, devminor=»«, prefix=»«} 0x028e00…029202 ⟦e80932208⟧ 0x029202…029400 FilePadding[0x1fe] 0x029400…029600 TarEntry {name=»src/D.filt/lnfilter.c«, mode=»444«, uid=»145«, gid=»1«, size=»25541«, mtime=»4472103052«, checksum=»7774«, flag=»«, linkname=»«, magic=»«, version=»«, uname=»«, gname=»«, devmajor=»«, devminor=»«, prefix=»«} 0x029600…02c161 ⟦bf102acff⟧ 0x02c161…02c200 FilePadding[0x9f] 0x02c200…02c400 TarEntry {name=»src/D.filt/savescore.c«, mode=»444«, uid=»145«, gid=»1«, size=»3273«, mtime=»4456154033«, checksum=»10134«, flag=»«, linkname=»«, magic=»«, version=»«, uname=»«, gname=»«, devmajor=»«, devminor=»«, prefix=»«} 0x02c400…02cabb ⟦01a5f828b⟧ 0x02cabb…02cc00 FilePadding[0x145] 0x02cc00…02ce00 TarEntry {name=»src/D.filt/tofilter.c«, mode=»444«, uid=»145«, gid=»1«, size=»16502«, mtime=»4465765373«, checksum=»10030«, flag=»«, linkname=»«, magic=»«, version=»«, uname=»«, gname=»«, devmajor=»«, devminor=»«, prefix=»«} 0x02ce00…02eb42 ⟦e5e296d3e⟧ 0x02eb42…02ec00 FilePadding[0xbe] 0x02ec00…02ee00 TarEntry {name=»src/D.filt/transact.c«, mode=»444«, uid=»145«, gid=»1«, size=»6670«, mtime=»4456154033«, checksum=»7765«, flag=»«, linkname=»«, magic=»«, version=»«, uname=»«, gname=»«, devmajor=»«, devminor=»«, prefix=»«} 0x02ee00…02fbb8 ⟦a7e539230⟧ 0x02fbb8…02fc00 FilePadding[0x48] 0x02fc00…02fe00 TarEntry {name=»src/D.filt/transact.h«, mode=»444«, uid=»145«, gid=»1«, size=»513«, mtime=»4456154032«, checksum=»7737«, flag=»«, linkname=»«, magic=»«, version=»«, uname=»«, gname=»«, devmajor=»«, devminor=»«, prefix=»«} 0x02fe00…02ff4b ⟦3f020df56⟧ 0x02ff4b…030000 FilePadding[0xb5] 0x030000…030200 TarEntry {name=»src/D.network/Makefile.dst«, mode=»444«, uid=»145«, gid=»1«, size=»4310«, mtime=»4476235701«, checksum=»10757«, flag=»«, linkname=»«, magic=»«, version=»«, uname=»«, gname=»«, devmajor=»«, devminor=»«, prefix=»«} 0x030200…030ac8 ⟦2ba98f2c4⟧ 0x030ac8…030c00 FilePadding[0x138] 0x030c00…030e00 TarEntry {name=»src/D.network/nntp.h«, mode=»444«, uid=»145«, gid=»1«, size=»5401«, mtime=»4456154035«, checksum=»7656«, flag=»«, linkname=»«, magic=»«, version=»«, uname=»«, gname=»«, devmajor=»«, devminor=»«, prefix=»«} 0x030e00…031901 ⟦c8622d2ca⟧ 0x031901…031a00 FilePadding[0xff] 0x031a00…031c00 TarEntry {name=»src/D.network/nntpclient.c«, mode=»444«, uid=»145«, gid=»1«, size=»17572«, mtime=»4456154036«, checksum=»11105«, flag=»«, linkname=»«, magic=»«, version=»«, uname=»«, gname=»«, devmajor=»«, devminor=»«, prefix=»«} 0x031c00…033b7a ⟦137e59254⟧ 0x033b7a…033c00 FilePadding[0x86] 0x033c00…033e00 TarEntry {name=»src/D.network/nntppost.c«, mode=»444«, uid=»145«, gid=»1«, size=»4257«, mtime=»4456154036«, checksum=»10570«, flag=»«, linkname=»«, magic=»«, version=»«, uname=»«, gname=»«, devmajor=»«, devminor=»«, prefix=»«} 0x033e00…0346af ⟦b44159a02⟧ 0x0346af…034800 FilePadding[0x151] 0x034800…034a00 TarEntry {name=»src/D.network/nntpread.c«, mode=»444«, uid=»145«, gid=»1«, size=»14275«, mtime=»4456154036«, checksum=»10537«, flag=»«, linkname=»«, magic=»«, version=»«, uname=»«, gname=»«, devmajor=»«, devminor=»«, prefix=»«} 0x034a00…0362bd ⟦5d116f8fa⟧ 0x0362bd…036400 FilePadding[0x143] 0x036400…036600 TarEntry {name=»src/D.news/Makefile.dst«, mode=»444«, uid=»145«, gid=»1«, size=»5746«, mtime=»4476236213«, checksum=»10257«, flag=»«, linkname=»«, magic=»«, version=»«, uname=»«, gname=»«, devmajor=»«, devminor=»«, prefix=»«} 0x036600…0371e6 ⟦099dad68e⟧ 0x0371e6…037200 FilePadding[0x1a] 0x037200…037400 TarEntry {name=»src/D.news/active.h«, mode=»444«, uid=»145«, gid=»1«, size=»15124«, mtime=»4456154040«, checksum=»7454«, flag=»«, linkname=»«, magic=»«, version=»«, uname=»«, gname=»«, devmajor=»«, devminor=»«, prefix=»«} 0x037400…038e54 ⟦a46ba6f29⟧ 0x038e54…039000 FilePadding[0x1ac] 0x039000…039200 TarEntry {name=»src/D.news/articleid.c«, mode=»444«, uid=»145«, gid=»1«, size=»21531«, mtime=»4457242304«, checksum=»10135«, flag=»«, linkname=»«, magic=»«, version=»«, uname=»«, gname=»«, devmajor=»«, devminor=»«, prefix=»«} 0x039200…03b559 ⟦408ced115⟧ 0x03b559…03b600 FilePadding[0xa7] 0x03b600…03b800 TarEntry {name=»src/D.news/artlist.c«, mode=»444«, uid=»145«, gid=»1«, size=»11135«, mtime=»4457222033«, checksum=»7653«, flag=»«, linkname=»«, magic=»«, version=»«, uname=»«, gname=»«, devmajor=»«, devminor=»«, prefix=»«} 0x03b800…03ca5d ⟦c2b90fdc6⟧ 0x03ca5d…03cc00 FilePadding[0x1a3] 0x03cc00…03ce00 TarEntry {name=»src/D.news/escapes.c«, mode=»444«, uid=»145«, gid=»1«, size=»26155«, mtime=»4461176426«, checksum=»7635«, flag=»«, linkname=»«, magic=»«, version=»«, uname=»«, gname=»«, devmajor=»«, devminor=»«, prefix=»«} 0x03ce00…03fa6d ⟦3ceea6706⟧ 0x03fa6d…03fc00 FilePadding[0x193] 0x03fc00…03fe00 TarEntry {name=»src/D.news/fascist.c«, mode=»444«, uid=»145«, gid=»1«, size=»21766«, mtime=»4456154041«, checksum=»7642«, flag=»«, linkname=»«, magic=»«, version=»«, uname=»«, gname=»«, devmajor=»«, devminor=»«, prefix=»«} 0x03fe00…0421f6 ⟦f44fbf15e⟧ 0x0421f6…042200 FilePadding[0xa] 0x042200…042400 TarEntry {name=»src/D.news/fascist.h«, mode=»444«, uid=»145«, gid=»1«, size=»1026«, mtime=»4456154037«, checksum=»7617«, flag=»«, linkname=»«, magic=»«, version=»«, uname=»«, gname=»«, devmajor=»«, devminor=»«, prefix=»«} 0x042400…042616 ⟦3d476eb28⟧ 0x042616…042800 FilePadding[0x1ea] 0x042800…042a00 TarEntry {name=»src/D.news/feeds.c«, mode=»444«, uid=»145«, gid=»1«, size=»17457«, mtime=»4465305476«, checksum=»7310«, flag=»«, linkname=»«, magic=»«, version=»«, uname=»«, gname=»«, devmajor=»«, devminor=»«, prefix=»«} 0x042a00…04492f ⟦06d87a119⟧ 0x04492f…044a00 FilePadding[0xd1] 0x044a00…044c00 TarEntry {name=»src/D.news/feeds.h«, mode=»444«, uid=»145«, gid=»1«, size=»3253«, mtime=»4456154040«, checksum=»7247«, flag=»«, linkname=»«, magic=»«, version=»«, uname=»«, gname=»«, devmajor=»«, devminor=»«, prefix=»«} 0x044c00…0452ab ⟦bc834da1a⟧ 0x0452ab…045400 FilePadding[0x155] 0x045400…045600 TarEntry {name=»src/D.news/getfiles.c«, mode=»444«, uid=»145«, gid=»1«, size=»3514«, mtime=»4465305447«, checksum=»7767«, flag=»«, linkname=»«, magic=»«, version=»«, uname=»«, gname=»«, devmajor=»«, devminor=»«, prefix=»«} 0x045600…045d4c ⟦2459fac87⟧ 0x045d4c…045e00 FilePadding[0xb4] 0x045e00…046000 TarEntry {name=»src/D.news/rdhistory.c«, mode=»444«, uid=»145«, gid=»1«, size=»23366«, mtime=»4474764617«, checksum=»10253«, flag=»«, linkname=»«, magic=»«, version=»«, uname=»«, gname=»«, devmajor=»«, devminor=»«, prefix=»«} 0x046000…0486f6 ⟦2212bbfde⟧ 0x0486f6…048800 FilePadding[0x10a] 0x048800…048a00 TarEntry {name=»src/D.news/header.h«, mode=»444«, uid=»145«, gid=»1«, size=»5214«, mtime=»4456154041«, checksum=»7411«, flag=»«, linkname=»«, magic=»«, version=»«, uname=»«, gname=»«, devmajor=»«, devminor=»«, prefix=»«} 0x048a00…04948c ⟦676258d2d⟧ 0x04948c…049600 FilePadding[0x174] 0x049600…049800 TarEntry {name=»src/D.news/history.h«, mode=»444«, uid=»145«, gid=»1«, size=»5453«, mtime=»4456154042«, checksum=»7670«, flag=»«, linkname=»«, magic=»«, version=»«, uname=»«, gname=»«, devmajor=»«, devminor=»«, prefix=»«} 0x049800…04a32b ⟦ad3f91751⟧ 0x04a32b…04a400 FilePadding[0xd5] 0x04a400…04a600 TarEntry {name=»src/D.news/mailbox.c«, mode=»444«, uid=»145«, gid=»1«, size=»7421«, mtime=»4456154042«, checksum=»7612«, flag=»«, linkname=»«, magic=»«, version=»«, uname=»«, gname=»«, devmajor=»«, devminor=»«, prefix=»«} 0x04a600…04b511 ⟦f1abf3688⟧ 0x04b511…04b600 FilePadding[0xef] 0x04b600…04b800 TarEntry {name=»src/D.news/mailbox.h«, mode=»444«, uid=»145«, gid=»1«, size=»1660«, mtime=»4456154042«, checksum=»7616«, flag=»«, linkname=»«, magic=»«, version=»«, uname=»«, gname=»«, devmajor=»«, devminor=»«, prefix=»«} 0x04b800…04bbb0 ⟦125c7cc25⟧ 0x04bbb0…04bc00 FilePadding[0x50] 0x04bc00…04be00 TarEntry {name=»src/D.news/msgopen.c«, mode=»444«, uid=»145«, gid=»1«, size=»4332«, mtime=»4456154042«, checksum=»7625«, flag=»«, linkname=»«, magic=»«, version=»«, uname=»«, gname=»«, devmajor=»«, devminor=»«, prefix=»«} 0x04be00…04c6da ⟦d74320f90⟧ 0x04c6da…04c800 FilePadding[0x126] 0x04c800…04ca00 TarEntry {name=»src/D.news/myorg.c«, mode=»444«, uid=»145«, gid=»1«, size=»6143«, mtime=»4457262005«, checksum=»7314«, flag=»«, linkname=»«, magic=»«, version=»«, uname=»«, gname=»«, devmajor=»«, devminor=»«, prefix=»«} 0x04ca00…04d663 ⟦398253fdf⟧ 0x04d663…04d800 FilePadding[0x19d] 0x04d800…04da00 TarEntry {name=»src/D.news/news.h«, mode=»444«, uid=»145«, gid=»1«, size=»13443«, mtime=»4465305462«, checksum=»7165«, flag=»«, linkname=»«, magic=»«, version=»«, uname=»«, gname=»«, devmajor=»«, devminor=»«, prefix=»«} 0x04da00…04f123 ⟦a7c020198⟧ 0x04f123…04f200 FilePadding[0xdd] 0x04f200…09e600 Dump { 0x04f200…09e600 69 6e 69 74 2e 63 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆init.c ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆ ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 20 20 20 34 34 34 20 00 20 20 20 ┆ 444 ┆ 0x04f200…09e600 31 34 35 20 00 20 20 20 20 20 31 20 00 20 20 20 20 20 20 20 37 37 35 33 20 20 34 34 37 32 36 31 ┆145 1 7753 447261┆ 0x04f200…09e600 33 30 34 33 20 20 31 30 30 32 36 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆3043 10026 ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆ ┆ […0x9…] 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆ /**************┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆********************************┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 0a ┆****************************** ┆ 0x04f200…09e600 4e 41 4d 45 0a 20 20 20 6e 65 77 73 69 6e 69 74 2e 63 20 2d 2d 20 69 6e 69 74 69 61 6c 69 7a 61 ┆NAME newsinit.c -- initializa┆ 0x04f200…09e600 74 69 6f 6e 20 61 6e 64 20 6c 65 61 73 74 2d 63 6f 6d 6d 6f 6e 2d 64 65 6e 6f 6d 69 6e 61 74 6f ┆tion and least-common-denominato┆ 0x04f200…09e600 72 20 63 6f 64 65 0a 0a 53 59 4e 4f 50 53 49 53 0a 20 20 20 76 6f 69 64 20 6e 65 77 73 69 6e 69 ┆r code SYNOPSIS void newsini┆ 0x04f200…09e600 74 28 29 20 20 09 09 09 2d 2d 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 75 6e 69 76 65 72 ┆t() -- initialize the univer┆ 0x04f200…09e600 73 65 0a 0a 20 20 20 63 68 61 72 20 2a 6e 65 77 73 61 74 74 72 28 6b 65 79 2c 20 64 65 66 61 75 ┆se char *newsattr(key, defau┆ 0x04f200…09e600 6c 74 29 09 09 2d 2d 20 67 65 74 20 6e 65 77 73 20 73 79 73 74 65 6d 20 61 74 74 72 69 62 75 74 ┆lt) -- get news system attribut┆ 0x04f200…09e600 65 73 0a 20 20 20 63 68 61 72 20 2a 6b 65 79 2c 20 64 65 66 61 75 6c 74 3b 0a 0a 44 45 53 43 52 ┆es char *key, default; DESCR┆ 0x04f200…09e600 49 50 54 49 4f 4e 0a 20 20 20 54 68 65 20 6e 65 77 73 69 6e 69 74 28 29 20 66 75 6e 63 74 69 6f ┆IPTION The newsinit() functio┆ 0x04f200…09e600 6e 20 69 6e 69 74 69 61 6c 69 7a 65 73 20 74 68 65 20 73 74 72 69 6e 67 73 20 75 73 65 64 20 66 ┆n initializes the strings used f┆ 0x04f200…09e600 6f 72 20 55 53 45 4e 45 54 0a 66 69 6c 65 6e 61 6d 65 73 2e 20 54 68 65 20 6e 65 77 73 61 74 74 ┆or USENET filenames. The newsatt┆ 0x04f200…09e600 72 28 29 20 66 75 6e 63 74 69 6f 6e 73 20 65 6e 61 62 6c 65 73 20 6f 74 68 65 72 20 6d 6f 64 75 ┆r() functions enables other modu┆ 0x04f200…09e600 6c 65 73 20 74 6f 20 67 65 74 20 61 74 20 74 68 65 6d 2e 0a 0a 52 45 56 49 53 45 44 20 42 59 0a ┆les to get at them. REVISED BY ┆ 0x04f200…09e600 20 20 20 45 72 69 63 20 53 2e 20 52 61 79 6d 6f 6e 64 0a 20 20 20 54 68 69 73 20 73 6f 66 74 77 ┆ Eric S. Raymond This softw┆ 0x04f200…09e600 61 72 65 20 69 73 20 43 6f 70 79 72 69 67 68 74 20 28 43 29 20 31 39 38 39 20 62 79 20 45 72 69 ┆are is Copyright (C) 1989 by Eri┆ 0x04f200…09e600 63 20 53 2e 20 52 61 79 6d 6f 6e 64 20 66 6f 72 20 74 68 65 20 73 6f 6c 65 20 70 75 72 70 6f 73 ┆c S. Raymond for the sole purpos┆ 0x04f200…09e600 65 0a 6f 66 20 70 72 6f 74 65 63 74 69 6e 67 20 66 72 65 65 20 72 65 64 69 73 74 72 69 62 75 74 ┆e of protecting free redistribut┆ 0x04f200…09e600 69 6f 6e 3b 20 73 65 65 20 74 68 65 20 4c 49 43 45 4e 53 45 20 66 69 6c 65 20 66 6f 72 20 64 65 ┆ion; see the LICENSE file for de┆ 0x04f200…09e600 74 61 69 6c 73 2e 0a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆tails. ************************┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆********************************┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 4c 49 4e 54 4c 49 42 ┆*********************/ /*LINTLIB┆ 0x04f200…09e600 52 41 52 59 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 6e 65 77 73 2e 68 22 0a 23 69 6e 63 6c 75 64 ┆RARY*/ #include "news.h" #includ┆ 0x04f200…09e600 65 20 22 68 65 61 64 65 72 2e 68 22 0a 23 69 66 64 65 66 20 52 55 4e 54 49 4d 45 0a 23 69 6e 63 ┆e "header.h" #ifdef RUNTIME #inc┆ 0x04f200…09e600 6c 75 64 65 20 22 64 62 61 6c 6c 6f 63 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 61 6c 69 73 74 ┆lude "dballoc.h" #include "alist┆ 0x04f200…09e600 2e 68 22 0a 23 65 6e 64 69 66 20 2f 2a 20 52 55 4e 54 49 4d 45 20 2a 2f 0a 0a 69 6e 74 09 73 69 ┆.h" #endif /* RUNTIME */ int si┆ 0x04f200…09e600 67 63 61 75 67 68 74 3b 09 09 2f 2a 20 68 6f 6c 64 20 6e 75 6d 62 65 72 20 6f 66 20 6c 61 73 74 ┆gcaught; /* hold number of last┆ 0x04f200…09e600 20 73 69 67 6e 61 6c 09 2a 2f 0a 69 6e 74 09 75 69 64 2c 20 67 69 64 3b 09 09 2f 2a 20 72 65 61 ┆ signal */ int uid, gid; /* rea┆ 0x04f200…09e600 6c 20 75 73 65 72 2f 67 72 6f 75 70 20 49 2e 44 2e 09 09 2a 2f 0a 69 6e 74 09 64 75 69 64 2c 20 ┆l user/group I.D. */ int duid, ┆ 0x04f200…09e600 64 67 69 64 3b 09 09 2f 2a 20 65 66 66 65 63 74 69 76 65 20 75 73 65 72 2f 67 72 6f 75 70 20 49 ┆dgid; /* effective user/group I┆ 0x04f200…09e600 2e 44 2e 09 2a 2f 0a 63 68 61 72 09 62 66 72 5b 4c 42 55 46 4c 45 4e 5d 3b 09 09 2f 2a 20 67 65 ┆.D. */ char bfr[LBUFLEN]; /* ge┆ 0x04f200…09e600 6e 65 72 61 6c 2d 75 73 65 20 73 63 72 61 74 63 68 20 62 75 66 66 65 72 09 2a 2f 0a 63 68 61 72 ┆neral-use scratch buffer */ char┆ 0x04f200…09e600 09 2a 75 73 65 72 6e 61 6d 65 2c 20 2a 75 73 65 72 68 6f 6d 65 3b 09 2f 2a 20 64 61 74 61 20 6f ┆ *username, *userhome; /* data o┆ 0x04f200…09e600 6e 20 74 68 65 20 65 78 65 63 75 74 69 6e 67 20 75 73 65 72 09 2a 2f 0a 62 6f 6f 6c 09 70 72 69 ┆n the executing user */ bool pri┆ 0x04f200…09e600 76 69 6c 65 67 65 64 3b 09 09 2f 2a 20 61 72 65 20 77 65 20 74 68 65 20 61 64 6d 69 6e 69 73 74 ┆vileged; /* are we the administ┆ 0x04f200…09e600 72 61 74 6f 72 3f 09 2a 2f 0a 73 69 74 65 62 6c 6b 09 73 69 74 65 3b 09 09 09 2f 2a 20 73 69 74 ┆rator? */ siteblk site; /* sit┆ 0x04f200…09e600 65 20 70 61 72 61 6d 65 74 65 72 20 6c 69 73 74 09 09 2a 2f 0a 69 6e 74 09 76 65 72 62 6f 73 65 ┆e parameter list */ int verbose┆ 0x04f200…09e600 3b 09 09 2f 2a 20 2d 76 20 6f 70 74 69 6f 6e 20 76 65 72 62 6f 73 69 74 79 20 6c 65 76 65 6c 09 ┆; /* -v option verbosity level ┆ 0x04f200…09e600 2a 2f 0a 23 69 66 64 65 66 20 44 45 42 55 47 0a 69 6e 74 09 64 65 62 75 67 3b 09 09 09 2f 2a 20 ┆*/ #ifdef DEBUG int debug; /* ┆ 0x04f200…09e600 2d 44 20 6f 70 74 69 6f 6e 73 27 20 64 65 62 75 67 20 73 77 69 74 63 68 09 2a 2f 0a 23 65 6e 64 ┆-D options' debug switch */ #end┆ 0x04f200…09e600 69 66 20 2f 2a 20 44 45 42 55 47 20 2a 2f 0a 23 69 66 64 65 66 20 52 55 4e 54 49 4d 45 0a 41 4c ┆if /* DEBUG */ #ifdef RUNTIME AL┆ 0x04f200…09e600 49 53 54 28 61 74 74 72 69 62 75 74 65 73 2c 20 32 30 2c 20 31 30 29 09 2f 2a 20 6e 65 77 73 20 ┆IST(attributes, 20, 10) /* news ┆ 0x04f200…09e600 73 79 73 74 65 6d 20 61 74 74 72 69 62 75 74 65 73 20 6c 69 73 74 09 2a 2f 0a 23 65 6e 64 69 66 ┆system attributes list */ #endif┆ 0x04f200…09e600 20 2f 2a 20 52 55 4e 54 49 4d 45 20 2a 2f 0a 0a 23 69 66 64 65 66 20 6c 69 6e 74 0a 2f 2a 20 77 ┆ /* RUNTIME */ #ifdef lint /* w┆ 0x04f200…09e600 65 20 64 6f 20 74 68 69 73 20 74 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 69 6e 63 6c 75 64 65 ┆e do this to not have to include┆ 0x04f200…09e600 20 59 41 43 43 2d 67 65 6e 65 72 61 74 65 64 20 63 6f 64 65 20 66 72 6f 6d 20 67 65 74 64 61 74 ┆ YACC-generated code from getdat┆ 0x04f200…09e600 65 2e 63 20 2a 2f 0a 2f 2a 41 52 47 53 55 53 45 44 31 2a 2f 0a 74 69 6d 65 5f 74 20 67 65 74 64 ┆e.c */ /*ARGSUSED1*/ time_t getd┆ 0x04f200…09e600 61 74 65 28 70 2c 20 6e 6f 77 29 20 63 68 61 72 20 2a 70 3b 20 73 74 72 75 63 74 20 74 69 6d 65 ┆ate(p, now) char *p; struct time┆ 0x04f200…09e600 62 20 2a 6e 6f 77 3b 20 7b 72 65 74 75 72 6e 28 28 74 69 6d 65 5f 74 29 70 5b 30 5d 29 3b 7d 0a ┆b *now; {return((time_t)p[0]);} ┆ 0x04f200…09e600 23 65 6e 64 69 66 20 2f 2a 20 6c 69 6e 74 20 2a 2f 0a 0a 23 69 66 64 65 66 20 52 55 4e 54 49 4d ┆#endif /* lint */ #ifdef RUNTIM┆ 0x04f200…09e600 45 0a 63 68 61 72 20 2a 6e 65 77 73 61 74 74 72 28 6b 65 79 2c 20 76 64 65 66 61 75 6c 74 29 0a ┆E char *newsattr(key, vdefault) ┆ 0x04f200…09e600 63 68 61 72 09 2a 6b 65 79 3b 09 09 2f 2a 20 74 68 65 20 6b 65 79 77 6f 72 64 20 74 6f 20 6c 6f ┆char *key; /* the keyword to lo┆ 0x04f200…09e600 6f 6b 20 66 6f 72 20 2a 2f 0a 63 68 61 72 09 2a 76 64 65 66 61 75 6c 74 3b 09 2f 2a 20 76 61 6c ┆ok for */ char *vdefault; /* val┆ 0x04f200…09e600 75 65 20 74 6f 20 75 73 65 20 69 66 20 77 65 20 64 6f 6e 27 74 20 66 69 6e 64 20 69 74 20 2a 2f ┆ue to use if we don't find it */┆ 0x04f200…09e600 0a 7b 0a 20 20 20 20 63 68 61 72 09 2a 76 61 6c 75 65 3b 0a 0a 20 20 20 20 69 66 20 28 61 74 74 ┆ { char *value; if (att┆ 0x04f200…09e600 72 69 62 75 74 65 73 2e 6e 65 78 74 66 72 65 65 0a 09 09 26 26 20 28 76 61 6c 75 65 20 3d 20 61 ┆ributes.nextfree && (value = a┆ 0x04f200…09e600 66 69 6e 64 28 26 61 74 74 72 69 62 75 74 65 73 2c 20 6b 65 79 29 29 20 21 3d 20 28 63 68 61 72 ┆find(&attributes, key)) != (char┆ 0x04f200…09e600 2a 29 4e 55 4c 4c 0a 09 09 26 26 20 76 61 6c 75 65 5b 30 5d 20 21 3d 20 27 5c 30 27 29 0a 09 72 ┆*)NULL && value[0] != '\0') r┆ 0x04f200…09e600 65 74 75 72 6e 28 76 61 6c 75 65 29 3b 0a 20 20 20 20 65 6c 73 65 0a 09 72 65 74 75 72 6e 28 76 ┆eturn(value); else return(v┆ 0x04f200…09e600 64 65 66 61 75 6c 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 52 55 4e 54 49 4d 45 20 2a 2f ┆default); } #endif /* RUNTIME */┆ 0x04f200…09e600 0a 0a 76 6f 69 64 20 6e 65 77 73 69 6e 69 74 28 29 0a 2f 2a 20 69 6e 69 74 69 61 6c 69 7a 65 20 ┆ void newsinit() /* initialize ┆ 0x04f200…09e600 6e 65 74 6e 65 77 73 20 61 63 63 65 73 73 20 74 6f 20 74 68 65 20 6d 6f 73 74 20 67 6c 6f 62 61 ┆netnews access to the most globa┆ 0x04f200…09e600 6c 20 74 68 69 6e 67 73 20 2a 2f 0a 7b 0a 20 20 20 20 73 74 72 75 63 74 20 70 61 73 73 77 64 09 ┆l things */ { struct passwd ┆ 0x04f200…09e600 20 20 20 20 2a 70 77 3b 09 2f 2a 20 73 74 72 75 63 74 20 66 6f 72 20 70 77 20 6c 6f 6f 6b 75 70 ┆ *pw; /* struct for pw lookup┆ 0x04f200…09e600 20 2a 2f 0a 20 20 20 20 73 74 61 74 69 63 20 73 74 72 75 63 74 20 75 74 73 6e 61 6d 65 20 20 20 ┆ */ static struct utsname ┆ 0x04f200…09e600 75 62 75 66 3b 09 2f 2a 20 66 6f 72 20 67 65 74 74 69 6e 67 20 6f 75 72 20 6e 6f 64 65 20 6e 61 ┆ubuf; /* for getting our node na┆ 0x04f200…09e600 6d 65 20 2a 2f 0a 0a 20 20 20 20 75 69 64 20 3d 20 67 65 74 75 69 64 28 29 3b 0a 20 20 20 20 67 ┆me */ uid = getuid(); g┆ 0x04f200…09e600 69 64 20 3d 20 67 65 74 67 69 64 28 29 3b 0a 20 20 20 20 64 75 69 64 20 3d 20 67 65 74 65 75 69 ┆id = getgid(); duid = geteui┆ 0x04f200…09e600 64 28 29 3b 0a 20 20 20 20 64 67 69 64 20 3d 20 67 65 74 65 67 69 64 28 29 3b 0a 0a 23 69 66 64 ┆d(); dgid = getegid(); #ifd┆ 0x04f200…09e600 65 66 20 55 4e 49 58 50 43 0a 20 20 20 20 74 7a 73 65 74 28 29 3b 09 2f 2a 20 66 69 78 65 73 20 ┆ef UNIXPC tzset(); /* fixes ┆ 0x04f200…09e600 61 20 63 72 6f 63 6b 20 69 6e 20 74 68 65 20 37 33 30 30 2f 33 42 31 20 73 68 61 72 65 64 20 6c ┆a crock in the 7300/3B1 shared l┆ 0x04f200…09e600 69 62 72 61 72 69 65 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 67 65 74 20 73 ┆ibraries */ #endif /* get s┆ 0x04f200…09e600 79 73 74 65 6d 20 6e 61 6d 65 3b 20 65 78 70 69 72 65 20 61 6e 64 20 70 6f 73 74 6e 65 77 73 20 ┆ystem name; expire and postnews ┆ 0x04f200…09e600 64 6f 6e 27 74 20 6e 65 65 64 20 74 68 69 73 2c 20 62 75 74 20 73 6f 20 77 68 61 74 20 2a 2f 0a ┆don't need this, but so what */ ┆ 0x04f200…09e600 23 69 66 6e 64 65 66 20 6c 69 6e 74 0a 20 20 20 20 28 76 6f 69 64 29 20 75 6e 61 6d 65 28 26 75 ┆#ifndef lint (void) uname(&u┆ 0x04f200…09e600 62 75 66 29 3b 09 20 20 20 20 2f 2a 20 67 72 72 72 2e 2e 2e 73 74 75 70 69 64 20 6c 69 6e 74 20 ┆buf); /* grrr...stupid lint ┆ 0x04f200…09e600 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 6c 69 6e 74 20 2a 2f 0a 0a 23 69 66 64 65 66 20 52 55 4e ┆*/ #endif /* lint */ #ifdef RUN┆ 0x04f200…09e600 54 49 4d 45 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 54 72 79 20 74 6f 20 72 65 61 64 20 61 ┆TIME /* * Try to read a┆ 0x04f200…09e600 20 72 75 6e 74 69 6d 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 66 69 6c 65 20 66 72 6f 6d ┆ runtime configuration file from┆ 0x04f200…09e600 20 74 68 65 20 6e 65 77 73 20 75 73 65 72 27 73 20 68 6f 6d 65 0a 20 20 20 20 20 2a 20 64 69 72 ┆ the news user's home * dir┆ 0x04f200…09e600 65 63 74 6f 72 79 2e 20 49 66 20 69 74 27 73 20 6e 6f 74 20 74 68 65 72 65 20 77 65 27 6c 6c 20 ┆ectory. If it's not there we'll ┆ 0x04f200…09e600 6a 75 73 74 20 75 73 65 20 63 6f 6d 70 69 6c 65 64 20 64 65 66 61 75 6c 74 73 2e 0a 20 20 20 20 ┆just use compiled defaults. ┆ 0x04f200…09e600 20 2a 2f 0a 20 20 20 20 69 66 20 28 28 70 77 20 3d 20 67 65 74 70 77 6e 61 6d 28 4e 45 57 53 55 ┆ */ if ((pw = getpwnam(NEWSU┆ 0x04f200…09e600 53 52 29 29 20 3d 3d 20 28 73 74 72 75 63 74 20 70 61 73 73 77 64 20 2a 29 4e 55 4c 4c 29 0a 09 ┆SR)) == (struct passwd *)NULL) ┆ 0x04f200…09e600 78 65 72 72 6f 72 30 28 22 43 61 6e 6e 6f 74 20 67 65 74 20 6e 65 77 73 20 75 73 65 72 27 73 20 ┆xerror0("Cannot get news user's ┆ 0x04f200…09e600 61 63 63 6f 75 6e 74 20 64 61 74 61 22 29 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 73 70 72 69 6e ┆account data"); (void) sprin┆ 0x04f200…09e600 74 66 28 62 66 72 2c 20 22 25 73 2f 61 74 74 72 69 62 75 74 65 73 22 2c 20 70 77 2d 3e 70 77 5f ┆tf(bfr, "%s/attributes", pw->pw_┆ 0x04f200…09e600 64 69 72 29 3b 0a 20 20 20 20 69 66 20 28 65 78 69 73 74 73 28 62 66 72 29 29 0a 20 20 20 20 7b ┆dir); if (exists(bfr)) {┆ 0x04f200…09e600 0a 09 61 74 74 72 69 62 75 74 65 73 2e 66 69 6c 65 20 3d 20 73 61 76 65 73 74 72 28 62 66 72 29 ┆ attributes.file = savestr(bfr)┆ 0x04f200…09e600 3b 0a 09 28 76 6f 69 64 29 20 64 62 61 72 65 61 64 28 26 61 74 74 72 69 62 75 74 65 73 29 3b 0a ┆; (void) dbaread(&attributes); ┆ 0x04f200…09e600 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 52 55 4e 54 49 4d 45 20 2a 2f 0a 0a 20 20 20 20 ┆ } #endif /* RUNTIME */ ┆ 0x04f200…09e600 2f 2a 20 61 6c 6c 20 74 6f 6f 6c 73 20 6e 65 65 64 20 74 6f 20 6b 6e 6f 77 20 74 68 65 20 66 6f ┆/* all tools need to know the fo┆ 0x04f200…09e600 6c 6c 6f 77 69 6e 67 20 74 68 69 6e 67 73 20 2a 2f 0a 20 20 20 20 73 69 74 65 2e 6e 6f 74 69 66 ┆llowing things */ site.notif┆ 0x04f200…09e600 79 20 3d 20 6e 65 77 73 61 74 74 72 28 22 6e 6f 74 69 66 79 22 2c 20 4e 4f 54 49 46 59 29 3b 0a ┆y = newsattr("notify", NOTIFY); ┆ 0x04f200…09e600 20 20 20 20 73 69 74 65 2e 6e 6f 64 65 6e 61 6d 65 20 3d 20 75 62 75 66 2e 6e 6f 64 65 6e 61 6d ┆ site.nodename = ubuf.nodenam┆ 0x04f200…09e600 65 3b 0a 20 20 20 20 73 69 74 65 2e 70 61 74 68 6e 61 6d 65 20 3d 20 6e 65 77 73 61 74 74 72 28 ┆e; site.pathname = newsattr(┆ 0x04f200…09e600 22 70 61 74 68 6e 61 6d 65 22 2c 20 50 41 54 48 4e 41 4d 45 29 3b 0a 20 20 20 20 73 69 74 65 2e ┆"pathname", PATHNAME); site.┆ 0x04f200…09e600 66 72 6f 6d 6e 61 6d 65 20 3d 20 6e 65 77 73 61 74 74 72 28 22 66 72 6f 6d 6e 61 6d 65 22 2c 20 ┆fromname = newsattr("fromname", ┆ 0x04f200…09e600 46 52 4f 4d 4e 41 4d 45 29 3b 0a 23 69 66 6e 64 65 66 20 52 55 4e 54 49 4d 45 0a 20 20 20 20 2f ┆FROMNAME); #ifndef RUNTIME /┆ 0x04f200…09e600 2a 20 73 74 72 69 6e 67 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 77 72 69 74 65 61 62 6c 65 2c 20 ┆* strings may not be writeable, ┆ 0x04f200…09e600 62 75 74 20 77 65 20 6e 65 65 64 20 74 6f 20 62 61 73 68 20 74 68 65 20 66 72 6f 6d 6e 61 6d 65 ┆but we need to bash the fromname┆ 0x04f200…09e600 20 2a 2f 0a 20 20 20 20 73 69 74 65 2e 66 72 6f 6d 6e 61 6d 65 20 3d 20 73 61 76 65 73 74 72 28 ┆ */ site.fromname = savestr(┆ 0x04f200…09e600 73 69 74 65 2e 66 72 6f 6d 6e 61 6d 65 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 52 55 4e 54 49 4d ┆site.fromname); #endif /* RUNTIM┆ 0x04f200…09e600 45 20 2a 2f 0a 20 20 20 20 6c 63 61 73 65 28 73 69 74 65 2e 66 72 6f 6d 6e 61 6d 65 29 3b 0a 20 ┆E */ lcase(site.fromname); ┆ 0x04f200…09e600 20 20 20 73 69 74 65 2e 74 72 75 65 6e 61 6d 65 20 3d 20 6e 65 77 73 61 74 74 72 28 22 74 72 75 ┆ site.truename = newsattr("tru┆ 0x04f200…09e600 65 6e 61 6d 65 22 2c 20 54 52 55 45 4e 41 4d 45 29 3b 0a 20 20 20 20 73 69 74 65 2e 73 6d 61 72 ┆ename", TRUENAME); site.smar┆ 0x04f200…09e600 74 68 6f 73 74 20 3d 20 6e 65 77 73 61 74 74 72 28 22 73 6d 61 72 74 2d 68 6f 73 74 22 2c 20 53 ┆thost = newsattr("smart-host", S┆ 0x04f200…09e600 4d 41 52 54 48 4f 53 54 29 3b 0a 20 20 20 20 73 69 74 65 2e 6c 69 62 64 69 72 20 3d 20 6e 65 77 ┆MARTHOST); site.libdir = new┆ 0x04f200…09e600 73 61 74 74 72 28 22 6c 69 62 64 69 72 22 2c 20 4c 49 42 44 49 52 29 3b 0a 20 20 20 20 73 69 74 ┆sattr("libdir", LIBDIR); sit┆ 0x04f200…09e600 65 2e 61 64 6d 64 69 72 20 3d 20 6e 65 77 73 61 74 74 72 28 22 61 64 6d 64 69 72 22 2c 20 41 44 ┆e.admdir = newsattr("admdir", AD┆ 0x04f200…09e600 4d 44 49 52 29 3b 0a 20 20 20 20 73 69 74 65 2e 6c 65 61 73 74 75 69 64 20 3d 20 6e 65 77 73 61 ┆MDIR); site.leastuid = newsa┆ 0x04f200…09e600 74 74 72 28 22 6c 65 61 73 74 75 69 64 22 2c 20 4c 45 41 53 54 55 49 44 29 3b 0a 23 69 66 64 65 ┆ttr("leastuid", LEASTUID); #ifde┆ 0x04f200…09e600 66 20 55 55 50 52 4f 47 0a 20 20 20 20 73 69 74 65 2e 75 75 70 72 6f 67 20 3d 20 6e 65 77 73 61 ┆f UUPROG site.uuprog = newsa┆ 0x04f200…09e600 74 74 72 28 22 75 75 70 72 6f 67 22 2c 20 55 55 50 52 4f 47 29 3b 0a 23 65 6c 73 65 0a 20 20 20 ┆ttr("uuprog", UUPROG); #else ┆ 0x04f200…09e600 20 73 69 74 65 2e 75 75 70 72 6f 67 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a 20 20 0a 20 ┆ site.uuprog = NULL; #endif ┆ 0x04f200…09e600 20 20 20 61 72 74 69 6e 69 74 28 29 3b 09 09 2f 2a 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 72 74 ┆ artinit(); /* initialize art┆ 0x04f200…09e600 69 63 6c 65 2d 66 65 74 63 68 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 ┆icle-fetch code */ /* ┆ 0x04f200…09e600 2a 20 67 65 74 20 74 68 65 20 6c 6f 77 2d 64 6f 77 6e 20 6f 6e 20 74 68 65 20 72 65 61 6c 20 75 ┆* get the low-down on the real u┆ 0x04f200…09e600 73 65 72 20 6f 66 20 74 68 69 73 20 70 72 6f 67 72 61 6d 0a 20 20 20 20 20 2a 20 66 6f 72 20 73 ┆ser of this program * for s┆ 0x04f200…09e600 65 63 75 72 69 74 79 2c 20 64 6f 6e 27 74 20 67 65 74 20 75 73 65 72 20 64 61 74 61 20 66 72 6f ┆ecurity, don't get user data fro┆ 0x04f200…09e600 6d 20 74 68 65 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 ┆m the environment */ if┆ 0x04f200…09e600 20 28 28 70 77 20 3d 20 67 65 74 70 77 75 69 64 28 75 69 64 29 29 20 3d 3d 20 28 73 74 72 75 63 ┆ ((pw = getpwuid(uid)) == (struc┆ 0x04f200…09e600 74 20 70 61 73 73 77 64 20 2a 29 4e 55 4c 4c 29 0a 09 78 65 72 72 6f 72 30 28 22 43 61 6e 6e 6f ┆t passwd *)NULL) xerror0("Canno┆ 0x04f200…09e600 74 20 67 65 74 20 75 73 65 72 27 73 20 6e 61 6d 65 22 29 3b 0a 20 20 20 20 75 73 65 72 6e 61 6d ┆t get user's name"); usernam┆ 0x04f200…09e600 65 20 3d 20 73 61 76 65 73 74 72 28 70 77 2d 3e 70 77 5f 6e 61 6d 65 29 3b 0a 20 20 20 20 75 73 ┆e = savestr(pw->pw_name); us┆ 0x04f200…09e600 65 72 68 6f 6d 65 20 3d 20 73 61 76 65 73 74 72 28 70 77 2d 3e 70 77 5f 64 69 72 29 3b 0a 7d 0a ┆erhome = savestr(pw->pw_dir); } ┆ 0x04f200…09e600 0a 2f 2a 20 6e 65 77 73 69 6e 69 74 2e 63 20 65 6e 64 73 20 68 65 72 65 20 2a 2f 0a 65 77 73 61 ┆ /* newsinit.c ends here */ ewsa┆ 0x04f200…09e600 74 74 72 28 22 6c 65 61 73 74 75 69 64 22 2c 20 4c 73 72 63 2f 44 2e 6e 65 77 73 2f 6e 67 6d 61 ┆ttr("leastuid", Lsrc/D.news/ngma┆ 0x04f200…09e600 74 63 68 2e 63 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆tch.c ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆ ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 20 20 20 34 34 34 20 00 20 20 20 ┆ 444 ┆ 0x04f200…09e600 31 34 35 20 00 20 20 20 20 20 31 20 00 20 20 20 20 20 20 31 32 36 35 37 20 20 34 34 36 35 33 30 ┆145 1 12657 446530┆ 0x04f200…09e600 35 34 35 34 20 20 20 37 36 33 34 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆5454 7634 ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆ ┆ […0x9…] 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆ /**************┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆********************************┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a ┆******************************* ┆ 0x04f200…09e600 0a 4e 41 4d 45 0a 20 20 20 6e 67 6d 61 74 63 68 20 2d 2d 20 6e 65 77 73 20 67 72 6f 75 70 20 6d ┆ NAME ngmatch -- news group m┆ 0x04f200…09e600 61 74 63 68 69 6e 67 0a 0a 53 59 4e 4f 50 53 49 53 0a 20 20 20 62 6f 6f 6c 20 6e 67 6d 61 74 63 ┆atching SYNOPSIS bool ngmatc┆ 0x04f200…09e600 68 28 6e 67 6c 69 73 74 2c 20 73 75 62 6c 69 73 74 29 09 2d 2d 20 6d 61 74 63 68 20 67 72 6f 75 ┆h(nglist, sublist) -- match grou┆ 0x04f200…09e600 70 73 20 61 67 61 69 6e 73 74 20 73 75 62 73 63 72 69 70 74 69 6f 6e 73 0a 20 20 20 72 65 67 69 ┆ps against subscriptions regi┆ 0x04f200…09e600 73 74 65 72 20 63 68 61 72 20 2a 6e 67 6c 69 73 74 2c 20 2a 73 75 62 6c 69 73 74 3b 0a 0a 44 45 ┆ster char *nglist, *sublist; DE┆ 0x04f200…09e600 53 43 52 49 50 54 49 4f 4e 0a 20 20 20 49 66 20 6e 67 6c 69 73 74 20 69 73 20 61 20 6c 69 73 74 ┆SCRIPTION If nglist is a list┆ 0x04f200…09e600 20 6f 66 20 6e 65 77 73 67 72 6f 75 70 73 2c 20 61 6e 64 20 73 75 62 6c 69 73 74 20 69 73 20 61 ┆ of newsgroups, and sublist is a┆ 0x04f200…09e600 20 6c 69 73 74 20 6f 66 20 73 75 62 73 63 72 69 70 74 69 6f 6e 73 2c 0a 74 68 65 6e 20 6e 67 6d ┆ list of subscriptions, then ngm┆ 0x04f200…09e600 61 74 63 68 28 6e 67 6c 69 73 74 2c 20 73 75 62 6c 69 73 74 29 20 77 69 6c 6c 20 72 65 74 75 72 ┆atch(nglist, sublist) will retur┆ 0x04f200…09e600 6e 20 54 52 55 45 20 69 66 20 73 6f 6d 65 20 6f 6e 65 20 6f 66 20 74 68 65 20 67 72 6f 75 70 73 ┆n TRUE if some one of the groups┆ 0x04f200…09e600 20 69 6e 0a 6e 67 6c 69 73 74 20 6d 61 74 63 68 65 73 20 61 20 73 75 62 73 63 72 69 70 74 69 6f ┆ in nglist matches a subscriptio┆ 0x04f200…09e600 6e 20 69 6e 20 73 75 62 6c 69 73 74 2e 20 54 68 65 20 73 75 62 6c 69 73 74 20 61 72 67 75 6d 65 ┆n in sublist. The sublist argume┆ 0x04f200…09e600 6e 74 20 6d 61 79 20 68 61 76 65 0a 77 69 6c 64 63 61 72 64 73 20 69 6e 20 69 74 20 6f 72 20 62 ┆nt may have wildcards in it or b┆ 0x04f200…09e600 65 20 70 72 65 66 69 78 65 64 20 62 79 20 61 20 21 20 28 73 65 65 20 62 65 6c 6f 77 29 2e 20 42 ┆e prefixed by a ! (see below). B┆ 0x04f200…09e600 72 61 63 65 73 20 7b 20 7d 20 6d 61 79 20 62 65 20 75 73 65 64 0a 74 6f 20 65 6e 63 6c 6f 73 65 ┆races { } may be used to enclose┆ 0x04f200…09e600 20 61 20 6c 69 73 74 20 6f 66 20 61 6c 74 65 72 6e 61 74 69 76 65 20 73 75 66 66 69 78 65 73 2e ┆ a list of alternative suffixes.┆ 0x04f200…09e600 20 41 6c 6c 20 6c 69 73 74 20 65 6c 65 6d 65 6e 74 73 20 61 72 65 20 4e 47 44 45 4c 49 4d 0a 73 ┆ All list elements are NGDELIM s┆ 0x04f200…09e600 65 70 61 72 61 74 65 64 2e 0a 0a 20 20 20 47 72 6f 75 70 20 6e 61 6d 65 73 20 63 6f 6e 73 69 73 ┆eparated. Group names consis┆ 0x04f200…09e600 74 20 6f 66 20 73 65 67 6d 65 6e 74 73 20 73 65 70 61 72 61 74 65 64 20 62 79 20 4e 47 53 45 50 ┆t of segments separated by NGSEP┆ 0x04f200…09e600 20 63 68 61 72 61 63 74 65 72 73 2e 20 49 6e 20 63 6f 6d 70 61 72 69 6e 67 0a 74 68 65 6d 2c 20 ┆ characters. In comparing them, ┆ 0x04f200…09e600 73 65 67 6d 65 6e 74 73 20 61 72 65 20 6d 61 74 63 68 65 64 20 6c 65 66 74 20 74 6f 20 72 69 67 ┆segments are matched left to rig┆ 0x04f200…09e600 68 74 20 75 6e 74 69 6c 20 73 6f 6d 65 74 68 69 6e 67 20 69 73 20 6e 6f 74 20 65 71 75 61 6c 20 ┆ht until something is not equal ┆ 0x04f200…09e600 6f 72 0a 6e 67 6d 61 74 63 68 28 29 20 72 75 6e 73 20 6f 75 74 20 6f 66 20 73 74 72 69 6e 67 20 ┆or ngmatch() runs out of string ┆ 0x04f200…09e600 6f 6e 20 6f 6e 65 20 6f 72 20 74 68 65 20 6f 74 68 65 72 2e 20 54 68 75 73 2c 20 69 66 20 73 75 ┆on one or the other. Thus, if su┆ 0x04f200…09e600 62 73 63 72 69 70 74 69 6f 6e 20 58 0a 6d 61 74 63 68 65 73 20 67 72 6f 75 70 20 47 2c 20 69 74 ┆bscription X matches group G, it┆ 0x04f200…09e600 20 61 6c 73 6f 20 6d 61 74 63 68 65 73 20 47 2e 61 6e 79 74 68 69 6e 67 20 67 72 6f 75 70 73 20 ┆ also matches G.anything groups ┆ 0x04f200…09e600 28 62 75 74 20 65 6d 70 74 79 20 73 74 72 69 6e 67 73 20 64 6f 6e 27 74 0a 6d 61 74 63 68 20 61 ┆(but empty strings don't match a┆ 0x04f200…09e600 6e 79 74 68 69 6e 67 29 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 69 6c 64 63 61 72 64 ┆nything). The following wildcard┆ 0x04f200…09e600 73 20 61 72 65 20 73 75 70 70 6f 72 74 65 64 3a 0a 0a 09 61 6e 79 20 20 2d 2d 20 6d 61 74 63 68 ┆s are supported: any -- match┆ 0x04f200…09e600 65 73 20 61 6e 79 20 73 65 67 6d 65 6e 74 0a 09 61 6c 6c 20 20 2d 2d 20 6d 61 74 63 68 65 73 20 ┆es any segment all -- matches ┆ 0x04f200…09e600 61 6e 79 20 73 65 71 75 65 6e 63 65 20 6f 66 20 73 65 67 6d 65 6e 74 73 0a 0a 54 68 75 73 20 27 ┆any sequence of segments Thus '┆ 0x04f200…09e600 61 6c 6c 2e 63 74 6c 27 20 6d 61 74 63 68 65 73 20 61 6e 79 20 67 72 6f 75 70 20 65 6e 64 69 6e ┆all.ctl' matches any group endin┆ 0x04f200…09e600 67 20 69 6e 20 27 63 74 6c 27 20 62 75 74 20 27 61 6e 79 2e 63 74 6c 27 20 6d 61 74 63 68 65 73 ┆g in 'ctl' but 'any.ctl' matches┆ 0x04f200…09e600 20 6f 6e 6c 79 0a 67 72 6f 75 70 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 27 66 6f 6f 2e 63 74 ┆ only groups of the form 'foo.ct┆ 0x04f200…09e600 6c 27 2e 0a 0a 20 20 20 41 20 73 75 62 73 63 72 69 70 74 69 6f 6e 20 70 61 72 74 20 70 72 65 66 ┆l'. A subscription part pref┆ 0x04f200…09e600 69 78 65 64 20 62 79 20 21 20 69 73 20 61 6e 20 65 78 63 6c 75 73 69 6f 6e 2e 20 49 66 20 61 20 ┆ixed by ! is an exclusion. If a ┆ 0x04f200…09e600 6e 65 77 73 67 72 6f 75 70 20 6d 61 74 63 68 65 73 0a 61 20 21 2d 73 75 62 73 63 72 69 70 74 69 ┆newsgroup matches a !-subscripti┆ 0x04f200…09e600 6f 6e 20 74 68 65 20 72 65 74 75 72 6e 20 6f 66 20 6e 67 6d 61 74 63 68 28 29 20 77 69 6c 6c 20 ┆on the return of ngmatch() will ┆ 0x04f200…09e600 62 65 20 46 41 4c 53 45 20 75 6e 6c 65 73 73 20 74 68 65 20 67 72 6f 75 70 0a 6d 61 74 63 68 65 ┆be FALSE unless the group matche┆ 0x04f200…09e600 73 20 73 6f 6d 65 20 6c 61 74 65 72 20 73 75 62 73 63 72 69 70 74 69 6f 6e 2e 20 54 68 75 73 20 ┆s some later subscription. Thus ┆ 0x04f200…09e600 66 6f 72 20 65 78 61 6d 70 6c 65 0a 0a 20 20 20 20 63 6f 6d 70 2e 75 6e 69 78 2e 73 6f 75 72 63 ┆for example comp.unix.sourc┆ 0x04f200…09e600 65 73 2c 21 63 6f 6d 70 2e 75 6e 69 78 2e 73 6f 75 72 63 65 73 2e 61 6c 6c 0a 0a 77 69 6c 6c 20 ┆es,!comp.unix.sources.all will ┆ 0x04f200…09e600 73 75 62 73 63 72 69 62 65 20 79 6f 75 20 74 6f 20 63 6f 6d 70 2e 75 6e 69 78 2e 73 6f 75 72 63 ┆subscribe you to comp.unix.sourc┆ 0x04f200…09e600 65 73 20 62 75 74 20 65 78 63 6c 75 64 65 20 63 6f 6d 70 2e 75 6e 69 78 2e 73 6f 75 72 63 65 73 ┆es but exclude comp.unix.sources┆ 0x04f200…09e600 2e 64 20 61 6e 64 0a 63 6f 6d 70 2e 75 6e 69 78 2e 73 6f 75 72 63 65 73 2e 77 61 6e 74 65 64 2e ┆.d and comp.unix.sources.wanted.┆ 0x04f200…09e600 0a 0a 20 20 20 41 20 63 6f 6d 70 6f 6e 65 6e 74 20 6c 69 73 74 20 65 6e 63 6c 6f 73 65 64 20 62 ┆ A component list enclosed b┆ 0x04f200…09e600 79 20 7b 20 7d 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 61 6c 74 65 72 6e 61 74 69 76 65 20 73 ┆y { } is a list of alternative s┆ 0x04f200…09e600 75 66 66 69 78 65 73 2e 20 46 6f 72 0a 65 78 61 6d 70 6c 65 0a 0a 20 20 20 20 63 6f 6d 70 2e 73 ┆uffixes. For example comp.s┆ 0x04f200…09e600 6f 75 72 63 65 73 2e 7b 75 6e 69 78 2c 6d 61 63 7d 20 3d 3d 20 63 6f 6d 70 2e 73 6f 75 72 63 65 ┆ources.{unix,mac} == comp.source┆ 0x04f200…09e600 73 2e 75 6e 69 78 2c 63 6f 6d 70 2e 73 6f 75 72 63 65 73 2e 6d 61 63 0a 0a 54 68 65 20 6e 65 67 ┆s.unix,comp.sources.mac The neg┆ 0x04f200…09e600 61 74 69 6f 6e 20 63 68 61 72 20 64 69 73 74 72 69 62 75 74 65 73 20 6f 76 65 72 20 61 6c 74 65 ┆ation char distributes over alte┆ 0x04f200…09e600 72 6e 61 74 69 6f 6e 2e 20 54 68 75 73 0a 0a 20 20 20 20 21 74 61 6c 6b 2e 7b 72 65 6c 69 67 69 ┆rnation. Thus !talk.{religi┆ 0x04f200…09e600 6f 6e 2c 70 6f 6c 69 74 69 63 73 7d 20 3d 3d 20 21 74 61 6c 6b 2e 70 6f 6c 69 74 69 63 73 2c 21 ┆on,politics} == !talk.politics,!┆ 0x04f200…09e600 74 61 6c 6b 2e 72 65 6c 69 67 69 6f 6e 0a 0a 54 68 65 20 7b 7d 20 63 6f 6e 73 74 72 75 63 74 20 ┆talk.religion The {} construct ┆ 0x04f200…09e600 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 72 65 63 75 72 73 69 6f 6e 2c 20 73 6f 20 ┆is implemented by recursion, so ┆ 0x04f200…09e600 69 74 20 77 69 6c 6c 20 65 76 65 6e 20 64 6f 20 72 65 61 73 6f 6e 61 62 6c 65 0a 74 68 69 6e 67 ┆it will even do reasonable thing┆ 0x04f200…09e600 73 20 77 69 74 68 20 6e 65 73 74 65 64 20 62 72 61 63 65 73 20 61 6e 64 20 21 20 69 6e 73 69 64 ┆s with nested braces and ! insid┆ 0x04f200…09e600 65 20 62 72 61 63 65 73 2e 20 42 65 20 77 61 72 6e 65 64 20 74 68 61 74 20 62 61 64 20 74 68 69 ┆e braces. Be warned that bad thi┆ 0x04f200…09e600 6e 67 73 20 77 69 6c 6c 0a 68 61 70 70 65 6e 20 69 66 20 79 6f 75 72 20 62 72 61 63 65 73 20 61 ┆ngs will happen if your braces a┆ 0x04f200…09e600 72 65 20 6e 6f 74 20 62 61 6c 61 6e 63 65 64 21 0a 0a 20 20 20 20 45 6d 62 65 64 64 65 64 20 77 ┆re not balanced! Embedded w┆ 0x04f200…09e600 68 69 74 65 73 70 61 63 65 20 28 69 6e 63 6c 75 64 69 6e 67 20 3c 4e 4c 3e 29 20 61 6e 64 20 62 ┆hitespace (including <NL>) and b┆ 0x04f200…09e600 61 63 6b 73 6c 61 73 68 65 73 20 61 72 65 20 62 6f 74 68 20 69 67 6e 6f 72 65 64 2e 0a 54 68 75 ┆ackslashes are both ignored. Thu┆ 0x04f200…09e600 73 2c 20 79 6f 75 20 63 61 6e 20 66 6f 72 6d 61 74 20 61 20 73 75 62 73 63 72 69 70 74 69 6f 6e ┆s, you can format a subscription┆ 0x04f200…09e600 20 73 74 72 69 6e 67 20 77 69 74 68 20 74 61 62 73 20 61 6e 64 20 5c 3c 4e 4c 3e 20 64 69 67 72 ┆ string with tabs and \<NL> digr┆ 0x04f200…09e600 61 70 68 73 0a 61 6e 64 20 69 74 20 77 69 6c 6c 20 73 74 69 6c 6c 20 62 65 20 69 6e 74 65 72 70 ┆aphs and it will still be interp┆ 0x04f200…09e600 72 65 74 65 64 20 70 72 6f 70 65 72 6c 79 2e 0a 0a 4e 4f 54 45 0a 20 20 20 54 68 65 20 27 61 6c ┆reted properly. NOTE The 'al┆ 0x04f200…09e600 6c 27 20 70 72 65 66 69 78 20 75 73 65 64 20 74 6f 20 6d 61 74 63 68 20 73 65 67 6d 65 6e 74 73 ┆l' prefix used to match segments┆ 0x04f200…09e600 20 6f 6e 6c 79 2e 20 54 68 65 20 63 68 61 6e 67 65 20 77 61 73 20 64 65 6c 69 62 65 72 61 74 65 ┆ only. The change was deliberate┆ 0x04f200…09e600 2c 0a 66 6f 72 20 32 20 72 65 61 73 6f 6e 73 3a 20 31 29 20 69 66 20 79 6f 75 20 75 73 65 64 20 ┆, for 2 reasons: 1) if you used ┆ 0x04f200…09e600 74 6f 20 73 75 62 73 63 72 69 62 65 20 74 6f 20 61 6c 6c 2e 66 6f 6f 20 79 6f 75 20 70 72 6f 62 ┆to subscribe to all.foo you prob┆ 0x04f200…09e600 61 62 6c 79 20 77 61 6e 74 0a 61 6c 6c 2e 66 6f 6f 20 69 6e 20 74 68 65 20 6e 65 77 2c 20 6d 6f ┆ably want all.foo in the new, mo┆ 0x04f200…09e600 72 65 20 64 65 65 70 6c 79 20 62 72 61 6e 63 68 65 64 20 6e 65 77 73 67 72 6f 75 70 20 68 69 65 ┆re deeply branched newsgroup hie┆ 0x04f200…09e600 72 61 72 63 68 79 2c 20 61 6e 64 20 32 29 20 74 68 65 0a 63 6f 6e 6e 6f 74 61 74 69 6f 6e 73 20 ┆rarchy, and 2) the connotations ┆ 0x04f200…09e600 6f 66 20 27 61 6e 79 27 20 61 6e 64 20 27 61 6c 6c 27 20 69 6e 20 45 6e 67 6c 69 73 68 20 66 69 ┆of 'any' and 'all' in English fi┆ 0x04f200…09e600 74 20 74 68 69 73 20 73 63 68 65 6d 65 20 62 65 74 74 65 72 2e 20 44 75 65 20 74 6f 0a 74 68 65 ┆t this scheme better. Due to the┆ 0x04f200…09e600 20 72 75 6c 65 20 74 68 61 74 20 27 58 20 6d 61 74 63 68 65 73 20 47 20 3c 3d 3e 20 58 20 6d 61 ┆ rule that 'X matches G <=> X ma┆ 0x04f200…09e600 74 63 68 65 73 20 47 2e 61 6e 79 74 68 69 6e 67 27 2c 20 66 6f 6f 2e 61 6e 79 20 61 6e 64 20 66 ┆tches G.anything', foo.any and f┆ 0x04f200…09e600 6f 6f 2e 61 6c 6c 0a 61 72 65 20 65 71 75 69 76 61 6c 65 6e 74 2e 0a 0a 52 45 56 49 53 45 44 20 ┆oo.all are equivalent. REVISED ┆ 0x04f200…09e600 42 59 0a 20 20 20 45 72 69 63 20 53 2e 20 52 61 79 6d 6f 6e 64 0a 20 20 20 54 68 69 73 20 73 6f ┆BY Eric S. Raymond This so┆ 0x04f200…09e600 66 74 77 61 72 65 20 69 73 20 43 6f 70 79 72 69 67 68 74 20 28 43 29 20 31 39 38 39 20 62 79 20 ┆ftware is Copyright (C) 1989 by ┆ 0x04f200…09e600 45 72 69 63 20 53 2e 20 52 61 79 6d 6f 6e 64 20 66 6f 72 20 74 68 65 20 73 6f 6c 65 20 70 75 72 ┆Eric S. Raymond for the sole pur┆ 0x04f200…09e600 70 6f 73 65 0a 6f 66 20 70 72 6f 74 65 63 74 69 6e 67 20 66 72 65 65 20 72 65 64 69 73 74 72 69 ┆pose of protecting free redistri┆ 0x04f200…09e600 62 75 74 69 6f 6e 3b 20 73 65 65 20 74 68 65 20 4c 49 43 45 4e 53 45 20 66 69 6c 65 20 66 6f 72 ┆bution; see the LICENSE file for┆ 0x04f200…09e600 20 64 65 74 61 69 6c 73 2e 0a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆ details. *********************┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆********************************┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 20 4c 49 4e ┆************************/ /* LIN┆ 0x04f200…09e600 54 4c 49 42 52 41 52 59 20 2a 2f 0a 0a 23 69 6e 63 6c 75 64 65 20 22 6e 65 77 73 2e 68 22 0a 0a ┆TLIBRARY */ #include "news.h" ┆ 0x04f200…09e600 23 64 65 66 69 6e 65 20 4f 50 45 4e 09 20 20 20 20 27 7b 27 09 20 20 20 20 2f 2a 20 73 74 61 72 ┆#define OPEN '{' /* star┆ 0x04f200…09e600 74 20 62 72 61 63 6b 65 74 20 66 6f 72 20 6e 65 77 73 20 73 75 62 73 63 72 69 70 74 69 6f 6e 73 ┆t bracket for news subscriptions┆ 0x04f200…09e600 20 2a 2f 0a 23 64 65 66 69 6e 65 20 43 4c 4f 53 45 09 20 20 20 20 27 7d 27 09 20 20 20 20 2f 2a ┆ */ #define CLOSE '}' /*┆ 0x04f200…09e600 20 65 6e 64 20 62 72 61 63 6b 65 74 20 66 6f 72 20 6e 65 77 73 20 73 75 62 73 63 72 69 70 74 69 ┆ end bracket for news subscripti┆ 0x04f200…09e600 6f 6e 73 20 2a 2f 0a 0a 23 64 65 66 69 6e 65 20 45 4e 44 5f 47 52 4f 55 50 28 63 29 09 28 63 20 ┆ons */ #define END_GROUP(c) (c ┆ 0x04f200…09e600 3d 3d 20 27 5c 30 27 20 7c 7c 20 63 20 3d 3d 20 4e 47 44 45 4c 49 4d 29 0a 23 64 65 66 69 6e 65 ┆== '\0' || c == NGDELIM) #define┆ 0x04f200…09e600 20 45 4e 44 5f 53 45 47 4d 45 4e 54 28 63 29 09 28 63 20 3d 3d 20 27 5c 30 27 20 7c 7c 20 63 20 ┆ END_SEGMENT(c) (c == '\0' || c ┆ 0x04f200…09e600 3d 3d 20 4e 47 44 45 4c 49 4d 20 7c 7c 20 63 20 3d 3d 20 4e 47 53 45 50 29 0a 23 64 65 66 69 6e ┆== NGDELIM || c == NGSEP) #defin┆ 0x04f200…09e600 65 20 53 4b 49 50 5f 53 45 47 4d 45 4e 54 28 6e 29 09 77 68 69 6c 65 20 28 21 45 4e 44 5f 53 45 ┆e SKIP_SEGMENT(n) while (!END_SE┆ 0x04f200…09e600 47 4d 45 4e 54 28 2a 6e 29 29 20 6e 2b 2b 0a 0a 62 6f 6f 6c 20 6e 67 6d 61 74 63 68 28 6e 67 6c ┆GMENT(*n)) n++ bool ngmatch(ngl┆ 0x04f200…09e600 69 73 74 2c 20 73 75 62 6c 69 73 74 29 0a 2f 2a 20 63 6f 6d 70 61 72 65 20 61 20 6c 69 73 74 20 ┆ist, sublist) /* compare a list ┆ 0x04f200…09e600 6f 66 20 6e 65 77 73 67 72 6f 75 70 73 20 61 67 61 69 6e 73 74 20 61 20 6c 69 73 74 20 6f 66 20 ┆of newsgroups against a list of ┆ 0x04f200…09e600 73 75 62 73 63 72 69 70 74 69 6f 6e 73 20 2a 2f 0a 72 65 67 69 73 74 65 72 20 63 68 61 72 20 2a ┆subscriptions */ register char *┆ 0x04f200…09e600 6e 67 6c 69 73 74 2c 20 2a 73 75 62 6c 69 73 74 3b 0a 7b 0a 20 20 20 20 72 65 67 69 73 74 65 72 ┆nglist, *sublist; { register┆ 0x04f200…09e600 20 63 68 61 72 20 20 2a 6e 2c 20 2a 73 2c 20 63 68 3b 0a 20 20 20 20 72 65 67 69 73 74 65 72 20 ┆ char *n, *s, ch; register ┆ 0x04f200…09e600 62 6f 6f 6c 20 20 20 72 63 3b 0a 20 20 20 20 66 6f 72 77 61 72 64 20 73 74 61 74 69 63 20 62 6f ┆bool rc; forward static bo┆ 0x04f200…09e600 6f 6c 20 6e 67 63 6d 70 28 29 3b 0a 0a 23 69 66 64 65 66 20 50 41 52 41 4e 4f 49 44 0a 20 20 20 ┆ol ngcmp(); #ifdef PARANOID ┆ 0x04f200…09e600 20 69 66 20 28 21 6e 67 6c 69 73 74 20 7c 7c 20 21 73 75 62 6c 69 73 74 29 0a 09 72 65 74 75 72 ┆ if (!nglist || !sublist) retur┆ 0x04f200…09e600 6e 28 46 41 4c 53 45 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 50 41 52 41 4e 4f 49 44 20 2a 2f 0a ┆n(FALSE); #endif /* PARANOID */ ┆ 0x04f200…09e600 0a 20 20 20 20 72 63 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 66 6f 72 20 28 6e 20 3d 20 6e 67 ┆ rc = FALSE; for (n = ng┆ 0x04f200…09e600 6c 69 73 74 3b 20 2a 6e 20 21 3d 20 27 5c 30 27 20 26 26 20 72 63 20 3d 3d 20 46 41 4c 53 45 3b ┆list; *n != '\0' && rc == FALSE;┆ 0x04f200…09e600 29 0a 20 20 20 20 7b 0a 09 69 66 20 28 69 73 73 70 61 63 65 28 2a 6e 29 20 7c 7c 20 2a 6e 20 3d ┆) { if (isspace(*n) || *n =┆ 0x04f200…09e600 3d 20 27 5c 5c 27 29 0a 09 7b 0a 09 20 20 20 20 6e 2b 2b 3b 0a 09 20 20 20 20 63 6f 6e 74 69 6e ┆= '\\') { n++; contin┆ 0x04f200…09e600 75 65 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 73 20 3d 20 73 75 62 6c 69 73 74 3b 20 2a 73 20 21 3d ┆ue; } for (s = sublist; *s !=┆ 0x04f200…09e600 20 27 5c 30 27 20 26 26 20 2a 73 20 21 3d 20 43 4c 4f 53 45 3b 29 0a 09 7b 0a 09 20 20 20 20 72 ┆ '\0' && *s != CLOSE;) { r┆ 0x04f200…09e600 65 67 69 73 74 65 72 20 69 6e 74 20 20 20 20 62 64 65 70 74 68 20 3d 20 30 3b 0a 0a 09 20 20 20 ┆egister int bdepth = 0; ┆ 0x04f200…09e600 20 69 66 20 28 69 73 73 70 61 63 65 28 2a 73 29 20 7c 7c 20 2a 73 20 3d 3d 20 27 5c 5c 27 29 0a ┆ if (isspace(*s) || *s == '\\') ┆ 0x04f200…09e600 09 20 20 20 20 7b 0a 09 09 73 2b 2b 3b 0a 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 20 20 20 20 7d ┆ { s++; continue; }┆ 0x04f200…09e600 0a 0a 09 20 20 20 20 2f 2a 20 6d 61 74 63 68 20 63 75 72 72 65 6e 74 20 67 72 6f 75 70 20 61 67 ┆ /* match current group ag┆ 0x04f200…09e600 61 69 6e 73 74 20 63 75 72 72 65 6e 74 20 73 75 62 73 63 72 69 70 74 69 6f 6e 20 70 61 72 74 20 ┆ainst current subscription part ┆ 0x04f200…09e600 2a 2f 0a 09 20 20 20 20 69 66 20 28 2a 73 20 21 3d 20 4e 45 47 43 48 41 52 29 0a 09 09 72 63 20 ┆*/ if (*s != NEGCHAR) rc ┆ 0x04f200…09e600 3d 20 72 63 20 7c 7c 20 6e 67 63 6d 70 28 6e 2c 20 73 29 3b 0a 09 20 20 20 20 65 6c 73 65 0a 09 ┆= rc || ngcmp(n, s); else ┆ 0x04f200…09e600 09 72 63 20 3d 20 72 63 20 26 26 20 21 6e 67 63 6d 70 28 6e 2c 20 73 20 2b 20 31 29 3b 0a 0a 09 ┆ rc = rc && !ngcmp(n, s + 1); ┆ 0x04f200…09e600 20 20 20 20 2f 2a 20 73 6b 69 70 20 74 6f 20 6e 65 78 74 20 73 75 62 73 63 72 69 70 74 69 6f 6e ┆ /* skip to next subscription┆ 0x04f200…09e600 20 63 6f 6d 70 6f 6e 65 6e 74 20 2a 2f 0a 09 20 20 20 20 77 68 69 6c 65 20 28 28 28 63 68 20 3d ┆ component */ while (((ch =┆ 0x04f200…09e600 20 2a 73 2b 2b 29 20 21 3d 20 4e 47 44 45 4c 49 4d 20 7c 7c 20 62 64 65 70 74 68 20 3e 20 30 29 ┆ *s++) != NGDELIM || bdepth > 0)┆ 0x04f200…09e600 20 26 26 20 2a 73 20 21 3d 20 27 5c 30 27 29 0a 09 09 69 66 20 28 63 68 20 3d 3d 20 4f 50 45 4e ┆ && *s != '\0') if (ch == OPEN┆ 0x04f200…09e600 29 0a 09 09 20 20 20 20 62 64 65 70 74 68 2b 2b 3b 0a 09 09 65 6c 73 65 20 69 66 20 28 63 68 20 ┆) bdepth++; else if (ch ┆ 0x04f200…09e600 3d 3d 20 43 4c 4f 53 45 29 0a 09 09 20 20 20 20 62 64 65 70 74 68 2d 2d 3b 0a 09 7d 0a 0a 09 2f ┆== CLOSE) bdepth--; } /┆ 0x04f200…09e600 2a 20 73 6b 69 70 20 74 6f 20 6e 65 78 74 20 4e 47 44 45 4c 49 4d 2d 73 65 70 61 72 61 74 65 64 ┆* skip to next NGDELIM-separated┆ 0x04f200…09e600 20 74 6f 6b 65 6e 20 69 6e 20 6e 67 6c 69 73 74 20 2a 2f 0a 09 77 68 69 6c 65 20 28 2a 6e 2b 2b ┆ token in nglist */ while (*n++┆ 0x04f200…09e600 20 21 3d 20 4e 47 44 45 4c 49 4d 20 26 26 20 2a 6e 20 21 3d 20 27 5c 30 27 29 0a 09 20 20 20 20 ┆ != NGDELIM && *n != '\0') ┆ 0x04f200…09e600 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d ┆continue; } return rc; }┆ 0x04f200…09e600 0a 0a 70 72 69 76 61 74 65 20 62 6f 6f 6c 20 6e 67 63 6d 70 28 67 72 6f 75 70 2c 20 73 75 62 73 ┆ private bool ngcmp(group, subs┆ 0x04f200…09e600 63 29 0a 2f 2a 0a 20 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f 20 6e 65 77 73 67 72 6f 75 70 73 20 ┆c) /* * Compare two newsgroups ┆ 0x04f200…09e600 66 6f 72 20 65 71 75 61 6c 69 74 79 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 6f 6e 65 20 6d 61 79 ┆for equality. The second one may┆ 0x04f200…09e600 20 62 65 20 61 20 22 6d 65 74 61 22 0a 20 2a 20 6e 65 77 73 67 72 6f 75 70 2c 20 69 2e 65 2e 20 ┆ be a "meta" * newsgroup, i.e. ┆ 0x04f200…09e600 61 20 73 75 62 73 63 72 69 70 74 69 6f 6e 20 69 6e 63 6c 75 64 69 6e 67 20 27 61 6c 6c 27 20 61 ┆a subscription including 'all' a┆ 0x04f200…09e600 6e 64 20 27 61 6e 79 27 20 77 69 6c 64 63 61 72 64 73 2e 0a 20 2a 20 54 68 65 20 63 6f 64 65 20 ┆nd 'any' wildcards. * The code ┆ 0x04f200…09e600 69 73 20 6f 70 74 69 6d 69 7a 65 64 20 66 6f 72 20 73 70 65 65 64 2e 0a 20 2a 2f 0a 72 65 67 69 ┆is optimized for speed. */ regi┆ 0x04f200…09e600 73 74 65 72 20 63 68 61 72 20 2a 67 72 6f 75 70 2c 20 2a 73 75 62 73 63 3b 0a 7b 0a 20 20 20 20 ┆ster char *group, *subsc; { ┆ 0x04f200…09e600 77 68 69 6c 65 20 28 21 45 4e 44 5f 47 52 4f 55 50 28 2a 73 75 62 73 63 29 20 26 26 20 2a 73 75 ┆while (!END_GROUP(*subsc) && *su┆ 0x04f200…09e600 62 73 63 20 21 3d 20 43 4c 4f 53 45 29 0a 20 20 20 20 7b 0a 09 69 66 20 28 73 75 62 73 63 5b 30 ┆bsc != CLOSE) { if (subsc[0┆ 0x04f200…09e600 5d 20 3d 3d 20 27 61 27 20 29 0a 09 7b 0a 09 20 20 20 20 69 66 20 28 73 75 62 73 63 5b 31 5d 20 ┆] == 'a' ) { if (subsc[1] ┆ 0x04f200…09e600 3d 3d 20 27 6c 27 20 26 26 20 73 75 62 73 63 5b 32 5d 20 3d 3d 20 27 6c 27 20 26 26 20 45 4e 44 ┆== 'l' && subsc[2] == 'l' && END┆ 0x04f200…09e600 5f 53 45 47 4d 45 4e 54 28 73 75 62 73 63 5b 33 5d 29 29 0a 09 20 20 20 20 7b 0a 09 09 2f 2a 0a ┆_SEGMENT(subsc[3])) { /* ┆ 0x04f200…09e600 09 09 20 2a 20 73 6b 69 70 20 63 75 72 72 65 6e 74 20 73 75 62 73 63 72 69 70 74 69 6f 6e 20 73 ┆ * skip current subscription s┆ 0x04f200…09e600 65 67 6d 65 6e 74 2c 20 74 68 65 6e 20 73 65 65 20 69 66 20 74 68 65 20 73 75 62 73 63 20 69 73 ┆egment, then see if the subsc is┆ 0x04f200…09e600 0a 09 09 20 2a 20 6d 61 74 63 68 65 64 20 62 79 20 61 6e 79 20 74 61 69 6c 20 6f 66 20 74 68 65 ┆ * matched by any tail of the┆ 0x04f200…09e600 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 65 20 67 72 6f 75 70 20 6e 61 6d 65 0a 09 09 20 ┆ remainder of the group name ┆ 0x04f200…09e600 2a 2f 0a 09 09 73 75 62 73 63 20 2b 3d 20 33 3b 09 2f 2a 20 73 74 72 6c 65 6e 28 22 61 6c 6c 22 ┆*/ subsc += 3; /* strlen("all"┆ 0x04f200…09e600 29 20 2a 2f 0a 09 09 77 68 69 6c 65 20 28 21 45 4e 44 5f 47 52 4f 55 50 28 2a 67 72 6f 75 70 29 ┆) */ while (!END_GROUP(*group)┆ 0x04f200…09e600 29 0a 09 09 20 20 20 20 69 66 20 28 6e 67 63 6d 70 28 67 72 6f 75 70 2b 2b 2c 20 73 75 62 73 63 ┆) if (ngcmp(group++, subsc┆ 0x04f200…09e600 29 29 0a 09 09 09 72 65 74 75 72 6e 28 54 52 55 45 29 3b 0a 09 09 72 65 74 75 72 6e 28 6e 67 63 ┆)) return(TRUE); return(ngc┆ 0x04f200…09e600 6d 70 28 67 72 6f 75 70 2c 20 73 75 62 73 63 29 29 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 65 ┆mp(group, subsc)); } e┆ 0x04f200…09e600 6c 73 65 20 69 66 20 28 73 75 62 73 63 5b 31 5d 3d 3d 27 6e 27 20 26 26 20 73 75 62 73 63 5b 32 ┆lse if (subsc[1]=='n' && subsc[2┆ 0x04f200…09e600 5d 3d 3d 27 79 27 20 26 26 20 45 4e 44 5f 53 45 47 4d 45 4e 54 28 73 75 62 73 63 5b 33 5d 29 29 ┆]=='y' && END_SEGMENT(subsc[3]))┆ 0x04f200…09e600 0a 09 20 20 20 20 7b 0a 09 09 2f 2a 20 73 6b 69 70 20 63 75 72 72 65 6e 74 20 73 75 62 73 63 72 ┆ { /* skip current subscr┆ 0x04f200…09e600 69 70 74 69 6f 6e 20 73 65 67 6d 65 6e 74 2c 20 61 6e 64 20 6f 6e 65 20 67 72 6f 75 70 20 73 65 ┆iption segment, and one group se┆ 0x04f200…09e600 67 6d 65 6e 74 20 2a 2f 0a 09 09 73 75 62 73 63 20 2b 3d 20 33 3b 09 2f 2a 20 73 74 72 6c 65 6e ┆gment */ subsc += 3; /* strlen┆ 0x04f200…09e600 28 22 61 6e 79 22 29 20 2a 2f 0a 09 09 53 4b 49 50 5f 53 45 47 4d 45 4e 54 28 67 72 6f 75 70 29 ┆("any") */ SKIP_SEGMENT(group)┆ 0x04f200…09e600 3b 0a 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 0a 09 69 66 20 28 69 73 ┆; continue; } } if (is┆ 0x04f200…09e600 73 70 61 63 65 28 2a 73 75 62 73 63 29 20 7c 7c 20 2a 73 75 62 73 63 20 3d 3d 20 27 5c 5c 27 29 ┆space(*subsc) || *subsc == '\\')┆ 0x04f200…09e600 0a 09 20 20 20 20 73 75 62 73 63 2b 2b 3b 0a 09 65 6c 73 65 20 69 66 20 28 2a 73 75 62 73 63 20 ┆ subsc++; else if (*subsc ┆ 0x04f200…09e600 3d 3d 20 4f 50 45 4e 29 0a 09 20 20 20 20 72 65 74 75 72 6e 28 6e 67 6d 61 74 63 68 28 67 72 6f ┆== OPEN) return(ngmatch(gro┆ 0x04f200…09e600 75 70 2c 20 2b 2b 73 75 62 73 63 29 29 3b 09 2f 2a 20 74 68 65 20 2b 2b 20 69 73 20 74 68 65 20 ┆up, ++subsc)); /* the ++ is the ┆ 0x04f200…09e600 6b 65 79 21 20 2a 2f 0a 09 65 6c 73 65 20 69 66 20 28 2a 73 75 62 73 63 2b 2b 20 21 3d 20 2a 67 ┆key! */ else if (*subsc++ != *g┆ 0x04f200…09e600 72 6f 75 70 2b 2b 29 0a 09 20 20 20 20 72 65 74 75 72 6e 28 46 41 4c 53 45 29 3b 0a 20 20 20 20 ┆roup++) return(FALSE); ┆ 0x04f200…09e600 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 49 66 20 49 27 6d 20 65 76 65 72 20 66 72 65 ┆} /* * If I'm ever fre┆ 0x04f200…09e600 65 20 74 6f 20 6e 75 6b 65 20 74 68 65 20 60 66 6f 6f 20 6d 61 74 63 68 65 73 20 66 6f 6f 2e 62 ┆e to nuke the `foo matches foo.b┆ 0x04f200…09e600 61 72 27 20 6d 69 73 66 65 61 74 75 72 65 2c 20 74 68 69 73 0a 20 20 20 20 20 2a 20 77 69 6c 6c ┆ar' misfeature, this * will┆ 0x04f200…09e600 20 62 65 63 6f 6d 65 20 45 4e 44 5f 47 52 4f 55 50 28 2a 67 72 6f 75 70 29 0a 20 20 20 20 20 2a ┆ become END_GROUP(*group) *┆ 0x04f200…09e600 2f 0a 20 20 20 20 72 65 74 75 72 6e 28 45 4e 44 5f 53 45 47 4d 45 4e 54 28 2a 67 72 6f 75 70 29 ┆/ return(END_SEGMENT(*group)┆ 0x04f200…09e600 29 3b 0a 7d 0a 0a 2f 2a 20 6e 67 6d 61 74 63 68 2e 63 20 65 6e 64 73 20 68 65 72 65 20 2a 2f 0a ┆); } /* ngmatch.c ends here */ ┆ 0x04f200…09e600 69 70 74 69 6f 6e 20 73 65 67 6d 65 6e 74 2c 20 61 6e 64 20 6f 6e 65 20 67 72 6f 75 70 20 73 65 ┆iption segment, and one group se┆ 0x04f200…09e600 67 6d 65 6e 74 20 2a 2f 0a 09 09 73 75 62 73 63 20 2b 3d 20 33 3b 09 2f 2a 20 73 74 72 6c 65 6e ┆gment */ subsc += 3; /* strlen┆ 0x04f200…09e600 28 22 61 6e 79 22 29 20 2a 2f 0a 09 09 53 4b 49 50 73 72 63 2f 44 2e 6e 65 77 73 2f 6f 73 70 61 ┆("any") */ SKIPsrc/D.news/ospa┆ 0x04f200…09e600 77 6e 2e 63 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆wn.c ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆ ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 20 20 20 34 34 34 20 00 20 20 20 ┆ 444 ┆ 0x04f200…09e600 31 34 35 20 00 20 20 20 20 20 31 20 00 20 20 20 20 20 20 20 34 36 33 36 20 20 34 34 35 36 31 35 ┆145 1 4636 445615┆ 0x04f200…09e600 34 30 34 34 20 20 20 37 34 37 35 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆4044 7475 ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆ ┆ […0x9…] 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆ /**************┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆********************************┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a ┆******************************* ┆ 0x04f200…09e600 0a 4e 41 4d 45 0a 20 20 20 6f 73 70 61 77 6e 2e 63 20 2d 2d 20 70 72 6f 67 72 61 6d 20 69 6e 74 ┆ NAME ospawn.c -- program int┆ 0x04f200…09e600 65 72 66 61 63 65 20 66 6f 72 20 6f 72 69 67 69 6e 61 74 69 6e 67 20 6e 65 77 73 0a 0a 53 59 4e ┆erface for originating news SYN┆ 0x04f200…09e600 4f 50 53 49 53 0a 20 20 20 23 69 6e 63 6c 75 64 65 20 22 6e 65 77 73 2e 68 22 0a 0a 20 20 20 63 ┆OPSIS #include "news.h" c┆ 0x04f200…09e600 68 61 72 20 2a 6f 73 70 61 77 6e 28 63 6d 64 29 09 09 2d 2d 20 63 61 6c 6c 20 63 68 69 6c 64 20 ┆har *ospawn(cmd) -- call child ┆ 0x04f200…09e600 77 69 74 68 20 2d 6f 20 61 72 67 2c 20 72 65 61 64 20 62 61 63 6b 20 61 20 6c 69 6e 65 0a 20 20 ┆with -o arg, read back a line ┆ 0x04f200…09e600 20 63 68 61 72 20 2a 63 6d 64 3b 0a 0a 44 45 53 43 52 49 50 54 49 4f 4e 0a 20 20 20 54 68 69 73 ┆ char *cmd; DESCRIPTION This┆ 0x04f200…09e600 20 63 6f 64 65 20 73 70 61 77 6e 73 20 61 20 70 72 6f 63 65 73 73 20 69 6e 20 66 6f 72 65 67 72 ┆ code spawns a process in foregr┆ 0x04f200…09e600 6f 75 6e 64 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65 20 67 69 76 65 6e 20 63 6f 6d 6d 61 6e ┆ound to execute the given comman┆ 0x04f200…09e600 64 2e 20 54 68 65 0a 63 6f 6d 6d 61 6e 64 20 6d 75 73 74 20 61 63 63 65 70 74 20 61 6e 20 6f 70 ┆d. The command must accept an op┆ 0x04f200…09e600 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 2d 6f 20 3c 6e 75 6d 3e 20 6f 6e 20 77 68 69 ┆tion of the form -o <num> on whi┆ 0x04f200…09e600 63 68 20 61 20 6c 69 6e 65 20 6f 66 20 73 74 61 74 75 73 0a 64 61 74 61 20 69 73 20 77 72 69 74 ┆ch a line of status data is writ┆ 0x04f200…09e600 74 65 6e 20 62 61 63 6b 2e 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73 20 73 74 61 74 ┆ten back. A pointer to this stat┆ 0x04f200…09e600 75 73 20 64 61 74 61 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 54 68 65 20 63 61 6c 6c 69 6e 67 ┆us data is returned. The calling┆ 0x04f200…09e600 0a 70 72 6f 63 65 73 73 20 69 73 20 70 72 6f 74 65 63 74 65 64 20 66 72 6f 6d 20 53 49 47 49 4e ┆ process is protected from SIGIN┆ 0x04f200…09e600 54 20 61 6e 64 20 53 49 47 51 55 49 54 20 77 68 69 6c 65 20 74 68 65 20 63 68 69 6c 64 20 69 73 ┆T and SIGQUIT while the child is┆ 0x04f200…09e600 20 65 78 65 63 75 74 69 6e 67 2e 0a 54 68 69 73 20 63 6f 64 65 20 2a 77 69 6c 6c 2a 20 64 6f 20 ┆ executing. This code *will* do ┆ 0x04f200…09e600 61 20 50 41 54 48 20 73 65 61 72 63 68 20 74 6f 20 66 69 6e 64 20 74 68 65 20 63 6f 6d 6d 61 6e ┆a PATH search to find the comman┆ 0x04f200…09e600 64 2e 0a 0a 41 55 54 48 4f 52 0a 20 20 20 45 72 69 63 20 53 2e 20 52 61 79 6d 6f 6e 64 0a 20 20 ┆d. AUTHOR Eric S. Raymond ┆ 0x04f200…09e600 20 54 68 69 73 20 73 6f 66 74 77 61 72 65 20 69 73 20 43 6f 70 79 72 69 67 68 74 20 28 43 29 20 ┆ This software is Copyright (C) ┆ 0x04f200…09e600 31 39 38 39 20 62 79 20 45 72 69 63 20 53 2e 20 52 61 79 6d 6f 6e 64 20 66 6f 72 20 74 68 65 20 ┆1989 by Eric S. Raymond for the ┆ 0x04f200…09e600 73 6f 6c 65 20 70 75 72 70 6f 73 65 0a 6f 66 20 70 72 6f 74 65 63 74 69 6e 67 20 66 72 65 65 20 ┆sole purpose of protecting free ┆ 0x04f200…09e600 72 65 64 69 73 74 72 69 62 75 74 69 6f 6e 3b 20 73 65 65 20 74 68 65 20 4c 49 43 45 4e 53 45 20 ┆redistribution; see the LICENSE ┆ 0x04f200…09e600 66 69 6c 65 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆file for details. *************┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆********************************┆ […0x1…] 0x04f200…09e600 2f 0a 2f 2a 4c 49 4e 54 4c 49 42 52 41 52 59 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 6e 65 77 73 ┆/ /*LINTLIBRARY*/ #include "news┆ 0x04f200…09e600 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 70 72 6f 63 6f 70 74 73 2e 68 22 0a 0a 63 68 61 72 20 ┆.h" #include "procopts.h" char ┆ 0x04f200…09e600 2a 6f 73 70 61 77 6e 28 63 6d 64 29 0a 63 68 61 72 09 2a 63 6d 64 3b 09 09 2f 2a 20 61 72 74 69 ┆*ospawn(cmd) char *cmd; /* arti┆ 0x04f200…09e600 63 6c 65 20 74 6f 20 74 72 61 6e 73 6d 69 74 20 2a 2f 0a 7b 0a 20 20 20 20 69 6e 74 09 20 20 20 ┆cle to transmit */ { int ┆ 0x04f200…09e600 20 09 63 68 69 6c 64 2c 20 6f 70 69 70 65 5b 32 5d 3b 0a 20 20 20 20 63 68 61 72 09 2a 61 72 67 ┆ child, opipe[2]; char *arg┆ 0x04f200…09e600 76 5b 4d 41 58 41 52 47 53 5d 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63 68 61 72 09 72 65 74 75 ┆v[MAXARGS]; static char retu┆ 0x04f200…09e600 72 6e 62 75 66 5b 42 55 46 4c 45 4e 5d 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 57 65 ┆rnbuf[BUFLEN]; /* * We┆ 0x04f200…09e600 20 64 6f 20 74 68 69 6e 67 73 20 74 68 65 20 73 6c 69 67 68 74 6c 79 20 68 61 72 64 65 72 20 77 ┆ do things the slightly harder w┆ 0x04f200…09e600 61 79 2c 20 6e 6f 74 20 75 73 69 6e 67 20 73 79 73 74 65 6d 28 33 29 2c 0a 20 20 20 20 20 2a 20 ┆ay, not using system(3), * ┆ 0x04f200…09e600 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 65 20 65 78 61 63 74 6c 79 20 73 75 72 65 20 6f 66 20 77 ┆in order to be exactly sure of w┆ 0x04f200…09e600 68 61 74 27 73 20 67 6f 69 6e 67 20 6f 6e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 20 28 28 ┆hat's going on */ if ((┆ 0x04f200…09e600 70 69 70 65 28 6f 70 69 70 65 29 20 3d 3d 20 46 41 49 4c 29 20 7c 7c 20 28 63 68 69 6c 64 20 3d ┆pipe(opipe) == FAIL) || (child =┆ 0x04f200…09e600 20 76 66 6f 72 6b 28 29 29 20 3d 3d 20 46 41 49 4c 29 0a 09 72 65 74 75 72 6e 28 28 63 68 61 72 ┆ vfork()) == FAIL) return((char┆ 0x04f200…09e600 20 2a 29 4e 55 4c 4c 29 3b 0a 20 20 20 20 65 6c 73 65 20 69 66 20 28 63 68 69 6c 64 29 09 2f 2a ┆ *)NULL); else if (child) /*┆ 0x04f200…09e600 20 74 68 65 20 70 61 72 65 6e 74 20 73 69 64 65 20 2a 2f 0a 20 20 20 20 7b 0a 09 63 61 74 63 68 ┆ the parent side */ { catch┆ 0x04f200…09e600 5f 74 20 28 2a 73 61 76 65 71 75 69 74 29 28 29 2c 20 28 2a 73 61 76 65 69 6e 74 29 28 29 2c 20 ┆_t (*savequit)(), (*saveint)(), ┆ 0x04f200…09e600 28 2a 73 61 76 65 61 6c 72 6d 29 28 29 3b 0a 0a 09 73 61 76 65 71 75 69 74 20 3d 20 73 69 67 6e ┆(*savealrm)(); savequit = sign┆ 0x04f200…09e600 61 6c 28 53 49 47 51 55 49 54 2c 20 53 49 47 43 41 53 54 28 53 49 47 5f 49 47 4e 29 29 3b 0a 09 ┆al(SIGQUIT, SIGCAST(SIG_IGN)); ┆ 0x04f200…09e600 73 61 76 65 69 6e 74 20 3d 20 73 69 67 6e 61 6c 28 53 49 47 49 4e 54 2c 20 53 49 47 43 41 53 54 ┆saveint = signal(SIGINT, SIGCAST┆ 0x04f200…09e600 28 53 49 47 5f 49 47 4e 29 29 3b 0a 09 73 61 76 65 61 6c 72 6d 20 3d 20 73 69 67 6e 61 6c 28 53 ┆(SIG_IGN)); savealrm = signal(S┆ 0x04f200…09e600 49 47 41 4c 52 4d 2c 20 53 49 47 43 41 53 54 28 53 49 47 5f 49 47 4e 29 29 3b 0a 0a 09 28 76 6f ┆IGALRM, SIGCAST(SIG_IGN)); (vo┆ 0x04f200…09e600 69 64 29 20 63 6c 6f 73 65 28 6f 70 69 70 65 5b 31 5d 29 3b 09 09 2f 2a 20 77 6f 6e 27 74 20 6e ┆id) close(opipe[1]); /* won't n┆ 0x04f200…09e600 65 65 64 20 74 6f 20 77 72 69 74 65 20 74 6f 20 63 68 69 6c 64 20 2a 2f 0a 09 28 76 6f 69 64 29 ┆eed to write to child */ (void)┆ 0x04f200…09e600 20 66 77 61 69 74 28 63 68 69 6c 64 29 3b 09 09 2f 2a 20 68 61 6e 67 20 6f 75 74 20 74 69 6c 6c ┆ fwait(child); /* hang out till┆ 0x04f200…09e600 20 63 68 69 6c 64 20 63 72 6f 61 6b 73 20 2a 2f 0a 0a 09 2f 2a 20 67 72 61 62 20 74 68 65 20 67 ┆ child croaks */ /* grab the g┆ 0x04f200…09e600 65 6e 65 72 61 74 65 64 20 49 44 20 77 72 69 74 74 65 6e 20 62 79 20 72 6e 65 77 73 20 2d 6f 20 ┆enerated ID written by rnews -o ┆ 0x04f200…09e600 6f 66 66 20 74 68 65 20 70 69 70 65 20 2a 2f 0a 09 28 76 6f 69 64 29 20 72 65 61 64 28 6f 70 69 ┆off the pipe */ (void) read(opi┆ 0x04f200…09e600 70 65 5b 30 5d 2c 20 72 65 74 75 72 6e 62 75 66 2c 20 73 69 7a 65 6f 66 28 72 65 74 75 72 6e 62 ┆pe[0], returnbuf, sizeof(returnb┆ 0x04f200…09e600 75 66 29 29 3b 0a 0a 09 28 76 6f 69 64 29 20 73 69 67 6e 61 6c 28 53 49 47 51 55 49 54 2c 20 53 ┆uf)); (void) signal(SIGQUIT, S┆ 0x04f200…09e600 49 47 43 41 53 54 28 73 61 76 65 71 75 69 74 29 29 3b 0a 09 28 76 6f 69 64 29 20 73 69 67 6e 61 ┆IGCAST(savequit)); (void) signa┆ 0x04f200…09e600 6c 28 53 49 47 49 4e 54 2c 20 53 49 47 43 41 53 54 28 73 61 76 65 69 6e 74 29 29 3b 0a 09 28 76 ┆l(SIGINT, SIGCAST(saveint)); (v┆ 0x04f200…09e600 6f 69 64 29 20 73 69 67 6e 61 6c 28 53 49 47 49 4e 54 2c 20 53 49 47 43 41 53 54 28 73 61 76 65 ┆oid) signal(SIGINT, SIGCAST(save┆ 0x04f200…09e600 61 6c 72 6d 29 29 3b 0a 0a 23 69 66 64 65 66 20 44 45 42 55 47 0a 09 69 66 20 28 76 65 72 62 6f ┆alrm)); #ifdef DEBUG if (verbo┆ 0x04f200…09e600 73 65 29 0a 09 20 20 20 20 28 76 6f 69 64 29 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 0a ┆se) (void) fprintf(stderr, ┆ 0x04f200…09e600 09 09 09 20 20 20 22 6f 73 70 61 77 6e 3a 20 63 6f 6d 6d 61 6e 64 20 5c 22 25 73 5c 22 20 72 65 ┆ "ospawn: command \"%s\" re┆ 0x04f200…09e600 74 75 72 6e 73 20 25 73 5c 6e 22 2c 0a 09 09 09 20 20 20 63 6d 64 2c 20 72 65 74 75 72 6e 62 75 ┆turns %s\n", cmd, returnbu┆ 0x04f200…09e600 66 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 44 45 42 55 47 20 2a 2f 0a 09 72 65 74 75 72 6e 28 72 ┆f); #endif /* DEBUG */ return(r┆ 0x04f200…09e600 65 74 75 72 6e 62 75 66 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 09 09 2f 2a 20 74 68 ┆eturnbuf); } else /* th┆ 0x04f200…09e600 65 20 63 68 69 6c 64 20 73 69 64 65 20 2a 2f 0a 20 20 20 20 7b 0a 09 28 76 6f 69 64 29 20 63 6c ┆e child side */ { (void) cl┆ 0x04f200…09e600 6f 73 65 28 6f 70 69 70 65 5b 30 5d 29 3b 0a 0a 09 2f 2a 20 74 69 6d 65 20 66 6f 72 20 74 68 65 ┆ose(opipe[0]); /* time for the┆ 0x04f200…09e600 20 61 63 74 75 61 6c 20 63 68 69 6c 64 20 69 6e 76 6f 63 61 74 69 6f 6e 20 2a 2f 0a 09 28 76 6f ┆ actual child invocation */ (vo┆ 0x04f200…09e600 69 64 29 20 73 70 72 69 6e 74 66 28 62 66 72 2c 20 22 25 73 20 2d 6f 20 25 64 22 2c 20 63 6d 64 ┆id) sprintf(bfr, "%s -o %d", cmd┆ 0x04f200…09e600 2c 20 6f 70 69 70 65 5b 31 5d 29 3b 0a 09 28 76 6f 69 64 29 20 76 63 72 61 63 6b 28 62 66 72 2c ┆, opipe[1]); (void) vcrack(bfr,┆ 0x04f200…09e600 20 61 72 67 76 2c 20 4d 41 58 41 52 47 53 29 3b 0a 09 28 76 6f 69 64 29 20 65 78 65 63 76 70 28 ┆ argv, MAXARGS); (void) execvp(┆ 0x04f200…09e600 61 72 67 76 5b 30 5d 2c 20 61 72 67 76 29 3b 0a 09 28 76 6f 69 64 29 20 66 70 72 69 6e 74 66 28 ┆argv[0], argv); (void) fprintf(┆ 0x04f200…09e600 73 74 64 65 72 72 2c 0a 09 09 20 20 20 20 20 20 20 22 6f 73 70 61 77 6e 3a 20 63 68 69 6c 64 20 ┆stderr, "ospawn: child ┆ 0x04f200…09e600 65 78 65 63 75 74 69 6f 6e 20 66 61 69 6c 65 64 2c 20 65 72 72 6e 6f 20 3d 20 25 64 5c 6e 22 2c ┆execution failed, errno = %d\n",┆ 0x04f200…09e600 0a 09 09 20 20 20 20 20 20 20 65 72 72 6e 6f 29 3b 0a 09 5f 65 78 69 74 28 31 29 3b 0a 09 2f 2a ┆ errno); _exit(1); /*┆ 0x04f200…09e600 4e 4f 54 52 45 41 43 48 45 44 2a 2f 0a 20 20 20 20 7d 0a 7d 0a 0a 2f 2a 20 6f 73 70 61 77 6e 2e ┆NOTREACHED*/ } } /* ospawn.┆ 0x04f200…09e600 63 20 65 6e 64 73 20 68 65 72 65 20 2a 2f 0a 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 0a ┆c ends here */ fprintf(stderr, ┆ 0x04f200…09e600 09 09 09 20 20 20 22 6f 73 70 61 77 6e 3a 20 63 6f 6d 6d 61 6e 64 20 5c 22 25 73 5c 22 20 72 65 ┆ "ospawn: command \"%s\" re┆ 0x04f200…09e600 74 75 72 6e 73 20 25 73 5c 6e 22 2c 0a 09 09 09 20 20 20 63 6d 64 2c 20 72 65 74 75 72 6e 62 75 ┆turns %s\n", cmd, returnbu┆ 0x04f200…09e600 66 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 44 45 42 73 72 63 2f 44 2e 6e 65 77 73 2f 72 64 61 63 ┆f); #endif /* DEBsrc/D.news/rdac┆ 0x04f200…09e600 74 69 76 65 2e 63 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆tive.c ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆ ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 20 20 20 34 34 34 20 00 20 20 20 ┆ 444 ┆ 0x04f200…09e600 31 34 35 20 00 20 20 20 20 20 31 20 00 20 20 20 20 20 20 35 30 31 31 37 20 20 34 34 36 31 33 30 ┆145 1 50117 446130┆ 0x04f200…09e600 33 33 30 36 20 20 20 37 37 37 33 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆3306 7773 ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆ ┆ […0x9…] 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆ /**************┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆********************************┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 0a ┆****************************** ┆ 0x04f200…09e600 4e 41 4d 45 0a 20 20 20 72 64 61 63 74 69 76 65 2e 63 20 2d 2d 20 66 75 6e 63 74 69 6f 6e 73 20 ┆NAME rdactive.c -- functions ┆ 0x04f200…09e600 66 6f 72 20 72 65 61 64 69 6e 67 20 61 6e 64 20 6d 61 6e 69 70 75 6c 61 74 69 6e 67 20 74 68 65 ┆for reading and manipulating the┆ 0x04f200…09e600 20 61 63 74 69 76 65 20 66 69 6c 65 0a 0a 53 59 4e 4f 50 53 49 53 0a 20 20 20 23 69 6e 63 6c 75 ┆ active file SYNOPSIS #inclu┆ 0x04f200…09e600 64 65 20 22 61 63 74 69 76 65 2e 68 22 0a 0a 20 20 20 69 6e 74 20 72 64 61 63 74 69 76 65 28 62 ┆de "active.h" int rdactive(b┆ 0x04f200…09e600 70 72 6f 63 29 09 09 2d 2d 20 6c 6f 61 64 20 61 63 74 69 76 65 20 69 6e 66 6f 20 6f 6e 20 6e 65 ┆proc) -- load active info on ne┆ 0x04f200…09e600 77 73 67 72 6f 75 70 73 0a 20 20 20 62 6f 6f 6c 20 28 2a 62 70 72 6f 63 29 28 29 3b 0a 0a 20 20 ┆wsgroups bool (*bproc)(); ┆ 0x04f200…09e600 20 76 6f 69 64 20 6e 67 72 65 77 69 6e 64 28 66 29 3b 09 09 2d 2d 20 72 65 73 65 74 20 74 68 65 ┆ void ngrewind(f); -- reset the┆ 0x04f200…09e600 20 63 75 72 72 65 6e 74 2d 67 72 6f 75 70 20 70 6f 69 6e 74 65 72 0a 20 20 20 62 6f 6f 6c 20 66 ┆ current-group pointer bool f┆ 0x04f200…09e600 3b 0a 0a 20 20 20 62 6f 6f 6c 20 6e 67 6e 65 78 74 28 29 3b 09 09 2d 2d 20 6d 6f 76 65 20 74 6f ┆; bool ngnext(); -- move to┆ 0x04f200…09e600 20 74 68 65 20 6e 65 78 74 20 67 72 6f 75 70 0a 0a 20 20 20 62 6f 6f 6c 20 6e 67 62 61 63 6b 28 ┆ the next group bool ngback(┆ 0x04f200…09e600 29 3b 09 09 2d 2d 20 6d 6f 76 65 20 74 6f 20 74 68 65 20 6c 61 73 74 20 67 72 6f 75 70 0a 0a 20 ┆); -- move to the last group ┆ 0x04f200…09e600 20 20 67 72 6f 75 70 5f 74 20 2a 6e 67 66 69 6e 64 28 6e 61 6d 65 29 09 2d 2d 20 72 65 74 75 72 ┆ group_t *ngfind(name) -- retur┆ 0x04f200…09e600 6e 20 70 74 72 20 74 6f 20 67 69 76 65 6e 20 67 72 6f 75 70 27 73 20 64 61 74 61 0a 20 20 20 63 ┆n ptr to given group's data c┆ 0x04f200…09e600 68 61 72 20 6e 61 6d 65 3b 0a 0a 20 20 20 62 6f 6f 6c 20 6e 67 72 65 72 65 61 64 28 6e 67 70 29 ┆har name; bool ngreread(ngp)┆ 0x04f200…09e600 09 09 2d 2d 20 75 70 64 61 74 65 20 64 61 74 61 20 66 6f 72 20 67 69 76 65 6e 20 67 72 6f 75 70 ┆ -- update data for given group┆ 0x04f200…09e600 20 66 72 6f 6d 20 64 69 73 6b 0a 20 20 20 67 72 6f 75 70 5f 74 20 2a 6e 67 70 3b 0a 0a 20 20 20 ┆ from disk group_t *ngp; ┆ 0x04f200…09e600 76 6f 69 64 20 63 6c 73 61 63 74 69 76 65 28 29 09 09 2d 2d 20 72 65 6c 65 61 73 65 20 74 68 65 ┆void clsactive() -- release the┆ 0x04f200…09e600 20 61 63 74 69 76 65 20 66 69 6c 65 0a 0a 20 20 20 76 6f 69 64 20 6e 67 72 65 68 61 73 68 28 29 ┆ active file void ngrehash()┆ 0x04f200…09e600 09 09 2d 2d 20 72 65 67 65 6e 65 72 61 74 65 20 67 72 6f 75 70 20 68 61 73 68 20 6c 69 73 74 73 ┆ -- regenerate group hash lists┆ 0x04f200…09e600 0a 0a 44 45 53 43 52 49 50 54 49 4f 4e 0a 20 20 20 54 68 65 73 65 20 66 75 6e 63 74 69 6f 6e 73 ┆ DESCRIPTION These functions┆ 0x04f200…09e600 20 70 72 6f 76 69 64 65 20 61 20 63 6c 65 61 6e 20 69 6e 74 65 72 66 61 63 65 20 74 6f 20 74 68 ┆ provide a clean interface to th┆ 0x04f200…09e600 65 20 61 63 74 69 76 65 2d 67 72 6f 75 70 73 20 66 69 6c 65 20 75 73 65 64 0a 62 79 20 74 68 65 ┆e active-groups file used by the┆ 0x04f200…09e600 20 55 53 45 4e 45 54 20 73 6f 66 74 77 61 72 65 2e 20 53 65 65 20 77 72 61 63 74 69 76 65 2e 63 ┆ USENET software. See wractive.c┆ 0x04f200…09e600 20 66 6f 72 20 63 6f 6d 70 61 6e 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 73 20 75 73 61 62 6c 65 20 ┆ for companion functions usable ┆ 0x04f200…09e600 66 6f 72 0a 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20 61 63 74 69 76 65 20 66 69 6c 65 2e 0a 0a ┆for modifying the active file. ┆ 0x04f200…09e600 20 20 20 55 73 65 20 6f 66 20 74 68 65 73 65 20 66 75 6e 63 74 69 6f 6e 73 20 6d 75 73 74 20 62 ┆ Use of these functions must b┆ 0x04f200…09e600 65 67 69 6e 20 77 69 74 68 20 61 20 63 61 6c 6c 20 74 6f 20 72 64 61 63 74 69 76 65 28 29 2e 20 ┆egin with a call to rdactive(). ┆ 0x04f200…09e600 54 68 69 73 0a 72 65 61 64 73 20 64 61 74 61 20 6f 6e 20 61 63 74 69 76 65 20 6e 65 77 73 67 72 ┆This reads data on active newsgr┆ 0x04f200…09e600 6f 75 70 73 20 69 6e 74 6f 20 61 20 6d 61 6c 6c 6f 63 27 64 20 69 6e 2d 63 6f 72 65 20 61 72 72 ┆oups into a malloc'd in-core arr┆ 0x04f200…09e600 61 79 20 6f 66 20 67 72 6f 75 70 5f 74 0a 73 74 72 75 63 74 75 72 65 73 2e 20 54 68 65 20 72 64 ┆ay of group_t structures. The rd┆ 0x04f200…09e600 61 63 74 69 76 65 28 29 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 ┆active() function may be called ┆ 0x04f200…09e600 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 63 65 2e 0a 45 61 63 68 20 74 69 6d 65 20 61 66 74 65 72 20 ┆more than once. Each time after ┆ 0x04f200…09e600 74 68 65 20 66 69 72 73 74 20 75 70 64 61 74 65 73 20 74 68 65 20 61 63 74 69 76 65 20 66 69 6c ┆the first updates the active fil┆ 0x04f200…09e600 65 20 61 72 72 61 79 20 74 6f 20 72 65 66 6c 65 63 74 20 6e 65 77 0a 70 6f 73 74 69 6e 67 73 20 ┆e array to reflect new postings ┆ 0x04f200…09e600 77 69 74 68 6f 75 74 20 74 72 61 73 68 69 6e 67 20 74 68 65 20 6f 6c 64 20 64 61 74 61 2e 20 49 ┆without trashing the old data. I┆ 0x04f200…09e600 74 20 72 65 74 75 72 6e 73 20 61 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 0a ┆t returns a count of the number ┆ 0x04f200…09e600 6f 66 20 67 72 6f 75 70 73 20 74 68 61 74 20 68 61 76 65 20 63 68 61 6e 67 65 64 20 73 74 61 74 ┆of groups that have changed stat┆ 0x04f200…09e600 75 73 2e 0a 0a 20 20 20 49 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 6f 66 20 72 64 61 63 74 ┆us. If the argument of rdact┆ 0x04f200…09e600 69 76 65 28 29 20 69 73 20 6e 6f 6e 2d 6e 75 6c 6c 20 69 74 20 69 73 20 61 73 73 75 6d 65 64 20 ┆ive() is non-null it is assumed ┆ 0x04f200…09e600 74 6f 20 62 65 20 61 20 68 6f 6f 6b 0a 66 75 6e 63 74 69 6f 6e 20 74 6f 20 62 65 20 63 61 6c 6c ┆to be a hook function to be call┆ 0x04f200…09e600 65 64 20 6f 6e 20 65 61 63 68 20 61 63 74 69 76 65 20 67 72 6f 75 70 20 77 68 65 6e 20 75 70 64 ┆ed on each active group when upd┆ 0x04f200…09e600 61 74 69 6e 67 20 69 74 2e 20 54 68 65 20 68 6f 6f 6b 20 66 75 6e 63 74 69 6f 6e 0a 77 69 6c 6c ┆ating it. The hook function will┆ 0x04f200…09e600 20 62 65 20 70 61 73 73 65 64 20 74 77 6f 20 67 72 6f 75 70 5f 74 20 61 64 64 72 65 73 73 20 61 ┆ be passed two group_t address a┆ 0x04f200…09e600 72 67 75 6d 65 6e 74 73 3b 20 74 68 65 79 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 67 72 6f 75 ┆rguments; they point to the grou┆ 0x04f200…09e600 70 27 73 20 6e 65 77 0a 64 61 74 61 20 61 6e 64 20 69 74 73 20 6f 6c 64 20 64 61 74 61 20 72 65 ┆p's new data and its old data re┆ 0x04f200…09e600 73 70 65 63 74 69 76 65 6c 79 2e 20 55 73 65 72 20 68 6f 6f 6b 73 20 6d 61 79 20 61 73 73 75 6d ┆spectively. User hooks may assum┆ 0x04f200…09e600 65 20 74 68 61 74 20 74 68 65 20 2e 6e 65 77 73 72 63 20 0a 70 61 72 74 73 20 6f 66 20 74 68 65 ┆e that the .newsrc parts of the┆ 0x04f200…09e600 20 6e 65 77 20 73 74 72 75 63 74 75 72 65 20 61 72 65 20 7a 65 72 6f 20 61 6e 64 20 63 6f 70 79 ┆ new structure are zero and copy┆ 0x04f200…09e600 20 6f 72 20 65 64 69 74 20 69 6e 74 6f 20 69 74 20 66 72 6f 6d 20 74 68 65 20 6f 6c 64 0a 64 61 ┆ or edit into it from the old da┆ 0x04f200…09e600 74 61 2e 20 54 68 69 73 20 66 65 61 74 75 72 65 20 61 6c 6c 6f 77 73 20 75 73 65 72 20 70 72 6f ┆ta. This feature allows user pro┆ 0x04f200…09e600 67 72 61 6d 73 20 74 6f 20 64 6f 20 74 68 65 69 72 20 6f 77 6e 20 61 70 70 6c 69 63 61 74 69 6f ┆grams to do their own applicatio┆ 0x04f200…09e600 6e 2d 64 65 70 65 6e 64 65 6e 74 0a 75 70 64 61 74 65 20 6f 66 20 2e 6e 65 77 73 72 63 20 64 61 ┆n-dependent update of .newsrc da┆ 0x04f200…09e600 74 61 20 65 61 63 68 20 74 69 6d 65 20 61 63 74 69 76 65 2d 67 72 6f 75 70 20 64 61 74 61 20 69 ┆ta each time active-group data i┆ 0x04f200…09e600 73 20 75 70 64 61 74 65 64 2e 0a 0a 20 20 20 54 68 65 20 72 64 61 63 74 69 76 65 28 29 20 66 75 ┆s updated. The rdactive() fu┆ 0x04f200…09e600 6e 63 74 69 6f 6e 20 6c 65 61 76 65 73 20 61 20 66 69 6c 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 ┆nction leaves a file pointer to ┆ 0x04f200…09e600 74 68 65 20 61 63 74 69 76 65 20 66 69 6c 65 20 69 6e 0a 74 68 65 20 61 63 74 69 76 65 2e 66 70 ┆the active file in the active.fp┆ 0x04f200…09e600 20 73 6c 6f 74 20 6f 66 20 74 68 65 20 61 63 74 69 76 65 20 67 6c 6f 62 61 6c 2e 20 54 68 69 73 ┆ slot of the active global. This┆ 0x04f200…09e600 20 63 61 6e 20 62 65 20 75 73 65 64 20 66 6f 72 20 6f 6e 2d 74 68 65 2d 66 6c 79 0a 72 65 61 64 ┆ can be used for on-the-fly read┆ 0x04f200…09e600 73 20 61 6e 64 20 75 70 64 61 74 65 73 20 6f 66 20 74 68 65 20 6f 6e 2d 64 69 73 6b 20 66 69 6c ┆s and updates of the on-disk fil┆ 0x04f200…09e600 65 3b 20 69 74 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e 65 64 20 66 6f 72 20 75 70 64 61 74 65 20 ┆e; it will be opened for update ┆ 0x04f200…09e600 69 66 0a 70 65 72 6d 69 73 73 69 6f 6e 73 20 70 65 72 6d 69 74 2c 20 72 65 61 64 2d 6f 6e 6c 79 ┆if permissions permit, read-only┆ 0x04f200…09e600 20 6f 74 68 65 72 77 69 73 65 2e 0a 0a 20 20 20 20 47 72 6f 75 70 20 64 61 74 61 20 61 63 63 65 ┆ otherwise. Group data acce┆ 0x04f200…09e600 73 73 20 66 75 6e 63 74 69 6f 6e 73 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f ┆ss functions return a pointer to┆ 0x04f200…09e600 20 74 68 65 20 67 72 6f 75 70 5f 74 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 0a 64 65 73 63 ┆ the group_t structure that desc┆ 0x04f200…09e600 72 69 62 65 73 20 61 20 67 72 6f 75 70 2e 20 54 68 65 20 75 73 65 72 20 69 73 20 77 61 72 6e 65 ┆ribes a group. The user is warne┆ 0x04f200…09e600 64 20 74 68 61 74 20 73 65 74 74 69 6e 67 20 61 6e 79 20 6f 66 20 74 68 65 20 6d 65 6d 62 65 72 ┆d that setting any of the member┆ 0x04f200…09e600 73 0a 6f 66 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61 6e 20 69 6e 76 69 74 61 ┆s of this structure is an invita┆ 0x04f200…09e600 74 69 6f 6e 20 74 6f 20 64 69 73 61 73 74 65 72 2e 20 54 68 69 73 20 6d 6f 64 75 6c 65 20 73 75 ┆tion to disaster. This module su┆ 0x04f200…09e600 70 70 6f 72 74 73 20 61 63 63 65 73 73 0a 74 68 61 74 20 69 73 20 73 65 71 75 65 6e 74 69 61 6c ┆pports access that is sequential┆ 0x04f200…09e600 20 28 73 74 65 70 70 69 6e 67 20 74 68 72 6f 75 67 68 20 74 68 65 20 67 72 6f 75 70 73 20 69 6e ┆ (stepping through the groups in┆ 0x04f200…09e600 20 61 63 74 69 76 65 20 6f 72 20 2e 6e 65 77 73 72 63 20 66 69 6c 65 0a 6f 72 64 65 72 29 20 6f ┆ active or .newsrc file order) o┆ 0x04f200…09e600 72 20 72 61 6e 64 6f 6d 20 28 62 79 20 6e 61 6d 65 29 2e 20 41 66 74 65 72 20 61 6e 79 20 6f 66 ┆r random (by name). After any of┆ 0x04f200…09e600 20 74 68 65 73 65 20 66 75 6e 63 74 69 6f 6e 73 2e 20 74 68 65 20 63 75 72 72 65 6e 74 2d 67 72 ┆ these functions. the current-gr┆ 0x04f200…09e600 6f 75 70 0a 70 6f 69 6e 74 65 72 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 61 73 20 74 68 65 20 ┆oup pointer is available as the ┆ 0x04f200…09e600 76 61 6c 75 65 20 6f 66 20 6e 67 61 63 74 69 76 65 28 29 2e 0a 0a 20 20 20 54 68 65 20 66 75 6e ┆value of ngactive(). The fun┆ 0x04f200…09e600 63 74 69 6f 6e 73 20 6e 67 6e 65 78 74 28 29 20 6f 72 20 6e 67 62 61 63 6b 28 29 20 61 72 65 20 ┆ctions ngnext() or ngback() are ┆ 0x04f200…09e600 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 64 6f 20 73 65 71 75 65 6e 74 69 61 6c 20 61 63 63 65 73 ┆available to do sequential acces┆ 0x04f200…09e600 73 2e 0a 43 61 6c 6c 20 6e 67 72 65 77 69 6e 64 28 29 20 66 69 72 73 74 20 77 69 74 68 20 74 68 ┆s. Call ngrewind() first with th┆ 0x04f200…09e600 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 64 69 72 65 63 74 69 6f 6e 20 66 6c 61 67 20 61 72 67 ┆e appropriate direction flag arg┆ 0x04f200…09e600 75 6d 65 6e 74 20 74 6f 20 73 65 74 0a 74 68 69 6e 67 73 27 20 75 70 20 73 6f 20 74 68 65 20 66 ┆ument to set things' up so the f┆ 0x04f200…09e600 69 72 73 74 20 6e 67 6e 65 78 74 28 29 20 6f 72 20 6e 67 62 61 63 6b 28 29 20 77 69 6c 6c 20 67 ┆irst ngnext() or ngback() will g┆ 0x04f200…09e600 6f 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 67 72 6f 75 70 2e 0a 0a 20 20 20 41 63 63 65 73 73 ┆o to the first group. Access┆ 0x04f200…09e600 20 62 79 20 6e 61 6d 65 20 69 73 20 74 68 72 6f 75 67 68 20 74 68 65 20 6e 67 66 69 6e 64 28 29 ┆ by name is through the ngfind()┆ 0x04f200…09e600 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 ┆ function. This function returns┆ 0x04f200…09e600 0a 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 64 61 74 61 20 6f 6e 20 74 68 65 20 73 65 ┆ a pointer to the data on the se┆ 0x04f200…09e600 6c 65 63 74 65 64 20 67 72 6f 75 70 2e 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 73 65 74 20 74 68 ┆lected group. It does not set th┆ 0x04f200…09e600 65 20 63 75 72 72 65 6e 74 2d 67 72 6f 75 70 0a 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64 ┆e current-group pointer returned┆ 0x04f200…09e600 20 62 79 20 6e 67 61 63 74 69 76 65 28 29 20 74 6f 20 69 74 73 20 76 61 6c 75 65 3b 20 74 6f 20 ┆ by ngactive() to its value; to ┆ 0x04f200…09e600 61 63 63 6f 6d 70 6c 69 73 68 20 74 68 61 74 20 63 61 6c 6c 20 74 68 65 0a 6e 67 73 65 6c 65 63 ┆accomplish that call the ngselec┆ 0x04f200…09e600 74 28 29 20 6d 61 63 72 6f 20 6f 6e 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 ┆t() macro on the return value of┆ 0x04f200…09e600 20 6e 67 66 69 6e 64 28 29 2e 20 44 75 65 20 74 6f 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f ┆ ngfind(). Due to an optimizatio┆ 0x04f200…09e600 6e 20 69 6e 0a 74 68 65 20 73 65 61 72 63 68 20 6d 65 74 68 6f 64 20 6e 67 66 69 6e 64 28 29 20 ┆n in the search method ngfind() ┆ 0x04f200…09e600 77 69 6c 6c 20 62 6c 6f 77 20 75 70 20 69 66 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 6e 67 72 ┆will blow up if called after ngr┆ 0x04f200…09e600 65 77 69 6e 64 28 29 20 62 75 74 0a 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 6e 67 6e ┆ewind() but before the first ngn┆ 0x04f200…09e600 65 78 74 28 29 20 6f 72 20 6e 67 62 61 63 6b 28 29 3b 20 61 20 63 61 6c 6c 20 74 6f 20 74 68 65 ┆ext() or ngback(); a call to the┆ 0x04f200…09e600 20 6d 61 63 72 6f 20 6e 67 72 65 73 65 74 28 29 20 77 69 6c 6c 0a 70 72 65 76 65 6e 74 20 74 68 ┆ macro ngreset() will prevent th┆ 0x04f200…09e600 69 73 2e 0a 0a 20 20 20 54 68 65 20 6e 67 72 65 72 65 61 64 28 29 20 66 75 6e 63 74 69 6f 6e 20 ┆is. The ngreread() function ┆ 0x04f200…09e600 63 61 6c 6c 73 20 66 6f 72 20 61 6e 20 75 70 64 61 74 65 20 6f 66 20 74 68 65 20 64 61 74 61 20 ┆calls for an update of the data ┆ 0x04f200…09e600 6f 6e 20 61 20 67 69 76 65 6e 20 67 72 6f 75 70 0a 66 72 6f 6d 20 74 68 65 20 6f 6e 2d 64 69 73 ┆on a given group from the on-dis┆ 0x04f200…09e600 6b 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 5b 49 66 20 74 68 65 20 67 72 6f 75 70 20 70 6f ┆k information. [If the group po┆ 0x04f200…09e600 69 6e 74 65 72 20 61 72 67 75 6d 65 6e 74 20 69 73 20 4e 55 4c 4c 2c 20 69 74 0a 61 6c 6c 6f 63 ┆inter argument is NULL, it alloc┆ 0x04f200…09e600 61 74 65 73 20 61 20 6e 65 77 20 67 72 6f 75 70 20 73 6c 6f 74 20 61 74 20 74 68 65 20 65 6e 64 ┆ates a new group slot at the end┆ 0x04f200…09e600 20 6f 66 20 74 68 65 20 61 72 72 61 79 2e 20 20 2d 2d 2d 2d 20 4e 6f 20 6c 6f 6e 67 65 72 20 74 ┆ of the array. ---- No longer t┆ 0x04f200…09e600 72 75 65 21 5d 0a 0a 20 20 20 41 6c 6c 20 70 65 72 2d 72 65 61 64 65 72 20 61 63 74 69 76 65 2d ┆rue!] All per-reader active-┆ 0x04f200…09e600 67 72 6f 75 70 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 ┆group information is contained i┆ 0x04f200…09e600 6e 20 74 68 65 20 73 74 72 75 63 74 75 72 65 0a 27 61 63 74 69 76 65 27 20 64 65 63 6c 61 72 65 ┆n the structure 'active' declare┆ 0x04f200…09e600 64 20 69 6e 20 61 63 74 69 76 65 2e 68 2e 20 53 6f 6d 65 64 61 79 20 61 63 74 69 76 65 20 6d 61 ┆d in active.h. Someday active ma┆ 0x04f200…09e600 79 20 62 65 63 6f 6d 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61 0a 63 6f 6e 74 61 ┆y become a pointer to data conta┆ 0x04f200…09e600 69 6e 65 64 20 69 6e 20 6f 6e 65 20 6f 66 20 6d 75 6c 74 69 70 6c 65 20 65 78 65 63 75 74 69 6f ┆ined in one of multiple executio┆ 0x04f200…09e600 6e 20 74 68 72 65 61 64 73 2e 0a 0a 54 48 45 20 4d 41 43 52 4f 20 49 4e 54 45 52 46 41 43 45 0a ┆n threads. THE MACRO INTERFACE ┆ 0x04f200…09e600 20 20 20 53 6f 6d 65 20 6d 61 63 72 6f 73 20 61 72 65 20 64 65 66 69 6e 65 64 20 69 6e 20 61 63 ┆ Some macros are defined in ac┆ 0x04f200…09e600 74 69 76 65 2e 68 20 74 68 61 74 20 64 65 66 69 6e 65 20 70 73 65 75 64 6f 2d 66 75 6e 63 74 69 ┆tive.h that define pseudo-functi┆ 0x04f200…09e600 6f 6e 61 6c 20 68 61 6e 64 6c 65 73 0a 6f 6e 20 67 72 6f 75 70 20 69 6e 66 6f 72 6d 61 74 69 6f ┆onal handles on group informatio┆ 0x04f200…09e600 6e 3b 20 74 68 65 79 20 61 72 65 20 61 6c 6c 20 27 73 61 66 65 27 20 28 69 2e 65 2e 20 63 61 6e ┆n; they are all 'safe' (i.e. can┆ 0x04f200…09e600 20 62 65 20 63 61 6c 6c 65 64 20 77 69 74 68 20 61 72 67 75 6d 65 6e 74 73 0a 74 68 61 74 20 68 ┆ be called with arguments that h┆ 0x04f200…09e600 61 76 65 20 73 69 64 65 2d 65 66 66 65 63 74 73 29 20 61 6e 64 20 70 72 65 74 74 79 20 6d 75 63 ┆ave side-effects) and pretty muc┆ 0x04f200…09e600 68 20 73 65 6c 66 2d 65 78 70 6c 61 6e 61 74 6f 72 79 2e 20 54 68 65 20 61 64 76 61 6e 74 61 67 ┆h self-explanatory. The advantag┆ 0x04f200…09e600 65 20 6f 66 0a 75 73 69 6e 67 20 74 68 69 73 20 6c 61 79 65 72 20 69 73 20 74 68 61 74 20 69 74 ┆e of using this layer is that it┆ 0x04f200…09e600 20 69 6e 76 69 73 69 62 6c 79 20 6d 61 69 6e 74 61 69 6e 73 20 74 68 65 20 63 75 72 72 65 6e 74 ┆ invisibly maintains the current┆ 0x04f200…09e600 2d 67 72 6f 75 70 20 70 6f 69 6e 74 65 72 0a 61 63 74 69 76 65 2e 61 72 74 69 63 6c 65 2e 6d 5f ┆-group pointer active.article.m_┆ 0x04f200…09e600 67 72 6f 75 70 2e 0a 0a 6e 67 6e 61 6d 65 28 29 09 2d 2d 20 72 65 74 75 72 6e 20 70 6f 69 6e 74 ┆group. ngname() -- return point┆ 0x04f200…09e600 65 72 20 74 6f 20 63 75 72 72 65 6e 74 20 67 72 6f 75 70 27 73 20 6e 61 6d 65 0a 6e 67 6d 69 6e ┆er to current group's name ngmin┆ 0x04f200…09e600 28 29 09 09 2d 2d 20 72 65 74 75 72 6e 20 6c 6f 77 65 73 74 20 61 63 74 69 76 65 20 61 72 74 69 ┆() -- return lowest active arti┆ 0x04f200…09e600 63 6c 65 20 6e 75 6d 62 65 72 0a 6e 67 6d 61 78 28 29 09 09 2d 2d 20 72 65 74 75 72 6e 20 68 69 ┆cle number ngmax() -- return hi┆ 0x04f200…09e600 67 68 65 73 74 20 61 63 74 69 76 65 20 61 72 74 69 63 6c 65 20 6e 75 6d 62 65 72 0a 6e 67 65 78 ┆ghest active article number ngex┆ 0x04f200…09e600 70 69 72 65 28 29 09 2d 2d 20 72 65 74 75 72 6e 20 74 68 65 20 67 72 6f 75 70 27 73 20 65 78 70 ┆pire() -- return the group's exp┆ 0x04f200…09e600 69 72 65 20 66 69 65 6c 64 0a 6e 67 6e 65 77 28 29 09 09 2d 2d 20 54 52 55 45 20 69 66 20 67 72 ┆ire field ngnew() -- TRUE if gr┆ 0x04f200…09e600 6f 75 70 20 69 73 20 6e 65 77 65 72 20 74 68 61 6e 20 6c 61 73 74 20 72 65 61 64 20 73 65 73 73 ┆oup is newer than last read sess┆ 0x04f200…09e600 69 6f 6e 20 65 6c 73 65 20 46 41 4c 53 45 0a 0a 49 74 20 69 73 20 65 78 70 65 63 74 65 64 20 74 ┆ion else FALSE It is expected t┆ 0x04f200…09e600 68 61 74 20 6d 6f 73 74 20 75 73 65 72 73 20 77 69 6c 6c 20 63 61 6c 6c 20 74 68 65 73 65 20 6d ┆hat most users will call these m┆ 0x04f200…09e600 61 63 72 6f 73 20 72 61 74 68 65 72 20 74 68 61 6e 20 74 68 65 0a 75 6e 64 65 72 6c 79 69 6e 67 ┆acros rather than the underlying┆ 0x04f200…09e600 20 66 75 6e 63 74 69 6f 6e 73 2c 20 73 6f 20 74 68 61 74 20 61 63 74 69 76 65 2e 61 72 74 69 63 ┆ functions, so that active.artic┆ 0x04f200…09e600 6c 65 2e 6d 5f 67 72 6f 75 70 20 64 6f 65 73 6e 27 74 20 6e 65 65 64 20 74 6f 20 62 65 0a 6d 61 ┆le.m_group doesn't need to be ma┆ 0x04f200…09e600 6e 69 70 75 6c 61 74 65 64 20 65 78 70 6c 69 63 69 74 6c 79 2e 0a 0a 20 20 20 53 65 65 20 6e 65 ┆nipulated explicitly. See ne┆ 0x04f200…09e600 77 73 28 35 29 20 66 6f 72 20 64 65 74 61 69 6c 73 20 6f 66 20 74 68 65 20 61 63 74 69 76 65 20 ┆ws(5) for details of the active ┆ 0x04f200…09e600 66 69 6c 65 20 66 6f 72 6d 61 74 0a 0a 4e 4f 54 45 0a 20 20 20 49 66 20 79 6f 75 20 68 61 76 65 ┆file format NOTE If you have┆ 0x04f200…09e600 20 4e 4f 4e 4c 4f 43 41 4c 20 64 65 66 69 6e 65 64 20 28 69 2e 65 2e 20 61 72 65 20 72 75 6e 6e ┆ NONLOCAL defined (i.e. are runn┆ 0x04f200…09e600 69 6e 67 20 79 6f 75 72 20 72 65 61 64 65 72 73 20 61 73 20 63 6c 69 65 6e 74 73 0a 6f 66 20 61 ┆ing your readers as clients of a┆ 0x04f200…09e600 20 6e 65 74 77 6f 72 6b 20 73 65 72 76 65 72 29 20 74 68 69 73 20 63 6f 64 65 20 65 78 70 65 63 ┆ network server) this code expec┆ 0x04f200…09e600 74 73 20 74 6f 20 62 65 20 61 62 6c 65 20 74 6f 20 63 61 6c 6c 20 61 20 6e 65 74 77 6f 72 6b 20 ┆ts to be able to call a network ┆ 0x04f200…09e600 73 65 72 76 69 63 65 0a 6c 69 62 72 61 72 79 20 65 6e 74 72 79 20 70 6f 69 6e 74 20 67 65 74 61 ┆service library entry point geta┆ 0x04f200…09e600 63 74 69 76 65 28 29 20 74 68 61 74 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 ┆ctive() that returns the name of┆ 0x04f200…09e600 20 61 20 74 65 6d 70 20 66 69 6c 65 0a 63 6f 6e 74 61 69 6e 69 6e 67 20 61 20 63 6f 70 79 20 6f ┆ a temp file containing a copy o┆ 0x04f200…09e600 66 20 74 68 65 20 6d 61 73 74 65 72 20 6d 61 63 68 69 6e 65 27 73 20 61 63 74 69 76 65 20 66 69 ┆f the master machine's active fi┆ 0x04f200…09e600 6c 65 2e 0a 0a 0a 46 49 4c 45 53 0a 20 20 20 41 44 4d 2f 61 63 74 69 76 65 09 2d 2d 20 61 63 74 ┆le. FILES ADM/active -- act┆ 0x04f200…09e600 69 76 65 20 67 72 6f 75 70 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 20 20 20 41 44 4d 2f 66 65 65 ┆ive group information ADM/fee┆ 0x04f200…09e600 64 62 69 74 73 09 2d 2d 20 62 69 74 20 6d 61 73 6b 73 20 63 6f 6d 70 69 6c 65 64 20 66 72 6f 6d ┆dbits -- bit masks compiled from┆ 0x04f200…09e600 20 66 65 65 64 20 66 69 6c 65 20 64 61 74 61 0a 0a 4e 4f 54 45 0a 20 20 20 54 68 65 20 6f 6c 64 ┆ feed file data NOTE The old┆ 0x04f200…09e600 20 63 6f 64 65 20 73 6f 6d 65 74 69 6d 65 73 20 75 73 65 64 20 6c 6f 6e 67 73 20 66 6f 72 20 61 ┆ code sometimes used longs for a┆ 0x04f200…09e600 72 74 69 63 6c 65 20 6e 75 6d 62 65 72 73 2e 20 54 68 69 73 20 73 65 65 6d 65 64 20 61 0a 6c 69 ┆rticle numbers. This seemed a li┆ 0x04f200…09e600 74 74 6c 65 20 65 78 63 65 73 73 69 76 65 2c 20 73 6f 20 49 20 68 61 76 65 20 72 65 63 61 73 74 ┆ttle excessive, so I have recast┆ 0x04f200…09e600 20 65 76 65 72 79 74 68 69 6e 67 20 69 6e 20 74 65 72 6d 73 20 6f 66 20 61 6e 20 27 6e 61 72 74 ┆ everything in terms of an 'nart┆ 0x04f200…09e600 5f 74 27 0a 74 79 70 65 64 65 66 20 64 65 66 69 6e 65 64 20 69 6e 20 6e 65 77 73 2e 68 2e 20 49 ┆_t' typedef defined in news.h. I┆ 0x04f200…09e600 66 20 42 49 47 47 52 4f 55 50 53 20 69 73 20 64 65 66 69 6e 65 64 20 69 6e 20 64 65 66 73 2e 68 ┆f BIGGROUPS is defined in defs.h┆ 0x04f200…09e600 20 6c 6f 6e 67 73 20 77 69 6c 6c 20 62 65 0a 75 73 65 64 20 74 68 72 6f 75 67 68 6f 75 74 20 28 ┆ longs will be used throughout (┆ 0x04f200…09e600 70 61 69 6e 73 20 61 72 65 20 74 61 6b 65 6e 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 2a ┆pains are taken to ensure that *┆ 0x04f200…09e600 73 63 61 6e 66 28 29 20 61 6e 64 20 2a 70 72 69 6e 74 66 28 29 0a 66 6f 72 6d 61 74 73 20 64 6f ┆scanf() and *printf() formats do┆ 0x04f200…09e600 20 74 68 65 20 72 69 67 68 74 20 74 68 69 6e 67 29 2e 20 4f 74 68 65 72 77 69 73 65 20 69 6e 74 ┆ the right thing). Otherwise int┆ 0x04f200…09e600 73 20 77 69 6c 6c 20 62 65 20 75 73 65 64 2e 0a 0a 41 55 54 48 4f 52 0a 20 20 20 45 72 69 63 20 ┆s will be used. AUTHOR Eric ┆ 0x04f200…09e600 53 2e 20 52 61 79 6d 6f 6e 64 0a 20 20 20 54 68 69 73 20 73 6f 66 74 77 61 72 65 20 69 73 20 43 ┆S. Raymond This software is C┆ 0x04f200…09e600 6f 70 79 72 69 67 68 74 20 28 43 29 20 31 39 38 39 20 62 79 20 45 72 69 63 20 53 2e 20 52 61 79 ┆opyright (C) 1989 by Eric S. Ray┆ 0x04f200…09e600 6d 6f 6e 64 20 66 6f 72 20 74 68 65 20 73 6f 6c 65 20 70 75 72 70 6f 73 65 0a 6f 66 20 70 72 6f ┆mond for the sole purpose of pro┆ 0x04f200…09e600 74 65 63 74 69 6e 67 20 66 72 65 65 20 72 65 64 69 73 74 72 69 62 75 74 69 6f 6e 3b 20 73 65 65 ┆tecting free redistribution; see┆ 0x04f200…09e600 20 74 68 65 20 4c 49 43 45 4e 53 45 20 66 69 6c 65 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 0a ┆ the LICENSE file for details. ┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆********************************┆ […0x1…] 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 4c 49 4e 54 4c 49 42 52 41 52 59 2a 2f 0a 23 69 6e 63 ┆**********/ /*LINTLIBRARY*/ #inc┆ 0x04f200…09e600 6c 75 64 65 20 22 6e 65 77 73 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 61 63 74 69 76 65 2e 68 ┆lude "news.h" #include "active.h┆ 0x04f200…09e600 22 0a 0a 2f 2a 20 74 77 65 61 6b 20 74 68 65 73 65 20 63 6f 6e 73 74 61 6e 74 73 20 74 6f 20 74 ┆" /* tweak these constants to t┆ 0x04f200…09e600 75 6e 65 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 6f 72 20 69 6e 2d 63 6f 72 65 20 73 ┆une the allocation for in-core s┆ 0x04f200…09e600 74 72 75 63 74 75 72 65 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 47 52 50 43 49 4e 49 54 20 20 20 ┆tructures */ #define GRPCINIT ┆ 0x04f200…09e600 20 33 35 30 09 09 20 20 20 20 2f 2a 20 69 6e 69 74 69 61 6c 20 73 69 7a 65 20 6f 66 20 67 72 6f ┆ 350 /* initial size of gro┆ 0x04f200…09e600 75 70 5f 74 20 61 72 72 61 79 20 2a 2f 0a 23 64 65 66 69 6e 65 20 47 52 50 43 47 52 41 49 4e 20 ┆up_t array */ #define GRPCGRAIN ┆ 0x04f200…09e600 20 20 35 30 09 09 20 20 20 20 2f 2a 20 67 72 6f 75 70 5f 74 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 ┆ 50 /* group_t allocation ┆ 0x04f200…09e600 63 68 75 6e 6b 20 73 69 7a 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 44 53 43 49 4e 49 54 09 20 20 ┆chunk size */ #define DSCINIT ┆ 0x04f200…09e600 20 20 32 30 09 09 20 20 20 20 2f 2a 20 69 6e 69 74 69 61 6c 20 73 69 7a 65 20 6f 66 20 64 69 73 ┆ 20 /* initial size of dis┆ 0x04f200…09e600 63 75 73 73 69 6f 6e 73 20 61 72 72 61 79 20 2a 2f 0a 23 64 65 66 69 6e 65 20 44 53 43 47 52 41 ┆cussions array */ #define DSCGRA┆ 0x04f200…09e600 49 4e 20 20 20 20 31 30 09 09 20 20 20 20 2f 2a 20 64 69 73 63 75 73 73 69 6f 6e 73 20 61 6c 6c ┆IN 10 /* discussions all┆ 0x04f200…09e600 6f 63 61 74 69 6f 6e 20 63 68 75 6e 6b 20 73 69 7a 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 43 4f ┆ocation chunk size */ #define CO┆ 0x04f200…09e600 4d 43 49 4e 49 54 20 20 20 20 32 30 09 09 20 20 20 20 2f 2a 20 69 6e 69 74 69 61 6c 20 73 69 7a ┆MCINIT 20 /* initial siz┆ 0x04f200…09e600 65 20 6f 66 20 63 6f 6d 6d 65 6e 74 73 20 61 72 72 61 79 20 2a 2f 0a 23 64 65 66 69 6e 65 20 43 ┆e of comments array */ #define C┆ 0x04f200…09e600 4f 4d 43 47 52 41 49 4e 20 20 20 31 30 09 09 20 20 20 20 2f 2a 20 63 6f 6d 6d 65 6e 74 73 20 61 ┆OMCGRAIN 10 /* comments a┆ 0x04f200…09e600 6c 6c 6f 63 61 74 69 6f 6e 20 63 68 75 6e 6b 20 73 69 7a 65 20 2a 2f 0a 0a 2f 2a 0a 20 2a 20 54 ┆llocation chunk size */ /* * T┆ 0x04f200…09e600 68 69 73 20 6d 6f 64 75 6c 65 20 6d 61 6e 61 67 65 73 20 61 20 63 61 6c 6c 6f 63 27 64 20 61 72 ┆his module manages a calloc'd ar┆ 0x04f200…09e600 65 61 20 6f 66 20 61 63 74 69 76 65 20 61 6e 64 20 73 75 62 73 63 72 69 62 65 72 20 69 6e 66 6f ┆ea of active and subscriber info┆ 0x04f200…09e600 72 6d 61 74 69 6f 6e 0a 20 2a 20 61 63 63 65 73 73 65 64 20 61 73 20 74 68 65 20 61 72 72 61 79 ┆rmation * accessed as the array┆ 0x04f200…09e600 20 6e 65 77 73 67 72 6f 75 70 73 5b 5d 20 6f 66 20 67 72 6f 75 70 5f 74 20 73 74 72 75 63 74 75 ┆ newsgroups[] of group_t structu┆ 0x04f200…09e600 72 65 73 20 28 73 65 65 20 61 63 74 69 76 65 2e 68 29 2e 0a 20 2a 20 54 68 65 20 72 64 61 63 74 ┆res (see active.h). * The rdact┆ 0x04f200…09e600 69 76 65 28 29 2c 20 77 72 61 63 74 69 76 65 28 29 2c 20 72 64 6e 65 77 73 72 63 28 29 20 61 6e ┆ive(), wractive(), rdnewsrc() an┆ 0x04f200…09e600 64 20 77 72 6e 65 77 73 72 63 28 29 20 66 75 6e 63 74 69 6f 6e 73 20 69 6d 70 6f 72 74 0a 20 2a ┆d wrnewsrc() functions import *┆ 0x04f200…09e600 20 61 6e 64 20 65 78 70 6f 72 74 20 74 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 2f ┆ and export this information to/┆ 0x04f200…09e600 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 79 73 74 65 6d 2e 0a 20 2a 2f 0a 2f 2a 20 6f 74 68 ┆from the file system. */ /* oth┆ 0x04f200…09e600 65 72 20 6d 6f 64 75 6c 65 73 20 6e 65 65 64 20 74 6f 20 73 65 65 20 74 68 65 73 65 20 2a 2f 0a ┆er modules need to see these */ ┆ 0x04f200…09e600 63 68 61 72 09 2a 41 43 54 49 56 45 3b 09 2f 2a 20 74 68 65 20 61 63 74 69 76 65 20 66 69 6c 65 ┆char *ACTIVE; /* the active file┆ 0x04f200…09e600 20 2a 2f 0a 61 63 74 69 76 65 5f 74 09 61 63 74 69 76 65 3b 09 2f 2a 20 73 65 73 73 69 6f 6e 20 ┆ */ active_t active; /* session ┆ 0x04f200…09e600 61 63 74 69 76 65 2d 67 72 6f 75 70 73 20 61 72 72 61 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 ┆active-groups array information ┆ 0x04f200…09e600 2a 2f 0a 69 6e 74 09 72 64 61 63 74 63 6f 75 6e 74 20 3d 20 30 3b 09 2f 2a 20 6e 7a 20 69 66 20 ┆*/ int rdactcount = 0; /* nz if ┆ 0x04f200…09e600 61 63 74 69 76 65 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20 72 65 61 64 20 2a 2f 0a 0a 70 72 ┆active file has been read */ pr┆ 0x04f200…09e600 69 76 61 74 65 20 63 68 61 72 09 2a 67 72 70 6e 61 6d 65 73 3b 09 2f 2a 20 70 6f 6f 6c 20 73 70 ┆ivate char *grpnames; /* pool sp┆ 0x04f200…09e600 61 63 65 20 66 6f 72 20 67 72 6f 75 70 20 6e 61 6d 65 73 20 2a 2f 0a 70 72 69 76 61 74 65 20 63 ┆ace for group names */ private c┆ 0x04f200…09e600 68 61 72 09 2a 6e 70 3b 09 09 2f 2a 20 70 6f 6f 6c 20 70 6f 69 6e 74 65 72 20 66 6f 72 20 67 72 ┆har *np; /* pool pointer for gr┆ 0x04f200…09e600 6f 75 70 20 6e 61 6d 65 73 20 2a 2f 0a 0a 23 69 66 64 65 66 20 48 41 53 48 47 52 4f 55 50 53 0a ┆oup names */ #ifdef HASHGROUPS ┆ 0x04f200…09e600 2f 2a 0a 20 2a 20 53 65 74 20 75 70 20 68 61 73 68 20 61 63 63 65 73 73 20 66 6f 72 20 6e 65 77 ┆/* * Set up hash access for new┆ 0x04f200…09e600 73 67 72 6f 75 70 20 6e 61 6d 65 73 2c 20 73 65 65 20 74 68 65 20 63 6f 64 65 20 69 6e 20 72 64 ┆sgroup names, see the code in rd┆ 0x04f200…09e600 61 63 74 69 76 65 28 29 20 61 6e 64 0a 20 2a 20 6e 67 66 69 6e 64 28 29 20 62 65 6c 6f 77 2e 20 ┆active() and * ngfind() below. ┆ 0x04f200…09e600 54 68 69 73 20 63 6f 64 65 20 68 61 73 20 62 65 65 6e 20 64 69 6e 6b 65 64 20 74 6f 20 61 20 73 ┆This code has been dinked to a s┆ 0x04f200…09e600 74 61 74 65 20 6f 66 20 75 6e 63 6f 6d 66 6f 72 74 61 62 6c 65 0a 20 2a 20 74 72 69 63 6b 69 6e ┆tate of uncomfortable * trickin┆ 0x04f200…09e600 65 73 73 20 62 65 63 61 75 73 65 20 6e 67 66 69 6e 64 28 29 20 69 73 20 73 75 63 68 20 61 20 68 ┆ess because ngfind() is such a h┆ 0x04f200…09e600 6f 74 20 73 70 6f 74 2c 20 62 65 77 61 72 65 20 6f 66 20 69 74 20 61 6e 64 20 64 6f 6e 27 74 0a ┆ot spot, beware of it and don't ┆ 0x04f200…09e600 20 2a 20 6d 65 73 73 20 77 69 74 68 20 69 74 20 75 6e 6c 65 73 73 20 79 6f 75 27 72 65 20 73 75 ┆ * mess with it unless you're su┆ 0x04f200…09e600 72 65 20 79 6f 75 20 6b 6e 6f 77 20 77 68 61 74 20 79 6f 75 27 72 65 20 64 6f 69 6e 67 2e 0a 20 ┆re you know what you're doing. ┆ 0x04f200…09e600 2a 0a 20 2a 20 54 68 65 20 62 61 73 69 63 20 69 64 65 61 20 69 73 20 74 6f 20 68 61 73 68 20 74 ┆* * The basic idea is to hash t┆ 0x04f200…09e600 68 65 20 6e 65 77 73 67 72 6f 75 70 20 6e 61 6d 65 20 74 6f 20 61 20 62 75 63 6b 65 74 20 69 6e ┆he newsgroup name to a bucket in┆ 0x04f200…09e600 64 65 78 3b 20 65 61 63 68 0a 20 2a 20 62 75 63 6b 65 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 ┆dex; each * bucket contains the┆ 0x04f200…09e600 20 68 65 61 64 20 6f 66 20 61 20 73 68 6f 72 74 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 77 68 69 ┆ head of a short linked list whi┆ 0x04f200…09e600 63 68 20 77 65 20 63 61 6e 20 67 72 6f 76 65 6c 0a 20 2a 20 74 68 72 6f 75 67 68 20 71 75 69 63 ┆ch we can grovel * through quic┆ 0x04f200…09e600 6b 6c 79 2e 20 57 65 20 77 69 6e 20 69 66 20 74 68 65 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e ┆kly. We win if the hash function┆ 0x04f200…09e600 20 6f 76 65 72 68 65 61 64 20 70 6c 75 73 20 74 68 65 20 74 72 61 76 65 72 73 65 0a 20 2a 20 61 ┆ overhead plus the traverse * a┆ 0x04f200…09e600 6e 64 20 73 74 72 63 6d 70 28 29 20 74 69 6d 65 20 66 6f 72 20 74 68 65 20 61 76 65 72 61 67 65 ┆nd strcmp() time for the average┆ 0x04f200…09e600 20 6c 69 73 74 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20 6c 69 6e 65 61 72 20 73 65 ┆ list is less than the linear se┆ 0x04f200…09e600 61 72 63 68 20 74 69 6d 65 0a 20 2a 20 77 6f 75 6c 64 20 62 65 2e 20 57 69 74 68 20 61 6e 79 20 ┆arch time * would be. With any ┆ 0x04f200…09e600 72 65 61 73 6f 6e 61 62 6c 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 75 63 6b 65 74 73 20 61 6c 6c ┆reasonable number of buckets all┆ 0x04f200…09e600 6f 63 61 74 65 64 20 74 68 69 73 20 77 69 6c 6c 20 6e 65 61 72 6c 79 0a 20 2a 20 61 6c 77 61 79 ┆ocated this will nearly * alway┆ 0x04f200…09e600 73 20 62 65 20 74 72 75 65 2e 0a 20 2a 0a 20 2a 20 57 65 20 75 73 65 20 74 68 65 20 43 52 43 20 ┆s be true. * * We use the CRC ┆ 0x04f200…09e600 68 61 73 68 20 66 72 6f 6d 20 74 68 65 20 70 6f 72 74 20 6c 69 62 72 61 72 79 20 62 65 63 61 75 ┆hash from the port library becau┆ 0x04f200…09e600 73 65 20 69 74 27 73 20 68 61 6e 64 79 20 61 6e 64 0a 20 2a 20 63 68 65 61 70 20 28 61 62 6f 75 ┆se it's handy and * cheap (abou┆ 0x04f200…09e600 74 20 36 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 70 65 72 20 63 68 61 72 61 63 74 65 72 29 2e ┆t 6 instructions per character).┆ 0x04f200…09e600 20 54 68 65 20 65 64 62 6d 20 68 61 73 68 20 6d 69 67 68 74 20 67 69 76 65 0a 20 2a 20 62 65 74 ┆ The edbm hash might give * bet┆ 0x04f200…09e600 74 65 72 20 64 69 73 74 72 69 62 75 74 69 6f 6e 2c 20 62 75 74 20 69 73 20 6d 6f 72 65 20 65 78 ┆ter distribution, but is more ex┆ 0x04f200…09e600 70 65 6e 73 69 76 65 20 74 6f 20 63 6f 6d 70 75 74 65 3b 20 61 6e 64 20 63 6f 6c 6c 69 73 69 6f ┆pensive to compute; and collisio┆ 0x04f200…09e600 6e 73 0a 20 2a 20 64 6f 6e 27 74 20 63 6f 73 74 20 61 73 20 6d 75 63 68 20 68 65 72 65 2e 0a 20 ┆ns * don't cost as much here. ┆ 0x04f200…09e600 2a 0a 20 2a 20 4d 65 6d 6f 72 79 20 63 61 6e 20 62 65 20 74 72 61 64 65 64 20 66 6f 72 20 73 70 ┆* * Memory can be traded for sp┆ 0x04f200…09e600 65 65 64 20 62 79 20 62 6f 6f 73 74 69 6e 67 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 4d 41 58 ┆eed by boosting the value of MAX┆ 0x04f200…09e600 42 55 43 4b 45 54 53 2e 0a 20 2a 20 47 6f 6f 64 20 76 61 6c 75 65 73 20 61 72 65 20 70 72 69 6d ┆BUCKETS. * Good values are prim┆ 0x04f200…09e600 65 20 6e 75 6d 62 65 72 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 79 6f 75 72 20 6d 61 78 69 ┆e numbers greater than your maxi┆ 0x04f200…09e600 6d 75 6d 20 65 78 70 65 63 74 65 64 20 6e 75 6d 62 65 72 0a 20 2a 20 6f 66 20 6e 65 77 73 67 72 ┆mum expected number * of newsgr┆ 0x04f200…09e600 6f 75 70 73 3b 20 6c 61 72 67 65 72 20 6f 6e 65 73 20 74 65 6e 64 73 20 74 6f 20 6d 61 6b 65 20 ┆oups; larger ones tends to make ┆ 0x04f200…09e600 61 6c 6c 20 63 68 61 69 6e 73 20 73 68 6f 72 74 20 61 6e 64 20 73 65 61 72 63 68 0a 20 2a 20 74 ┆all chains short and search * t┆ 0x04f200…09e600 69 6d 65 20 61 70 70 72 6f 61 63 68 20 4f 28 31 29 2e 20 41 6c 6c 6f 77 20 73 6f 6d 65 20 73 6c ┆ime approach O(1). Allow some sl┆ 0x04f200…09e600 6f 70 20 66 6f 72 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20 74 68 65 20 68 61 73 68 20 66 75 ┆op for the fact that the hash fu┆ 0x04f200…09e600 6e 63 74 69 6f 6e 0a 20 2a 20 69 73 6e 27 74 20 70 65 72 66 65 63 74 2e 0a 20 2a 0a 20 2a 20 54 ┆nction * isn't perfect. * * T┆ 0x04f200…09e600 68 65 20 70 75 72 70 6f 73 65 20 6f 66 20 74 68 65 20 66 6f 72 5f 68 61 73 68 28 29 20 6d 61 63 ┆he purpose of the for_hash() mac┆ 0x04f200…09e600 72 6f 20 69 73 20 74 6f 20 6d 61 6b 65 20 69 74 20 65 61 73 79 20 74 6f 20 63 68 61 6e 67 65 20 ┆ro is to make it easy to change ┆ 0x04f200…09e600 74 68 65 20 68 61 73 68 0a 20 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 74 6f 20 68 69 64 65 ┆the hash * function and to hide┆ 0x04f200…09e600 20 74 68 65 20 64 65 74 61 69 6c 73 20 6f 66 20 74 68 65 20 68 61 73 68 20 6c 69 73 74 20 74 72 ┆ the details of the hash list tr┆ 0x04f200…09e600 61 76 65 72 73 61 6c 2e 0a 20 2a 0a 20 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 6d 61 63 ┆aversal. * * Note that the mac┆ 0x04f200…09e600 72 6f 27 73 20 66 69 72 73 74 20 61 72 67 20 6d 75 73 74 20 62 65 20 6f 66 20 74 79 70 65 20 28 ┆ro's first arg must be of type (┆ 0x04f200…09e600 67 72 6f 75 70 5f 74 20 2a 2a 29 2c 20 70 6f 69 6e 74 65 72 20 74 6f 0a 20 2a 20 70 6f 69 6e 74 ┆group_t **), pointer to * point┆ 0x04f200…09e600 65 72 20 74 6f 20 67 72 6f 75 70 2c 20 61 6e 64 20 6d 75 73 74 20 62 65 20 64 65 72 65 66 65 72 ┆er to group, and must be derefer┆ 0x04f200…09e600 65 6e 63 65 64 20 6f 6e 63 65 20 74 6f 20 67 65 74 20 61 74 20 61 63 74 75 61 6c 20 67 72 6f 75 ┆enced once to get at actual grou┆ 0x04f200…09e600 70 20 64 61 74 61 2e 0a 20 2a 0a 20 2a 20 57 61 72 6e 69 6e 67 3a 20 74 68 65 20 66 6f 72 5f 68 ┆p data. * * Warning: the for_h┆ 0x04f200…09e600 61 73 68 28 29 20 6d 61 63 72 6f 20 77 69 6c 6c 20 66 61 69 6c 20 68 69 64 65 6f 75 73 6c 79 20 ┆ash() macro will fail hideously ┆ 0x04f200…09e600 69 66 20 74 68 65 20 6e 65 77 73 67 72 6f 75 70 20 72 65 63 6f 72 64 0a 20 2a 20 61 6c 6c 6f 63 ┆if the newsgroup record * alloc┆ 0x04f200…09e600 61 74 6f 72 20 66 61 69 6c 73 20 74 6f 20 7a 65 72 6f 20 6f 75 74 20 74 68 65 20 6c 69 6e 6b 20 ┆ator fails to zero out the link ┆ 0x04f200…09e600 69 6e 64 65 78 20 66 69 65 6c 64 2c 20 6f 72 20 69 66 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 ┆index field, or if the compiler ┆ 0x04f200…09e600 66 61 69 6c 73 0a 20 2a 20 74 6f 20 69 6e 69 74 69 61 6c 6c 79 20 7a 65 72 6f 20 6f 75 74 20 74 ┆fails * to initially zero out t┆ 0x04f200…09e600 68 65 20 62 75 63 6b 65 74 73 5b 5d 20 61 72 72 61 79 2e 0a 20 2a 0a 20 2a 20 50 72 6f 66 69 6c ┆he buckets[] array. * * Profil┆ 0x04f200…09e600 69 6e 67 20 73 68 6f 77 73 20 74 68 61 74 20 61 20 4d 41 58 42 55 43 4b 45 54 53 20 76 61 6c 75 ┆ing shows that a MAXBUCKETS valu┆ 0x04f200…09e600 65 20 6f 66 20 32 30 30 37 20 28 61 62 6f 75 74 20 61 6e 20 38 4b 20 62 75 63 6b 65 74 20 6c 69 ┆e of 2007 (about an 8K bucket li┆ 0x04f200…09e600 73 74 29 0a 20 2a 20 69 73 20 67 6f 6f 64 20 66 6f 72 20 61 62 6f 75 74 20 61 20 33 35 30 25 20 ┆st) * is good for about a 350% ┆ 0x04f200…09e600 73 70 65 65 64 20 69 6e 63 72 65 61 73 65 20 6f 76 65 72 20 74 68 65 20 6c 69 6e 65 61 72 2d 73 ┆speed increase over the linear-s┆ 0x04f200…09e600 65 61 72 63 68 20 76 65 72 73 69 6f 6e 2e 20 41 74 0a 20 2a 20 63 2e 33 33 30 20 67 72 6f 75 70 ┆earch version. At * c.330 group┆ 0x04f200…09e600 73 20 74 68 65 72 65 20 61 72 65 20 6f 6e 6c 79 20 61 20 68 61 6e 64 66 75 6c 20 6f 66 20 63 6f ┆s there are only a handful of co┆ 0x04f200…09e600 6c 6c 69 73 69 6f 6e 73 2c 20 73 6f 20 69 74 27 73 20 70 72 6f 62 61 62 6c 79 20 6e 6f 74 0a 20 ┆llisions, so it's probably not ┆ 0x04f200…09e600 2a 20 77 6f 72 74 68 20 67 6f 69 6e 67 20 74 6f 20 68 69 67 68 65 72 20 70 72 69 6d 65 73 20 79 ┆* worth going to higher primes y┆ 0x04f200…09e600 65 74 2e 0a 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 41 58 42 55 43 4b 45 54 53 09 32 30 30 37 0a ┆et. */ #define MAXBUCKETS 2007 ┆ 0x04f200…09e600 73 74 61 74 69 63 20 69 6e 74 20 62 75 63 6b 65 74 73 5b 4d 41 58 42 55 43 4b 45 54 53 5d 3b 0a ┆static int buckets[MAXBUCKETS]; ┆ 0x04f200…09e600 23 64 65 66 69 6e 65 20 66 6f 72 5f 68 61 73 68 28 62 2c 20 73 29 09 66 6f 72 20 28 62 20 3d 20 ┆#define for_hash(b, s) for (b = ┆ 0x04f200…09e600 26 62 75 63 6b 65 74 73 5b 63 68 65 63 6b 73 74 72 69 6e 67 28 73 2c 28 75 6c 6f 6e 67 29 30 4c ┆&buckets[checkstring(s,(ulong)0L┆ 0x04f200…09e600 29 20 25 20 4d 41 58 42 55 43 4b 45 54 53 5d 3b 20 2a 62 3b 20 62 20 3d 20 26 28 61 63 74 69 76 ┆) % MAXBUCKETS]; *b; b = &(activ┆ 0x04f200…09e600 65 2e 6e 65 77 73 67 72 6f 75 70 73 5b 2a 62 5d 2e 6e 67 5f 6e 65 78 74 67 29 29 0a 23 65 6e 64 ┆e.newsgroups[*b].ng_nextg)) #end┆ 0x04f200…09e600 69 66 20 2f 2a 20 48 41 53 48 47 52 4f 55 50 53 20 2a 2f 0a 0a 70 72 69 76 61 74 65 20 69 6e 74 ┆if /* HASHGROUPS */ private int┆ 0x04f200…09e600 20 6e 67 72 65 61 64 28 62 75 66 2c 20 6e 67 70 29 0a 2f 2a 20 72 65 61 64 20 61 20 73 69 6e 67 ┆ ngread(buf, ngp) /* read a sing┆ 0x04f200…09e600 6c 65 20 67 72 6f 75 70 20 72 65 63 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e 74 ┆le group record from the current┆ 0x04f200…09e600 20 66 69 6c 65 20 69 6e 74 6f 20 61 20 67 72 6f 75 70 5f 74 20 2a 2f 0a 63 68 61 72 09 20 20 20 ┆ file into a group_t */ char ┆ 0x04f200…09e600 20 2a 62 75 66 3b 0a 67 72 6f 75 70 5f 74 09 20 20 20 20 2a 6e 67 70 3b 0a 7b 0a 20 20 20 20 69 ┆ *buf; group_t *ngp; { i┆ 0x04f200…09e600 6e 74 09 09 72 73 74 61 74 3b 0a 20 20 20 20 63 68 61 72 09 66 6c 61 67 66 6c 64 5b 31 30 5d 3b ┆nt rstat; char flagfld[10];┆ 0x04f200…09e600 0a 0a 20 20 20 20 6e 67 70 2d 3e 6e 67 5f 61 67 65 20 3d 20 4e 4f 5f 41 47 45 3b 0a 0a 20 20 20 ┆ ngp->ng_age = NO_AGE; ┆ 0x04f200…09e600 20 2f 2a 0a 20 20 20 20 20 2a 20 57 41 52 4e 49 4e 47 3a 20 64 65 73 70 69 74 65 20 74 68 65 20 ┆ /* * WARNING: despite the ┆ 0x04f200…09e600 73 69 7a 65 2d 69 6e 64 65 70 65 6e 64 65 6e 74 20 61 70 70 65 61 72 61 6e 63 65 20 6f 66 20 74 ┆size-independent appearance of t┆ 0x04f200…09e600 68 69 73 20 63 6f 64 65 2c 0a 20 20 20 20 20 2a 20 74 68 65 20 6f 75 74 70 75 74 20 66 6f 72 6d ┆his code, * the output form┆ 0x04f200…09e600 61 74 20 75 73 65 64 20 69 6e 20 77 72 61 63 74 69 76 65 2e 63 3a 6e 67 73 68 6f 77 28 29 20 6d ┆at used in wractive.c:ngshow() m┆ 0x04f200…09e600 65 61 6e 73 20 77 65 20 61 72 65 20 6c 69 6b 65 6c 79 0a 20 20 20 20 20 2a 20 74 6f 20 6c 6f 73 ┆eans we are likely * to los┆ 0x04f200…09e600 65 20 6d 61 73 73 69 76 65 6c 79 20 6f 6e 20 61 20 6d 61 63 68 69 6e 65 20 77 69 74 68 20 73 69 ┆e massively on a machine with si┆ 0x04f200…09e600 7a 65 6f 66 28 6c 6f 6e 67 29 20 3c 20 34 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 72 73 74 61 74 ┆zeof(long) < 4 */ rstat┆ 0x04f200…09e600 20 3d 20 73 73 63 61 6e 66 28 62 75 66 2c 0a 23 69 66 64 65 66 20 42 49 47 47 52 4f 55 50 53 0a ┆ = sscanf(buf, #ifdef BIGGROUPS ┆ 0x04f200…09e600 09 09 22 25 6c 64 20 25 6c 64 20 25 73 20 25 6c 78 22 2c 0a 23 65 6c 73 65 0a 09 09 22 25 64 20 ┆ "%ld %ld %s %lx", #else "%d ┆ 0x04f200…09e600 25 64 20 25 73 20 25 6c 78 22 2c 0a 23 65 6e 64 69 66 20 2f 2a 20 42 49 47 47 52 4f 55 50 53 20 ┆%d %s %lx", #endif /* BIGGROUPS ┆ 0x04f200…09e600 2a 2f 0a 09 09 26 28 6e 67 70 2d 3e 6e 67 5f 6d 61 78 29 2c 20 26 28 6e 67 70 2d 3e 6e 67 5f 6d ┆*/ &(ngp->ng_max), &(ngp->ng_m┆ 0x04f200…09e600 69 6e 29 2c 0a 09 09 66 6c 61 67 66 6c 64 2c 20 26 28 6e 67 70 2d 3e 6e 67 5f 61 67 65 29 29 3b ┆in), flagfld, &(ngp->ng_age));┆ 0x04f200…09e600 0a 20 20 20 20 69 66 20 28 72 73 74 61 74 20 21 3d 20 33 20 26 26 20 72 73 74 61 74 20 21 3d 20 ┆ if (rstat != 3 && rstat != ┆ 0x04f200…09e600 34 29 0a 09 78 65 72 72 6f 72 32 28 22 41 63 74 69 76 65 20 66 69 6c 65 20 69 73 20 63 6f 72 72 ┆4) xerror2("Active file is corr┆ 0x04f200…09e600 75 70 74 2c 20 73 74 61 74 75 73 20 3d 20 25 64 2c 20 6c 69 6e 65 20 3d 20 25 73 22 2c 20 72 73 ┆upt, status = %d, line = %s", rs┆ 0x04f200…09e600 74 61 74 2c 20 62 66 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20 61 6c 6c 20 73 74 61 74 75 ┆tat, bfr); /* set all statu┆ 0x04f200…09e600 73 20 66 6c 61 67 73 20 74 68 61 74 20 77 65 20 63 61 6e 20 64 65 64 75 63 65 20 66 72 6f 6d 20 ┆s flags that we can deduce from ┆ 0x04f200…09e600 74 68 65 20 61 63 74 69 76 65 20 66 69 6c 65 20 65 6e 74 72 79 20 2a 2f 0a 20 20 20 20 6e 67 70 ┆the active file entry */ ngp┆ 0x04f200…09e600 2d 3e 6e 67 5f 66 6c 61 67 73 20 3d 20 28 62 69 74 73 5f 74 29 30 3b 0a 20 20 20 20 69 66 20 28 ┆->ng_flags = (bits_t)0; if (┆ 0x04f200…09e600 73 74 72 63 68 72 28 66 6c 61 67 66 6c 64 2c 20 27 6d 27 29 29 0a 09 6e 67 70 2d 3e 6e 67 5f 66 ┆strchr(flagfld, 'm')) ngp->ng_f┆ 0x04f200…09e600 6c 61 67 73 20 7c 3d 20 4e 47 5f 4d 4f 44 45 52 41 54 45 44 3b 0a 20 20 20 20 69 66 20 28 21 73 ┆lags |= NG_MODERATED; if (!s┆ 0x04f200…09e600 74 72 63 68 72 28 6e 67 70 2d 3e 6e 67 5f 6e 61 6d 65 2c 20 4e 47 53 45 50 29 29 0a 09 6e 67 70 ┆trchr(ngp->ng_name, NGSEP)) ngp┆ 0x04f200…09e600 2d 3e 6e 67 5f 66 6c 61 67 73 20 7c 3d 20 4e 47 5f 4c 4f 43 41 4c 3b 0a 0a 20 20 20 20 6e 67 70 ┆->ng_flags |= NG_LOCAL; ngp┆ 0x04f200…09e600 2d 3e 6e 67 5f 65 78 70 69 72 65 20 3d 20 28 74 69 6d 65 5f 74 29 30 3b 0a 0a 20 20 20 20 2f 2a ┆->ng_expire = (time_t)0; /*┆ 0x04f200…09e600 0a 20 20 20 20 20 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6c 69 6e 65 73 20 61 72 65 20 ┆ * The following lines are ┆ 0x04f200…09e600 6a 75 73 74 20 68 65 72 65 20 74 6f 20 73 65 72 76 65 20 61 73 0a 20 20 20 20 20 2a 20 69 6e 73 ┆just here to serve as * ins┆ 0x04f200…09e600 75 72 61 6e 63 65 20 61 67 61 69 6e 73 74 20 72 65 61 6c 6c 6f 63 28 29 20 66 75 6e 63 74 69 6f ┆urance against realloc() functio┆ 0x04f200…09e600 6e 73 20 74 68 61 74 20 64 6f 6e 27 74 20 7a 65 72 6f 20 74 68 69 6e 67 73 0a 20 20 20 20 20 2a ┆ns that don't zero things *┆ 0x04f200…09e600 2f 0a 23 69 66 64 65 66 20 48 41 53 48 47 52 4f 55 50 53 0a 20 20 20 20 6e 67 70 2d 3e 6e 67 5f ┆/ #ifdef HASHGROUPS ngp->ng_┆ 0x04f200…09e600 6e 65 78 74 67 20 3d 20 30 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 48 41 53 48 47 52 4f 55 50 53 20 ┆nextg = 0; #endif /* HASHGROUPS ┆ 0x04f200…09e600 2a 2f 0a 23 69 66 64 65 66 20 46 45 45 44 42 49 54 53 0a 20 20 20 20 2f 2a 20 66 6f 6c 6c 6f 77 ┆*/ #ifdef FEEDBITS /* follow┆ 0x04f200…09e600 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 76 61 6c 69 64 20 6f 6e 6c 79 20 61 66 74 65 72 ┆ing information valid only after┆ 0x04f200…09e600 20 61 20 66 65 65 64 62 69 74 73 28 29 20 2a 2f 0a 20 20 20 20 6e 67 70 2d 3e 6e 67 5f 66 65 65 ┆ a feedbits() */ ngp->ng_fee┆ 0x04f200…09e600 64 73 20 3d 20 28 62 69 74 73 5f 74 29 30 3b 09 2f 2a 20 73 75 62 73 63 72 69 70 74 69 6f 6e 20 ┆ds = (bits_t)0; /* subscription ┆ 0x04f200…09e600 62 69 74 73 20 66 6f 72 20 6e 65 77 73 20 66 65 65 64 73 20 2a 2f 0a 23 65 6e 64 69 66 09 2f 2a ┆bits for news feeds */ #endif /*┆ 0x04f200…09e600 20 46 45 45 44 42 49 54 53 20 2a 2f 0a 20 20 20 20 6e 67 70 2d 3e 72 63 5f 66 6c 61 67 73 20 3d ┆ FEEDBITS */ ngp->rc_flags =┆ 0x04f200…09e600 20 28 62 69 74 73 5f 74 29 30 3b 0a 20 20 20 20 6e 67 70 2d 3e 72 63 5f 73 65 65 6e 20 3d 20 28 ┆ (bits_t)0; ngp->rc_seen = (┆ 0x04f200…09e600 75 63 68 61 72 20 2a 29 4e 55 4c 4c 3b 0a 0a 20 20 20 20 2f 2a 20 74 68 69 73 20 68 61 73 20 74 ┆uchar *)NULL; /* this has t┆ 0x04f200…09e600 6f 20 62 65 20 64 6f 6e 65 20 68 65 72 65 2c 20 62 65 63 61 75 73 65 20 72 64 6e 65 77 73 72 63 ┆o be done here, because rdnewsrc┆ 0x04f200…09e600 28 29 20 77 6f 6e 27 74 20 73 65 65 20 61 6c 6c 20 67 72 6f 75 70 73 20 2a 2f 0a 20 20 20 20 6e ┆() won't see all groups */ n┆ 0x04f200…09e600 67 70 2d 3e 6e 67 5f 75 6e 72 65 61 64 20 3d 20 28 6e 67 70 2d 3e 6e 67 5f 6d 61 78 20 2d 20 6e ┆gp->ng_unread = (ngp->ng_max - n┆ 0x04f200…09e600 67 70 2d 3e 6e 67 5f 6d 69 6e 29 20 2b 20 31 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e 28 53 55 43 ┆gp->ng_min) + 1; return(SUC┆ 0x04f200…09e600 43 45 45 44 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 48 41 53 48 47 52 4f 55 50 53 0a 2f 2a 41 ┆CEED); } #ifndef HASHGROUPS /*A┆ 0x04f200…09e600 52 47 53 55 53 45 44 30 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 48 41 53 48 47 52 4f 55 50 53 20 ┆RGSUSED0*/ #endif /* HASHGROUPS ┆ 0x04f200…09e600 2a 2f 0a 67 72 6f 75 70 5f 74 20 2a 6e 67 61 6c 6c 6f 63 28 6e 61 6d 65 29 0a 2f 2a 20 72 65 74 ┆*/ group_t *ngalloc(name) /* ret┆ 0x04f200…09e600 75 72 6e 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6c 6c 6f 63 61 74 65 64 20 73 70 61 63 65 20 66 ┆urn pointer to allocated space f┆ 0x04f200…09e600 6f 72 20 6e 65 77 20 67 72 6f 75 70 20 72 65 63 6f 72 64 20 2a 2f 0a 72 65 67 69 73 74 65 72 20 ┆or new group record */ register ┆ 0x04f200…09e600 63 68 61 72 09 2a 6e 61 6d 65 3b 0a 7b 0a 20 20 20 20 73 74 61 74 69 63 20 67 72 6f 75 70 5f 74 ┆char *name; { static group_t┆ 0x04f200…09e600 09 2a 6e 67 70 20 3d 20 28 67 72 6f 75 70 5f 74 20 2a 29 4e 55 4c 4c 3b 09 2f 2a 20 6e 65 78 74 ┆ *ngp = (group_t *)NULL; /* next┆ 0x04f200…09e600 2d 66 72 65 65 2d 73 6c 6f 74 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20 73 74 61 74 69 63 ┆-free-slot pointer */ static┆ 0x04f200…09e600 20 69 6e 74 09 09 67 63 20 3d 20 30 3b 09 09 09 2f 2a 20 6e 75 6d 62 65 72 20 6f 66 20 73 6c 6f ┆ int gc = 0; /* number of slo┆ 0x04f200…09e600 74 73 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 23 69 66 64 65 66 20 48 41 53 48 47 52 4f 55 50 ┆ts allocated */ #ifdef HASHGROUP┆ 0x04f200…09e600 53 0a 20 20 20 20 72 65 67 69 73 74 65 72 20 69 6e 74 09 2a 62 75 63 6b 65 74 3b 0a 23 65 6e 64 ┆S register int *bucket; #end┆ 0x04f200…09e600 69 66 20 2f 2a 20 48 41 53 48 47 52 4f 55 50 53 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f ┆if /* HASHGROUPS */ /* allo┆ 0x04f200…09e600 63 61 74 65 20 69 6e 69 74 69 61 6c 20 73 70 61 63 65 20 66 6f 72 20 64 61 74 61 20 6f 6e 20 6e ┆cate initial space for data on n┆ 0x04f200…09e600 65 77 73 67 72 6f 75 70 73 20 2a 2f 0a 23 69 66 6e 64 65 66 20 6c 69 6e 74 0a 20 20 20 20 69 66 ┆ewsgroups */ #ifndef lint if┆ 0x04f200…09e600 20 28 67 63 20 3d 3d 20 30 29 0a 09 6e 67 70 20 3d 20 61 63 74 69 76 65 2e 6e 65 77 73 67 72 6f ┆ (gc == 0) ngp = active.newsgro┆ 0x04f200…09e600 75 70 73 20 3d 0a 09 20 20 20 20 28 67 72 6f 75 70 5f 74 20 2a 29 20 63 61 6c 6c 6f 63 28 28 75 ┆ups = (group_t *) calloc((u┆ 0x04f200…09e600 6e 73 69 67 6e 65 64 29 28 67 63 20 3d 20 47 52 50 43 49 4e 49 54 29 2c 0a 09 09 09 20 20 20 20 ┆nsigned)(gc = GRPCINIT), ┆ 0x04f200…09e600 20 20 20 28 75 6e 73 69 67 6e 65 64 29 20 73 69 7a 65 6f 66 28 67 72 6f 75 70 5f 74 29 29 3b 0a ┆ (unsigned) sizeof(group_t)); ┆ 0x04f200…09e600 23 65 6e 64 69 66 20 2f 2a 20 6c 69 6e 74 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 61 6e 64 20 61 6c ┆#endif /* lint */ /* and al┆ 0x04f200…09e600 6c 6f 63 20 6e 65 77 20 73 6c 6f 74 73 20 66 6f 72 20 67 72 6f 75 70 73 20 69 66 20 77 65 27 76 ┆loc new slots for groups if we'v┆ 0x04f200…09e600 65 20 72 75 6e 20 6f 75 74 20 6f 66 20 73 70 61 63 65 20 2a 2f 0a 20 20 20 20 69 66 20 28 6e 67 ┆e run out of space */ if (ng┆ 0x04f200…09e600 70 20 3e 3d 20 61 63 74 69 76 65 2e 6e 65 77 73 67 72 6f 75 70 73 20 2b 20 67 63 29 0a 20 20 20 ┆p >= active.newsgroups + gc) ┆ 0x04f200…09e600 20 7b 0a 09 69 6e 74 20 69 20 3d 20 6e 67 70 20 2d 20 61 63 74 69 76 65 2e 6e 65 77 73 67 72 6f ┆ { int i = ngp - active.newsgro┆ 0x04f200…09e600 75 70 73 3b 0a 0a 09 67 63 20 2b 3d 20 47 52 50 43 47 52 41 49 4e 3b 0a 23 69 66 6e 64 65 66 20 ┆ups; gc += GRPCGRAIN; #ifndef ┆ 0x04f200…09e600 6c 69 6e 74 0a 09 61 63 74 69 76 65 2e 6e 65 77 73 67 72 6f 75 70 73 20 3d 0a 09 20 20 20 20 28 ┆lint active.newsgroups = (┆ 0x04f200…09e600 67 72 6f 75 70 5f 74 20 2a 29 20 72 65 61 6c 6c 6f 63 28 28 63 68 61 72 20 2a 29 20 61 63 74 69 ┆group_t *) realloc((char *) acti┆ 0x04f200…09e600 76 65 2e 6e 65 77 73 67 72 6f 75 70 73 2c 0a 09 09 09 09 28 75 6e 73 69 67 6e 65 64 29 20 28 67 ┆ve.newsgroups, (unsigned) (g┆ 0x04f200…09e600 63 20 2a 20 73 69 7a 65 6f 66 28 67 72 6f 75 70 5f 74 29 29 29 3b 0a 23 65 6e 64 69 66 20 2f 2a ┆c * sizeof(group_t))); #endif /*┆ 0x04f200…09e600 20 6c 69 6e 74 20 2a 2f 0a 09 6e 67 70 20 3d 20 61 63 74 69 76 65 2e 6e 65 77 73 67 72 6f 75 70 ┆ lint */ ngp = active.newsgroup┆ 0x04f200…09e600 73 20 2b 20 69 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 48 41 53 48 47 52 4f 55 50 53 0a ┆s + i; } #ifdef HASHGROUPS ┆ 0x04f200…09e600 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 4e 6f 77 20 63 6f 6e 73 20 74 68 65 20 6e 65 77 20 72 ┆ /* * Now cons the new r┆ 0x04f200…09e600 65 63 6f 72 64 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 69 74 73 20 68 61 73 68 20 63 68 61 ┆ecord to the end of its hash cha┆ 0x04f200…09e600 69 6e 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 5f 68 61 73 68 28 62 75 63 6b 65 74 2c ┆in. */ for_hash(bucket,┆ 0x04f200…09e600 20 6e 61 6d 65 29 0a 09 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 62 75 63 6b 65 74 5b 30 5d 20 ┆ name) continue; bucket[0] ┆ 0x04f200…09e600 3d 20 6e 67 70 20 2d 20 61 63 74 69 76 65 2e 6e 65 77 73 67 72 6f 75 70 73 20 2b 20 31 3b 0a 23 ┆= ngp - active.newsgroups + 1; #┆ 0x04f200…09e600 65 6e 64 69 66 20 2f 2a 20 48 41 53 48 47 52 4f 55 50 53 20 2a 2f 0a 0a 20 20 20 20 6e 67 70 2b ┆endif /* HASHGROUPS */ ngp+┆ 0x04f200…09e600 2b 3b 0a 20 20 20 20 61 63 74 69 76 65 2e 6e 67 63 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 28 ┆+; active.ngc++; return(┆ 0x04f200…09e600 6e 67 70 20 2d 20 31 29 3b 0a 7d 0a 0a 69 6e 74 20 72 64 61 63 74 69 76 65 28 62 70 72 6f 63 29 ┆ngp - 1); } int rdactive(bproc)┆ 0x04f200…09e600 0a 2f 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 61 64 73 20 6f 72 20 75 70 64 61 74 ┆ /* this function reads or updat┆ 0x04f200…09e600 65 73 20 74 68 65 20 61 63 74 69 76 65 20 66 69 6c 65 20 69 6e 74 6f 20 74 68 65 20 6e 65 77 73 ┆es the active file into the news┆ 0x04f200…09e600 67 72 6f 75 70 73 20 61 72 72 61 79 20 2a 2f 0a 62 6f 6f 6c 09 28 2a 62 70 72 6f 63 29 28 29 3b ┆groups array */ bool (*bproc)();┆ 0x04f200…09e600 09 2f 2a 20 62 69 74 6d 61 70 2d 70 72 6f 63 65 73 73 69 6e 67 20 68 6f 6f 6b 20 2a 2f 0a 7b 0a ┆ /* bitmap-processing hook */ { ┆ 0x04f200…09e600 20 20 20 20 69 6e 74 09 09 63 68 61 6e 67 65 64 3b 0a 20 20 20 20 67 72 6f 75 70 5f 74 09 68 6f ┆ int changed; group_t ho┆ 0x04f200…09e600 6c 64 2c 20 2a 6e 65 77 67 72 70 3b 0a 20 20 20 20 73 74 61 74 69 63 20 6c 6f 6e 67 09 6c 6f 63 ┆ld, *newgrp; static long loc┆ 0x04f200…09e600 20 3d 20 30 3b 0a 20 20 20 20 72 65 67 69 73 74 65 72 20 63 68 61 72 20 2a 63 70 3b 0a 20 20 20 ┆ = 0; register char *cp; ┆ 0x04f200…09e600 20 63 68 61 72 09 2a 6f 6c 64 6e 61 6d 65 73 3b 0a 23 69 66 6e 64 65 66 20 4e 4f 4e 55 4e 49 58 ┆ char *oldnames; #ifndef NONUNIX┆ 0x04f200…09e600 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74 09 73 74 62 75 66 3b 0a 23 65 6e 64 69 66 20 2f ┆ struct stat stbuf; #endif /┆ 0x04f200…09e600 2a 20 4e 4f 4e 55 4e 49 58 20 2a 2f 0a 0a 23 69 66 64 65 66 20 4e 4f 4e 4c 4f 43 41 4c 0a 20 20 ┆* NONUNIX */ #ifdef NONLOCAL ┆ 0x04f200…09e600 20 20 69 66 20 28 61 63 74 69 76 65 2e 66 70 20 21 3d 20 28 46 49 4c 45 20 2a 29 4e 55 4c 4c 29 ┆ if (active.fp != (FILE *)NULL)┆ 0x04f200…09e600 0a 09 63 6c 73 61 63 74 69 76 65 28 29 3b 0a 20 20 20 20 41 43 54 49 56 45 20 3d 20 67 65 74 61 ┆ clsactive(); ACTIVE = geta┆ 0x04f200…09e600 63 74 69 76 65 28 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 69 66 20 28 41 43 54 49 56 45 20 3d 3d ┆ctive(); #else if (ACTIVE ==┆ 0x04f200…09e600 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 0a 09 53 70 72 69 6e 74 31 28 41 43 54 49 56 45 2c 20 ┆ (char *)NULL) Sprint1(ACTIVE, ┆ 0x04f200…09e600 22 25 73 2f 61 63 74 69 76 65 22 2c 20 73 69 74 65 2e 61 64 6d 64 69 72 29 3b 0a 23 65 6e 64 69 ┆"%s/active", site.admdir); #endi┆ 0x04f200…09e600 66 20 2f 2a 20 4e 4f 4e 4c 4f 43 41 4c 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 6f 70 65 6e 20 66 6f ┆f /* NONLOCAL */ /* open fo┆ 0x04f200…09e600 72 20 72 65 61 64 2d 77 72 69 74 65 20 69 66 20 77 65 20 63 61 6e 2c 20 66 6f 72 20 72 65 61 64 ┆r read-write if we can, for read┆ 0x04f200…09e600 2d 6f 6e 6c 79 20 69 66 20 77 65 20 6d 75 73 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 28 61 63 74 ┆-only if we must */ if ((act┆ 0x04f200…09e600 69 76 65 2e 66 70 20 3d 20 66 6f 70 65 6e 28 41 43 54 49 56 45 2c 20 22 72 2b 22 29 29 20 21 3d ┆ive.fp = fopen(ACTIVE, "r+")) !=┆ 0x04f200…09e600 20 28 46 49 4c 45 20 2a 29 4e 55 4c 4c 29 0a 20 20 20 20 7b 0a 23 69 66 64 65 66 20 55 53 47 0a ┆ (FILE *)NULL) { #ifdef USG ┆ 0x04f200…09e600 09 2f 2a 0a 09 20 2a 20 41 54 26 54 20 62 72 6f 6b 65 20 73 74 61 6e 64 61 72 64 20 49 4f 20 69 ┆ /* * AT&T broke standard IO i┆ 0x04f200…09e600 6e 20 53 79 73 74 65 6d 20 35 2e 32 2e 20 54 68 69 73 20 68 61 63 6b 20 77 6f 72 6b 73 0a 09 20 ┆n System 5.2. This hack works ┆ 0x04f200…09e600 2a 20 4f 4b 20 6f 6e 20 61 6c 6c 20 22 72 65 61 6c 22 20 55 53 47 20 55 6e 69 78 20 73 79 73 74 ┆* OK on all "real" USG Unix syst┆ 0x04f200…09e600 65 6d 73 2c 20 62 75 74 20 77 69 6c 6c 20 70 72 6f 62 61 62 6c 79 0a 09 20 2a 20 62 72 65 61 6b ┆ems, but will probably * break┆ 0x04f200…09e600 20 6f 6e 20 73 6f 6d 65 20 6f 62 73 63 75 72 65 20 6c 6f 6f 6b 61 6c 69 6b 65 20 74 68 61 74 20 ┆ on some obscure lookalike that ┆ 0x04f200…09e600 64 6f 65 73 6e 27 74 20 75 73 65 20 74 68 65 0a 09 20 2a 20 72 65 61 6c 20 41 54 54 20 73 74 64 ┆doesn't use the * real ATT std┆ 0x04f200…09e600 69 6f 2e 68 2e 20 54 68 65 20 73 74 64 69 6f 20 6c 69 62 72 61 72 79 20 73 68 6f 75 6c 64 20 68 ┆io.h. The stdio library should h┆ 0x04f200…09e600 61 76 65 0a 09 20 2a 20 61 6c 72 65 61 64 79 20 64 6f 6e 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69 ┆ave * already done the followi┆ 0x04f200…09e600 6e 67 20 6c 69 6e 65 20 66 6f 72 20 75 73 2c 20 62 75 74 20 69 74 20 64 69 64 6e 27 74 2e 0a 09 ┆ng line for us, but it didn't. ┆ 0x04f200…09e600 20 2a 2f 0a 09 61 63 74 69 76 65 2e 66 70 2d 3e 5f 66 6c 61 67 20 7c 3d 20 5f 49 4f 57 52 54 3b ┆ */ active.fp->_flag |= _IOWRT;┆ 0x04f200…09e600 0a 23 65 6e 64 69 66 20 2f 2a 20 55 53 47 20 2a 2f 0a 09 2f 2a 0a 09 20 2a 20 57 69 74 68 6f 75 ┆ #endif /* USG */ /* * Withou┆ 0x04f200…09e600 74 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 68 61 63 6b 65 72 79 20 64 61 74 61 20 77 72 69 ┆t the following hackery data wri┆ 0x04f200…09e600 74 74 65 6e 20 74 6f 20 61 6e 20 72 2b 20 66 70 20 6f 66 74 65 6e 0a 09 20 2a 20 67 65 74 73 20 ┆tten to an r+ fp often * gets ┆ 0x04f200…09e600 6c 6f 73 74 20 65 76 65 6e 20 69 66 20 79 6f 75 20 66 73 65 65 6b 28 29 20 62 65 66 6f 72 65 20 ┆lost even if you fseek() before ┆ 0x04f200…09e600 74 68 65 20 77 72 69 74 65 20 61 73 20 74 68 65 20 6d 61 6e 75 61 6c 73 0a 09 20 2a 20 61 64 76 ┆the write as the manuals * adv┆ 0x04f200…09e600 69 73 65 2e 0a 09 20 2a 0a 09 20 2a 20 54 68 69 73 20 69 73 20 6b 6e 6f 77 6e 20 74 6f 20 66 69 ┆ise. * * This is known to fi┆ 0x04f200…09e600 78 20 74 68 65 20 62 75 67 20 77 68 65 72 65 20 69 74 20 63 72 6f 70 73 20 75 70 20 69 6e 20 73 ┆x the bug where it crops up in s┆ 0x04f200…09e600 74 64 69 6f 28 33 29 0a 09 20 2a 20 6f 6e 20 74 68 65 20 41 54 26 54 20 36 33 30 30 2b 20 61 6e ┆tdio(3) * on the AT&T 6300+ an┆ 0x04f200…09e600 64 20 4d 69 63 72 6f 70 6f 72 74 20 38 30 32 38 36 20 55 4e 49 58 20 69 6d 70 6c 65 6d 65 6e 74 ┆d Microport 80286 UNIX implement┆ 0x04f200…09e600 61 74 69 6f 6e 73 0a 09 20 2a 20 49 74 20 73 68 6f 75 6c 64 20 61 6c 73 6f 20 64 6f 20 74 68 65 ┆ations * It should also do the┆ 0x04f200…09e600 20 72 69 67 68 74 20 74 68 69 6e 67 20 6f 6e 20 34 2e 31 42 53 44 2e 20 55 53 47 20 73 79 73 74 ┆ right thing on 4.1BSD. USG syst┆ 0x04f200…09e600 65 6d 73 20 69 6e 0a 09 20 2a 20 67 65 6e 65 72 61 6c 20 77 69 6c 6c 20 62 65 20 63 6f 76 65 72 ┆ems in * general will be cover┆ 0x04f200…09e600 65 64 20 62 79 20 74 68 65 20 6e 67 6e 65 77 61 72 74 28 29 20 63 68 61 6e 67 65 2e 0a 09 20 2a ┆ed by the ngnewart() change. *┆ 0x04f200…09e600 2f 0a 09 28 76 6f 69 64 29 20 73 65 74 62 75 66 28 61 63 74 69 76 65 2e 66 70 2c 20 28 63 68 61 ┆/ (void) setbuf(active.fp, (cha┆ 0x04f200…09e600 72 20 2a 29 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 20 69 66 20 28 28 61 ┆r *)NULL); } else if ((a┆ 0x04f200…09e600 63 74 69 76 65 2e 66 70 20 3d 20 66 6f 70 65 6e 28 41 43 54 49 56 45 2c 20 22 72 22 29 29 20 3d ┆ctive.fp = fopen(ACTIVE, "r")) =┆ 0x04f200…09e600 3d 20 28 46 49 4c 45 20 2a 29 4e 55 4c 4c 29 0a 09 78 65 72 72 6f 72 31 28 22 77 68 61 74 3f 20 ┆= (FILE *)NULL) xerror1("what? ┆ 0x04f200…09e600 2d 2d 20 63 61 6e 27 74 20 67 65 74 20 61 74 20 61 63 74 69 76 65 20 66 69 6c 65 20 61 74 20 25 ┆-- can't get at active file at %┆ 0x04f200…09e600 73 21 22 2c 20 41 43 54 49 56 45 29 3b 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 6e ┆s!", ACTIVE); /* allocate n┆ 0x04f200…09e600 61 6d 65 20 70 6f 6f 6c 20 73 70 61 63 65 20 62 61 73 65 64 20 6f 6e 20 61 63 74 69 76 65 20 66 ┆ame pool space based on active f┆ 0x04f200…09e600 69 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 6f 6c 64 6e 61 6d 65 73 20 3d 20 67 72 70 6e 61 ┆ile size */ oldnames = grpna┆ 0x04f200…09e600 6d 65 73 3b 0a 23 69 66 6e 64 65 66 20 4e 4f 4e 55 4e 49 58 0a 20 20 20 20 28 76 6f 69 64 29 20 ┆mes; #ifndef NONUNIX (void) ┆ 0x04f200…09e600 66 73 74 61 74 28 66 69 6c 65 6e 6f 28 61 63 74 69 76 65 2e 66 70 29 2c 20 26 73 74 62 75 66 29 ┆fstat(fileno(active.fp), &stbuf)┆ 0x04f200…09e600 3b 09 2f 2a 20 61 76 6f 69 64 20 6e 61 6d 65 69 28 29 20 6f 76 65 72 68 65 61 64 20 2a 2f 0a 20 ┆; /* avoid namei() overhead */ ┆ 0x04f200…09e600 20 20 20 6e 70 20 3d 20 67 72 70 6e 61 6d 65 73 20 3d 20 6d 61 6c 6c 6f 63 28 28 69 6f 6c 65 6e ┆ np = grpnames = malloc((iolen┆ 0x04f200…09e600 5f 74 29 73 74 62 75 66 2e 73 74 5f 73 69 7a 65 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 6e 70 20 ┆_t)stbuf.st_size); #else np ┆ 0x04f200…09e600 3d 20 67 72 70 6e 61 6d 65 73 20 3d 20 6d 61 6c 6c 6f 63 28 28 69 6f 6c 65 6e 5f 74 29 66 69 6c ┆= grpnames = malloc((iolen_t)fil┆ 0x04f200…09e600 65 73 69 7a 65 28 41 43 54 49 56 45 29 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 4e 4f 4e 55 4e 49 ┆esize(ACTIVE)); #endif /* NONUNI┆ 0x04f200…09e600 58 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 6e 6f 77 20 67 61 74 68 65 72 20 61 6c 6c 20 74 68 ┆X */ /* now gather all th┆ 0x04f200…09e600 61 74 20 64 61 74 61 20 2a 2f 0a 20 20 20 20 66 6f 72 20 28 63 68 61 6e 67 65 64 20 3d 20 30 3b ┆at data */ for (changed = 0;┆ 0x04f200…09e600 20 66 67 65 74 73 28 62 66 72 2c 20 73 69 7a 65 6f 66 28 62 66 72 29 2c 20 61 63 74 69 76 65 2e ┆ fgets(bfr, sizeof(bfr), active.┆ 0x04f200…09e600 66 70 29 20 21 3d 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 3b 20 29 0a 20 20 20 20 7b 0a 09 72 65 ┆fp) != (char *)NULL; ) { re┆ 0x04f200…09e600 67 69 73 74 65 72 20 67 72 6f 75 70 5f 74 09 2a 6d 67 70 3b 0a 0a 09 2f 2a 20 73 74 6f 72 65 20 ┆gister group_t *mgp; /* store ┆ 0x04f200…09e600 74 68 65 20 67 72 6f 75 70 20 6e 61 6d 65 20 2a 2f 0a 09 68 6f 6c 64 2e 6e 67 5f 6e 61 6d 65 20 ┆the group name */ hold.ng_name ┆ 0x04f200…09e600 3d 20 6e 70 3b 0a 20 20 20 20 20 20 20 20 68 6f 6c 64 2e 72 63 5f 6c 69 6e 64 65 78 20 3d 20 6e ┆= np; hold.rc_lindex = n┆ 0x04f200…09e600 70 20 2d 20 67 72 70 6e 61 6d 65 73 3b 09 2f 2a 20 73 6f 20 77 65 20 63 61 6e 20 72 65 61 6c 6c ┆p - grpnames; /* so we can reall┆ 0x04f200…09e600 6f 63 20 6c 61 74 65 72 20 2a 2f 0a 09 66 6f 72 20 28 63 70 20 3d 20 62 66 72 3b 20 2a 63 70 20 ┆oc later */ for (cp = bfr; *cp ┆ 0x04f200…09e600 21 3d 20 27 20 27 3b 29 0a 09 20 20 20 20 2a 6e 70 2b 2b 20 3d 20 2a 63 70 2b 2b 3b 0a 09 2a 6e ┆!= ' ';) *np++ = *cp++; *n┆ 0x04f200…09e600 70 2b 2b 20 3d 20 27 5c 30 27 3b 0a 0a 09 2f 2a 20 67 65 74 20 73 65 65 6b 20 63 6f 6f 6b 69 65 ┆p++ = '\0'; /* get seek cookie┆ 0x04f200…09e600 20 66 72 6f 6d 20 62 65 66 6f 72 65 20 74 68 65 20 72 65 61 64 20 70 6c 75 73 20 6f 66 66 73 65 ┆ from before the read plus offse┆ 0x04f200…09e600 74 20 74 6f 20 6d 69 6e 61 72 74 20 66 69 65 6c 64 20 2a 2f 0a 09 68 6f 6c 64 2e 6e 67 5f 66 73 ┆t to minart field */ hold.ng_fs┆ 0x04f200…09e600 65 65 6b 20 3d 20 6c 6f 63 20 2b 20 28 63 70 20 2d 20 62 66 72 20 2b 20 31 29 3b 0a 09 6c 6f 63 ┆eek = loc + (cp - bfr + 1); loc┆ 0x04f200…09e600 20 3d 20 66 74 65 6c 6c 28 61 63 74 69 76 65 2e 66 70 29 3b 09 2f 2a 20 6e 6f 77 20 75 70 64 61 ┆ = ftell(active.fp); /* now upda┆ 0x04f200…09e600 74 65 20 69 74 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 20 61 72 6f 75 6e 64 20 2a ┆te it for the next time around *┆ 0x04f200…09e600 2f 0a 0a 09 2f 2a 20 64 65 63 6f 64 65 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 65 20 63 75 ┆/ /* decode the rest of the cu┆ 0x04f200…09e600 72 72 65 6e 74 20 6c 69 6e 65 20 69 6e 74 6f 20 74 68 65 20 73 63 72 61 74 63 68 20 61 72 65 61 ┆rrent line into the scratch area┆ 0x04f200…09e600 20 2a 2f 0a 09 69 66 20 28 6e 67 72 65 61 64 28 63 70 20 2b 20 31 2c 20 26 68 6f 6c 64 29 20 3d ┆ */ if (ngread(cp + 1, &hold) =┆ 0x04f200…09e600 3d 20 45 4f 46 29 0a 20 20 09 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 0a 09 2f 2a 20 69 66 20 74 ┆= EOF) break; /* if t┆ 0x04f200…09e600 68 65 72 65 27 73 20 61 6c 72 65 61 64 79 20 69 6e 2d 63 6f 72 65 20 64 61 74 61 20 66 6f 72 20 ┆here's already in-core data for ┆ 0x04f200…09e600 74 68 65 20 67 72 6f 75 70 2c 20 75 70 64 61 74 65 20 69 74 20 2a 2f 0a 09 69 66 20 28 72 64 61 ┆the group, update it */ if (rda┆ 0x04f200…09e600 63 74 63 6f 75 6e 74 20 26 26 20 28 6d 67 70 20 3d 20 6e 67 66 69 6e 64 28 68 6f 6c 64 2e 6e 67 ┆ctcount && (mgp = ngfind(hold.ng┆ 0x04f200…09e600 5f 6e 61 6d 65 29 29 29 0a 09 7b 0a 09 20 20 20 20 2f 2a 20 6c 65 74 27 73 20 6d 61 6b 65 20 73 ┆_name))) { /* let's make s┆ 0x04f200…09e600 75 72 65 20 77 65 20 64 6f 6e 27 74 20 6c 6f 73 65 20 61 64 6d 69 6e 20 66 69 6c 65 20 69 6e 66 ┆ure we don't lose admin file inf┆ 0x04f200…09e600 6f 20 2a 2f 0a 09 20 20 20 20 68 6f 6c 64 2e 6e 67 5f 66 6c 61 67 73 20 7c 3d 20 28 6d 67 70 2d ┆o */ hold.ng_flags |= (mgp-┆ 0x04f200…09e600 3e 6e 67 5f 66 6c 61 67 73 20 26 20 4e 47 5f 41 44 4d 46 4c 41 47 53 29 3b 0a 0a 23 69 66 64 65 ┆>ng_flags & NG_ADMFLAGS); #ifde┆ 0x04f200…09e600 66 20 44 4f 58 52 45 46 53 0a 09 20 20 20 20 2f 2a 20 70 72 65 73 65 72 76 65 20 6e 65 78 74 20 ┆f DOXREFS /* preserve next ┆ 0x04f200…09e600 61 72 74 69 63 6c 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 09 20 20 20 20 68 6f 6c 64 2e 6e 67 5f 6e ┆article number */ hold.ng_n┆ 0x04f200…09e600 65 78 74 6e 75 6d 20 3d 20 6d 67 70 2d 3e 6e 67 5f 6e 65 78 74 6e 75 6d 3b 0a 23 65 6e 64 69 66 ┆extnum = mgp->ng_nextnum; #endif┆ 0x04f200…09e600 0a 23 69 66 64 65 66 20 48 41 53 48 47 52 4f 55 50 53 0a 09 20 20 20 20 2f 2a 20 70 72 65 73 65 ┆ #ifdef HASHGROUPS /* prese┆ 0x04f200…09e600 72 76 65 20 68 61 73 68 20 6c 69 6e 6b 20 6e 75 6d 62 65 72 20 2a 2f 0a 09 20 20 20 20 68 6f 6c ┆rve hash link number */ hol┆ 0x04f200…09e600 64 2e 6e 67 5f 6e 65 78 74 67 20 3d 20 6d 67 70 2d 3e 6e 67 5f 6e 65 78 74 67 3b 0a 23 65 6e 64 ┆d.ng_nextg = mgp->ng_nextg; #end┆ 0x04f200…09e600 69 66 0a 09 20 20 20 20 2f 2a 20 69 74 27 73 20 75 70 20 74 6f 20 74 68 65 20 75 73 65 72 20 74 ┆if /* it's up to the user t┆ 0x04f200…09e600 6f 20 70 72 65 73 65 72 76 65 20 6f 74 68 65 72 20 66 6c 61 67 20 69 6e 66 6f 20 69 66 20 6e 65 ┆o preserve other flag info if ne┆ 0x04f200…09e600 65 64 20 62 65 20 2a 2f 0a 09 20 20 20 20 69 66 20 28 62 70 72 6f 63 20 21 3d 20 4e 55 4c 4c 50 ┆ed be */ if (bproc != NULLP┆ 0x04f200…09e600 52 45 44 29 0a 09 09 69 66 20 28 28 2a 62 70 72 6f 63 29 28 26 68 6f 6c 64 2c 20 6d 67 70 29 29 ┆RED) if ((*bproc)(&hold, mgp))┆ 0x04f200…09e600 09 2f 2a 20 74 77 65 61 6b 20 62 69 74 6d 61 70 73 20 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a 09 ┆ /* tweak bitmaps if needed */ ┆ 0x04f200…09e600 09 7b 0a 09 09 20 20 20 20 68 6f 6c 64 2e 6e 67 5f 66 6c 61 67 73 20 7c 3d 20 4e 47 5f 43 48 41 ┆ { hold.ng_flags |= NG_CHA┆ 0x04f200…09e600 4e 47 45 44 3b 0a 09 09 20 20 20 20 63 68 61 6e 67 65 64 2b 2b 3b 0a 09 09 7d 0a 09 0a 09 20 20 ┆NGED; changed++; } ┆ 0x04f200…09e600 20 20 2f 2a 20 63 6f 70 79 20 74 68 65 20 75 70 64 61 74 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f ┆ /* copy the updated informatio┆ 0x04f200…09e600 6e 20 74 6f 20 74 68 65 20 67 72 6f 75 70 20 73 6c 6f 74 20 2a 2f 0a 09 20 20 20 20 28 76 6f 69 ┆n to the group slot */ (voi┆ 0x04f200…09e600 64 29 20 6d 65 6d 63 70 79 28 28 63 68 61 72 20 2a 29 6d 67 70 2c 20 28 63 68 61 72 20 2a 29 26 ┆d) memcpy((char *)mgp, (char *)&┆ 0x04f200…09e600 68 6f 6c 64 2c 20 73 69 7a 65 6f 66 28 67 72 6f 75 70 5f 74 29 29 3b 0a 09 7d 0a 09 65 6c 73 65 ┆hold, sizeof(group_t)); } else┆ 0x04f200…09e600 09 2f 2a 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 77 65 27 76 65 ┆ /* this is the first time we've┆ 0x04f200…09e600 20 73 65 65 6e 20 74 68 69 73 20 67 72 6f 75 70 20 2a 2f 0a 09 7b 0a 09 20 20 20 20 2f 2a 20 73 ┆ seen this group */ { /* s┆ 0x04f200…09e600 6f 20 6d 61 72 6b 20 69 74 20 63 68 61 6e 67 65 64 20 2a 2f 0a 09 20 20 20 20 68 6f 6c 64 2e 6e ┆o mark it changed */ hold.n┆ 0x04f200…09e600 67 5f 66 6c 61 67 73 20 7c 3d 20 4e 47 5f 43 48 41 4e 47 45 44 3b 0a 09 20 20 20 20 63 68 61 6e ┆g_flags |= NG_CHANGED; chan┆ 0x04f200…09e600 67 65 64 2b 2b 3b 0a 09 20 20 20 20 0a 09 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 73 70 ┆ged++; /* allocate sp┆ 0x04f200…09e600 61 63 65 20 66 6f 72 20 69 74 20 69 6e 20 74 68 65 20 61 72 72 61 79 20 2a 2f 0a 09 20 20 20 20 ┆ace for it in the array */ ┆ 0x04f200…09e600 6e 65 77 67 72 70 20 3d 20 6e 67 61 6c 6c 6f 63 28 68 6f 6c 64 2e 6e 67 5f 6e 61 6d 65 29 3b 0a ┆newgrp = ngalloc(hold.ng_name); ┆ 0x04f200…09e600 0a 09 20 20 20 20 2f 2a 20 63 6f 70 79 20 69 6e 20 6e 65 77 20 69 6e 66 6f 72 6d 61 74 69 6f 6e ┆ /* copy in new information┆ 0x04f200…09e600 20 61 6e 64 20 75 70 64 61 74 65 20 74 68 65 20 6c 61 73 74 2d 72 65 63 6f 72 64 20 70 6f 69 6e ┆ and update the last-record poin┆ 0x04f200…09e600 74 65 72 20 2a 2f 0a 09 20 20 20 20 28 76 6f 69 64 29 20 6d 65 6d 63 70 79 28 28 63 68 61 72 20 ┆ter */ (void) memcpy((char ┆ 0x04f200…09e600 2a 29 6e 65 77 67 72 70 2c 20 28 63 68 61 72 20 2a 29 26 68 6f 6c 64 2c 20 73 69 7a 65 6f 66 28 ┆*)newgrp, (char *)&hold, sizeof(┆ 0x04f200…09e600 67 72 6f 75 70 5f 74 29 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f 2e 4b 2e ┆group_t)); } } /* O.K.┆ 0x04f200…09e600 2c 20 6e 6f 77 20 72 65 63 6c 61 69 6d 20 74 68 65 20 75 6e 75 73 65 64 20 70 6f 72 74 69 6f 6e ┆, now reclaim the unused portion┆ 0x04f200…09e600 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 70 6f 6f 6c 20 2a 2f 0a 20 20 20 20 67 72 70 6e 61 6d 65 ┆ of the name pool */ grpname┆ 0x04f200…09e600 73 20 3d 20 72 65 61 6c 6c 6f 63 28 67 72 70 6e 61 6d 65 73 2c 20 28 69 6f 6c 65 6e 5f 74 29 28 ┆s = realloc(grpnames, (iolen_t)(┆ 0x04f200…09e600 6e 70 20 2d 20 67 72 70 6e 61 6d 65 73 29 29 3b 0a 20 20 20 20 66 6f 72 20 28 6e 65 77 67 72 70 ┆np - grpnames)); for (newgrp┆ 0x04f200…09e600 20 3d 20 61 63 74 69 76 65 2e 6e 65 77 73 67 72 6f 75 70 73 3b 20 6e 65 77 67 72 70 20 3c 20 61 ┆ = active.newsgroups; newgrp < a┆ 0x04f200…09e600 63 74 69 76 65 2e 6e 65 77 73 67 72 6f 75 70 73 20 2b 20 61 63 74 69 76 65 2e 6e 67 63 3b 20 6e ┆ctive.newsgroups + active.ngc; n┆ 0x04f200…09e600 65 77 67 72 70 2b 2b 29 0a 09 6e 65 77 67 72 70 2d 3e 6e 67 5f 6e 61 6d 65 20 3d 20 67 72 70 6e ┆ewgrp++) newgrp->ng_name = grpn┆ 0x04f200…09e600 61 6d 65 73 20 2b 20 6e 65 77 67 72 70 2d 3e 72 63 5f 6c 69 6e 64 65 78 3b 0a 20 20 20 20 69 66 ┆ames + newgrp->rc_lindex; if┆ 0x04f200…09e600 20 28 72 64 61 63 74 63 6f 75 6e 74 29 0a 09 66 72 65 65 28 6f 6c 64 6e 61 6d 65 73 29 3b 0a 0a ┆ (rdactcount) free(oldnames); ┆ 0x04f200…09e600 20 20 20 20 61 63 74 69 76 65 2e 61 72 74 69 63 6c 65 2e 6d 5f 67 72 6f 75 70 20 3d 20 61 63 74 ┆ active.article.m_group = act┆ 0x04f200…09e600 69 76 65 2e 6e 65 77 73 67 72 6f 75 70 73 3b 0a 20 20 20 20 72 64 61 63 74 63 6f 75 6e 74 2b 2b ┆ive.newsgroups; rdactcount++┆ 0x04f200…09e600 3b 0a 20 20 20 20 72 65 74 75 72 6e 28 63 68 61 6e 67 65 64 29 3b 09 0a 7d 0a 0a 76 6f 69 64 20 ┆; return(changed); } void ┆ 0x04f200…09e600 6e 67 72 65 77 69 6e 64 28 66 29 0a 2f 2a 20 73 65 74 20 61 63 74 69 76 65 2e 61 72 74 69 63 6c ┆ngrewind(f) /* set active.articl┆ 0x04f200…09e600 65 2e 6d 5f 67 72 6f 75 70 20 73 6f 20 74 68 65 20 6e 65 78 74 20 6e 67 6e 65 78 74 28 29 20 77 ┆e.m_group so the next ngnext() w┆ 0x04f200…09e600 69 6c 6c 20 73 74 61 72 74 20 69 74 20 6f 6e 20 74 68 65 20 72 69 67 68 74 20 67 72 6f 75 70 20 ┆ill start it on the right group ┆ 0x04f200…09e600 2a 2f 0a 62 6f 6f 6c 09 66 3b 09 2f 2a 20 54 52 55 45 20 74 6f 20 73 65 74 20 75 70 20 66 6f 72 ┆*/ bool f; /* TRUE to set up for┆ 0x04f200…09e600 20 73 74 65 70 73 20 66 6f 72 77 61 72 64 2c 20 46 41 4c 53 45 20 66 6f 72 20 62 61 63 6b 20 2a ┆ steps forward, FALSE for back *┆ 0x04f200…09e600 2f 0a 7b 0a 20 20 20 20 61 63 74 69 76 65 2e 61 72 74 69 63 6c 65 2e 6d 5f 67 72 6f 75 70 20 3d ┆/ { active.article.m_group =┆ 0x04f200…09e600 20 28 66 29 0a 09 3f 20 28 61 63 74 69 76 65 2e 6e 65 77 73 67 72 6f 75 70 73 20 2d 20 31 29 0a ┆ (f) ? (active.newsgroups - 1) ┆ 0x04f200…09e600 09 20 20 20 20 3a 20 28 61 63 74 69 76 65 2e 6e 65 77 73 67 72 6f 75 70 73 20 2b 20 61 63 74 69 ┆ : (active.newsgroups + acti┆ 0x04f200…09e600 76 65 2e 6e 67 63 29 3b 0a 7d 0a 0a 62 6f 6f 6c 20 6e 67 6e 65 78 74 28 29 0a 2f 2a 20 6d 6f 76 ┆ve.ngc); } bool ngnext() /* mov┆ 0x04f200…09e600 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 67 72 6f 75 70 2c 20 77 72 61 70 70 69 6e 67 20 61 72 ┆e to the next group, wrapping ar┆ 0x04f200…09e600 6f 75 6e 64 20 69 66 20 77 65 27 72 65 20 61 74 20 74 68 65 20 6c 61 73 74 20 2a 2f 0a 7b 0a 20 ┆ound if we're at the last */ { ┆ 0x04f200…09e600 20 20 20 69 66 20 28 2b 2b 61 63 74 69 76 65 2e 61 72 74 69 63 6c 65 2e 6d 5f 67 72 6f 75 70 20 ┆ if (++active.article.m_group ┆ 0x04f200…09e600 3c 20 61 63 74 69 76 65 2e 6e 65 77 73 67 72 6f 75 70 73 20 2b 20 61 63 74 69 76 65 2e 6e 67 63 ┆< active.newsgroups + active.ngc┆ 0x04f200…09e600 29 0a 09 72 65 74 75 72 6e 28 54 52 55 45 29 3b 0a 20 20 20 20 65 6c 73 65 0a 20 20 20 20 7b 0a ┆) return(TRUE); else { ┆ 0x04f200…09e600 09 61 63 74 69 76 65 2e 61 72 74 69 63 6c 65 2e 6d 5f 67 72 6f 75 70 20 3d 20 61 63 74 69 76 65 ┆ active.article.m_group = active┆ 0x04f200…09e600 2e 6e 65 77 73 67 72 6f 75 70 73 3b 0a 09 72 65 74 75 72 6e 28 46 41 4c 53 45 29 3b 0a 20 20 20 ┆.newsgroups; return(FALSE); ┆ 0x04f200…09e600 20 7d 0a 7d 0a 0a 62 6f 6f 6c 20 6e 67 62 61 63 6b 28 29 0a 2f 2a 20 6d 6f 76 65 20 74 6f 20 74 ┆ } } bool ngback() /* move to t┆ 0x04f200…09e600 68 65 20 6c 61 73 74 20 67 72 6f 75 70 2c 20 77 72 61 70 70 69 6e 67 20 61 72 6f 75 6e 64 20 69 ┆he last group, wrapping around i┆ 0x04f200…09e600 66 20 77 65 27 72 65 20 61 74 20 74 68 65 20 66 69 72 73 74 20 2a 2f 0a 7b 0a 20 20 20 20 69 66 ┆f we're at the first */ { if┆ 0x04f200…09e600 20 28 2d 2d 61 63 74 69 76 65 2e 61 72 74 69 63 6c 65 2e 6d 5f 67 72 6f 75 70 20 3e 3d 20 61 63 ┆ (--active.article.m_group >= ac┆ 0x04f200…09e600 74 69 76 65 2e 6e 65 77 73 67 72 6f 75 70 73 29 0a 09 72 65 74 75 72 6e 28 54 52 55 45 29 3b 0a ┆tive.newsgroups) return(TRUE); ┆ 0x04f200…09e600 20 20 20 20 65 6c 73 65 0a 20 20 20 20 7b 0a 09 61 63 74 69 76 65 2e 61 72 74 69 63 6c 65 2e 6d ┆ else { active.article.m┆ 0x04f200…09e600 5f 67 72 6f 75 70 20 3d 20 61 63 74 69 76 65 2e 6e 65 77 73 67 72 6f 75 70 73 20 2b 20 61 63 74 ┆_group = active.newsgroups + act┆ 0x04f200…09e600 69 76 65 2e 6e 67 63 20 2d 20 31 3b 0a 09 72 65 74 75 72 6e 28 46 41 4c 53 45 29 3b 0a 20 20 20 ┆ive.ngc - 1; return(FALSE); ┆ 0x04f200…09e600 20 7d 0a 7d 0a 0a 67 72 6f 75 70 5f 74 20 2a 6e 67 66 69 6e 64 28 6e 61 6d 65 29 0a 2f 2a 20 66 ┆ } } group_t *ngfind(name) /* f┆ 0x04f200…09e600 69 6e 64 20 69 6e 2d 63 6f 72 65 20 64 61 74 61 20 6f 6e 20 61 20 6e 65 77 73 67 72 6f 75 70 20 ┆ind in-core data on a newsgroup ┆ 0x04f200…09e600 2a 2f 0a 72 65 67 69 73 74 65 72 20 63 68 61 72 20 2a 6e 61 6d 65 3b 0a 7b 0a 23 69 66 6e 64 65 ┆*/ register char *name; { #ifnde┆ 0x04f200…09e600 66 20 48 41 53 48 47 52 4f 55 50 53 0a 20 20 20 20 72 65 67 69 73 74 65 72 20 67 72 6f 75 70 5f ┆f HASHGROUPS register group_┆ 0x04f200…09e600 74 20 2a 6e 67 70 2c 20 2a 62 6f 75 6e 64 3b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 41 20 ┆t *ngp, *bound; /* * A ┆ 0x04f200…09e600 73 74 75 70 69 64 20 62 75 74 20 72 6f 62 75 73 74 20 6c 69 6e 65 61 72 2d 73 65 61 72 63 68 20 ┆stupid but robust linear-search ┆ 0x04f200…09e600 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 49 74 27 73 20 69 6e 68 65 72 65 6e 74 6c 79 0a ┆implementation. It's inherently ┆ 0x04f200…09e600 20 20 20 20 20 2a 20 71 75 61 64 72 61 74 69 63 20 2d 20 77 65 20 73 70 65 6e 64 20 6c 6f 74 73 ┆ * quadratic - we spend lots┆ 0x04f200…09e600 20 6f 66 20 43 50 55 20 74 69 6d 65 20 68 65 72 65 20 62 65 63 61 75 73 65 20 77 65 20 6d 61 79 ┆ of CPU time here because we may┆ 0x04f200…09e600 20 73 65 61 72 63 68 20 74 68 72 6f 75 67 68 0a 20 20 20 20 20 2a 20 74 68 65 20 77 68 6f 6c 65 ┆ search through * the whole┆ 0x04f200…09e600 20 74 61 62 6c 65 20 66 6f 72 20 65 61 63 68 20 6c 69 6e 65 2e 20 54 68 65 20 63 6f 6e 74 65 6e ┆ table for each line. The conten┆ 0x04f200…09e600 74 73 20 6f 66 20 61 63 74 69 76 65 2e 61 72 74 69 63 6c 65 2e 6d 5f 67 72 6f 75 70 20 0a 20 20 ┆ts of active.article.m_group ┆ 0x04f200…09e600 20 20 20 2a 20 72 65 6d 65 6d 62 65 72 73 20 77 68 65 72 65 20 74 68 65 20 6c 61 73 74 20 6d 61 ┆ * remembers where the last ma┆ 0x04f200…09e600 74 63 68 20 77 61 73 20 66 6f 75 6e 64 3b 20 77 65 20 73 74 61 72 74 20 74 68 65 20 73 65 61 72 ┆tch was found; we start the sear┆ 0x04f200…09e600 63 68 20 74 68 65 72 65 20 61 6e 64 0a 20 20 20 20 20 2a 20 6c 6f 6f 70 20 61 72 6f 75 6e 64 20 ┆ch there and * loop around ┆ 0x04f200…09e600 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 2c 20 69 6e 20 74 68 65 20 68 6f 70 65 73 20 74 ┆to the beginning, in the hopes t┆ 0x04f200…09e600 68 61 74 20 74 68 65 20 63 61 6c 6c 73 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 2a 20 72 6f 75 ┆hat the calls will be * rou┆ 0x04f200…09e600 67 68 6c 79 20 69 6e 20 6f 72 64 65 72 2e 20 4e 55 4c 4c 20 6d 65 61 6e 73 20 74 68 65 20 63 6f ┆ghly in order. NULL means the co┆ 0x04f200…09e600 64 65 20 64 69 64 6e 27 74 20 66 69 6e 64 20 61 20 67 72 6f 75 70 20 6d 61 74 63 68 69 6e 67 20 ┆de didn't find a group matching ┆ 0x04f200…09e600 74 68 65 0a 20 20 20 20 20 2a 20 67 69 76 65 6e 20 6e 61 6d 65 2e 0a 20 20 20 20 20 2a 2f 0a 20 ┆the * given name. */ ┆ 0x04f200…09e600 20 20 20 2f 2a 20 66 69 72 73 74 2c 20 73 65 61 72 63 68 20 66 72 6f 6d 20 74 68 65 20 70 72 65 ┆ /* first, search from the pre┆ 0x04f200…09e600 76 69 6f 75 73 20 76 61 6c 75 65 20 75 70 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 65 6e 64 20 ┆vious value up to the table end ┆ 0x04f200…09e600 2a 2f 0a 20 20 20 20 62 6f 75 6e 64 20 3d 20 61 63 74 69 76 65 2e 6e 65 77 73 67 72 6f 75 70 73 ┆*/ bound = active.newsgroups┆ 0x04f200…09e600 20 2b 20 61 63 74 69 76 65 2e 6e 67 63 3b 0a 20 20 20 20 66 6f 72 20 28 6e 67 70 20 3d 20 61 63 ┆ + active.ngc; for (ngp = ac┆ 0x04f200…09e600 74 69 76 65 2e 61 72 74 69 63 6c 65 2e 6d 5f 67 72 6f 75 70 3b 20 6e 67 70 20 3c 20 62 6f 75 6e ┆tive.article.m_group; ngp < boun┆ 0x04f200…09e600 64 3b 20 6e 67 70 2b 2b 29 0a 09 69 66 20 28 6e 61 6d 65 5b 30 5d 20 3d 3d 20 6e 67 70 2d 3e 6e ┆d; ngp++) if (name[0] == ngp->n┆ 0x04f200…09e600 67 5f 6e 61 6d 65 5b 30 5d 20 26 26 20 21 73 74 72 63 6d 70 28 6e 61 6d 65 2c 20 6e 67 70 2d 3e ┆g_name[0] && !strcmp(name, ngp->┆ 0x04f200…09e600 6e 67 5f 6e 61 6d 65 29 29 0a 09 20 20 20 20 72 65 74 75 72 6e 28 6e 67 70 29 3b 0a 0a 20 20 20 ┆ng_name)) return(ngp); ┆ 0x04f200…09e600 20 2f 2a 20 6e 65 78 74 2c 20 74 72 79 20 66 72 6f 6d 20 74 68 65 20 74 61 62 6c 65 20 62 61 73 ┆ /* next, try from the table bas┆ 0x04f200…09e600 65 20 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 76 61 6c 75 65 20 2a 2f 0a 20 20 20 20 62 ┆e to the previous value */ b┆ 0x04f200…09e600 6f 75 6e 64 20 3d 20 61 63 74 69 76 65 2e 61 72 74 69 63 6c 65 2e 6d 5f 67 72 6f 75 70 3b 0a 20 ┆ound = active.article.m_group; ┆ 0x04f200…09e600 20 20 20 66 6f 72 20 28 6e 67 70 20 3d 20 61 63 74 69 76 65 2e 6e 65 77 73 67 72 6f 75 70 73 3b ┆ for (ngp = active.newsgroups;┆ 0x04f200…09e600 20 6e 67 70 20 3c 20 62 6f 75 6e 64 3b 20 6e 67 70 2b 2b 29 0a 09 69 66 20 28 6e 61 6d 65 5b 30 ┆ ngp < bound; ngp++) if (name[0┆ 0x04f200…09e600 5d 20 3d 3d 20 6e 67 70 2d 3e 6e 67 5f 6e 61 6d 65 5b 30 5d 20 26 26 20 21 73 74 72 63 6d 70 28 ┆] == ngp->ng_name[0] && !strcmp(┆ 0x04f200…09e600 6e 61 6d 65 2c 20 6e 67 70 2d 3e 6e 67 5f 6e 61 6d 65 29 29 0a 09 20 20 20 20 72 65 74 75 72 6e ┆name, ngp->ng_name)) return┆ 0x04f200…09e600 28 6e 67 70 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 41 20 6c 65 73 ┆(ngp); #else /* * A les┆ 0x04f200…09e600 73 20 73 74 75 70 69 64 20 76 65 72 73 69 6f 6e 20 75 73 69 6e 67 20 61 20 68 61 73 68 20 74 6f ┆s stupid version using a hash to┆ 0x04f200…09e600 20 6c 69 6e 6b 65 64 2d 6c 69 73 74 20 63 68 61 69 6e 73 2e 20 53 65 65 20 74 68 65 20 0a 20 20 ┆ linked-list chains. See the ┆ 0x04f200…09e600 20 20 20 2a 20 63 6f 6d 6d 65 6e 74 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 66 6f 72 ┆ * comment attached to the for┆ 0x04f200…09e600 5f 68 61 73 68 28 29 20 6d 61 63 72 6f 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 67 69 73 ┆_hash() macro. */ regis┆ 0x04f200…09e600 74 65 72 20 69 6e 74 20 2a 62 75 63 6b 65 74 3b 0a 0a 20 20 20 20 2f 2a 20 73 65 61 72 63 68 20 ┆ter int *bucket; /* search ┆ 0x04f200…09e600 74 68 72 6f 75 67 68 20 74 68 65 20 67 72 6f 75 70 27 73 20 68 61 73 68 20 6c 69 73 74 20 66 6f ┆through the group's hash list fo┆ 0x04f200…09e600 72 20 69 74 20 2a 2f 0a 20 20 20 20 66 6f 72 5f 68 61 73 68 28 62 75 63 6b 65 74 2c 20 6e 61 6d ┆r it */ for_hash(bucket, nam┆ 0x04f200…09e600 65 29 0a 20 20 20 20 7b 0a 09 72 65 67 69 73 74 65 72 20 67 72 6f 75 70 5f 74 20 2a 6e 67 70 20 ┆e) { register group_t *ngp ┆ 0x04f200…09e600 3d 20 61 63 74 69 76 65 2e 6e 65 77 73 67 72 6f 75 70 73 20 2b 20 2a 62 75 63 6b 65 74 20 2d 20 ┆= active.newsgroups + *bucket - ┆ 0x04f200…09e600 31 3b 0a 09 72 65 67 69 73 74 65 72 20 63 68 61 72 20 2a 67 6e 61 6d 65 20 3d 20 6e 67 70 2d 3e ┆1; register char *gname = ngp->┆ 0x04f200…09e600 6e 67 5f 6e 61 6d 65 3b 0a 0a 09 69 66 20 28 6e 61 6d 65 5b 30 5d 20 3d 3d 20 67 6e 61 6d 65 5b ┆ng_name; if (name[0] == gname[┆ 0x04f200…09e600 30 5d 20 26 26 20 21 73 74 72 63 6d 70 28 6e 61 6d 65 2c 20 67 6e 61 6d 65 29 29 0a 09 20 20 20 ┆0] && !strcmp(name, gname)) ┆ 0x04f200…09e600 20 72 65 74 75 72 6e 28 6e 67 70 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 48 41 ┆ return(ngp); } #endif /* HA┆ 0x04f200…09e600 53 48 47 52 4f 55 50 53 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 6e 65 69 74 68 65 72 20 6c 6f 6f 70 ┆SHGROUPS */ /* neither loop┆ 0x04f200…09e600 20 66 6f 75 6e 64 20 61 20 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 28 28 67 72 ┆ found a match */ return((gr┆ 0x04f200…09e600 6f 75 70 5f 74 20 2a 29 4e 55 4c 4c 29 3b 0a 7d 0a 0a 76 6f 69 64 20 63 6c 73 61 63 74 69 76 65 ┆oup_t *)NULL); } void clsactive┆ 0x04f200…09e600 28 29 0a 2f 2a 20 72 65 6c 65 61 73 65 20 74 68 65 20 61 63 74 69 76 65 2d 67 72 6f 75 70 73 20 ┆() /* release the active-groups ┆ 0x04f200…09e600 66 69 6c 65 20 2a 2f 0a 7b 0a 20 20 20 20 28 76 6f 69 64 29 20 66 63 6c 6f 73 65 28 61 63 74 69 ┆file */ { (void) fclose(acti┆ 0x04f200…09e600 76 65 2e 66 70 29 3b 0a 23 69 66 64 65 66 20 4e 4f 4e 4c 4f 43 41 4c 0a 20 20 20 20 28 76 6f 69 ┆ve.fp); #ifdef NONLOCAL (voi┆ 0x04f200…09e600 64 29 20 75 6e 6c 69 6e 6b 28 41 43 54 49 56 45 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 4e 4f 4e ┆d) unlink(ACTIVE); #endif /* NON┆ 0x04f200…09e600 4c 4f 43 41 4c 20 2a 2f 0a 7d 0a 0a 62 6f 6f 6c 20 6e 67 72 65 72 65 61 64 28 6e 67 70 2c 20 62 ┆LOCAL */ } bool ngreread(ngp, b┆ 0x04f200…09e600 70 72 6f 63 29 0a 2f 2a 20 75 70 64 61 74 65 20 74 68 65 20 69 6e 2d 63 6f 72 65 20 62 69 74 6d ┆proc) /* update the in-core bitm┆ 0x04f200…09e600 61 70 20 6f 66 20 61 20 67 69 76 65 6e 20 67 72 6f 75 70 20 74 6f 20 6d 61 74 63 68 20 72 65 61 ┆ap of a given group to match rea┆ 0x04f200…09e600 6c 69 74 79 20 2a 2f 0a 67 72 6f 75 70 5f 74 09 2a 6e 67 70 3b 09 09 2f 2a 20 67 72 6f 75 70 20 ┆lity */ group_t *ngp; /* group ┆ 0x04f200…09e600 74 6f 20 75 70 64 61 74 65 20 2a 2f 0a 62 6f 6f 6c 09 28 2a 62 70 72 6f 63 29 28 29 3b 09 2f 2a ┆to update */ bool (*bproc)(); /*┆ 0x04f200…09e600 20 68 6f 6f 6b 20 66 6f 72 20 70 72 65 73 65 72 76 69 6e 67 20 6f 6c 64 20 67 72 6f 75 70 20 69 ┆ hook for preserving old group i┆ 0x04f200…09e600 6e 66 6f 20 2a 2f 0a 7b 0a 20 20 20 20 73 74 61 74 69 63 20 67 72 6f 75 70 5f 74 09 6e 65 77 3b ┆nfo */ { static group_t new;┆ 0x04f200…09e600 0a 0a 20 20 20 20 69 66 20 28 66 73 65 65 6b 28 61 63 74 69 76 65 2e 66 70 2c 20 28 6f 66 66 5f ┆ if (fseek(active.fp, (off_┆ 0x04f200…09e600 74 29 6e 67 70 2d 3e 6e 67 5f 66 73 65 65 6b 2c 20 53 45 45 4b 5f 53 45 54 29 20 3d 3d 20 46 41 ┆t)ngp->ng_fseek, SEEK_SET) == FA┆ 0x04f200…09e600 49 4c 29 0a 09 78 65 72 72 6f 72 30 28 22 61 63 74 69 76 65 20 66 69 6c 65 20 73 65 65 6b 20 66 ┆IL) xerror0("active file seek f┆ 0x04f200…09e600 61 69 6c 65 64 22 29 3b 0a 09 2f 2a 4e 4f 54 52 45 41 43 48 45 44 2a 2f 0a 20 20 20 20 65 6c 73 ┆ailed"); /*NOTREACHED*/ els┆ 0x04f200…09e600 65 0a 20 20 20 20 7b 0a 09 69 66 20 28 66 67 65 74 73 28 62 66 72 2c 20 73 69 7a 65 6f 66 28 62 ┆e { if (fgets(bfr, sizeof(b┆ 0x04f200…09e600 66 72 29 2c 20 61 63 74 69 76 65 2e 66 70 29 20 3d 3d 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 ┆fr), active.fp) == (char *)NULL)┆ 0x04f200…09e600 0a 09 20 20 20 20 72 65 74 75 72 6e 28 46 41 49 4c 29 3b 0a 0a 20 20 09 2f 2a 20 64 65 63 6f 64 ┆ return(FAIL); /* decod┆ 0x04f200…09e600 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 69 6e 65 20 69 6e 74 6f 20 61 20 73 63 72 61 74 63 ┆e the current line into a scratc┆ 0x04f200…09e600 68 20 61 72 65 61 20 2a 2f 0a 09 28 76 6f 69 64 29 20 6e 67 72 65 61 64 28 62 66 72 2c 20 26 6e ┆h area */ (void) ngread(bfr, &n┆ 0x04f200…09e600 65 77 29 3b 0a 0a 09 2f 2a 20 6c 65 74 27 73 20 6d 61 6b 65 20 73 75 72 65 20 77 65 20 64 6f 6e ┆ew); /* let's make sure we don┆ 0x04f200…09e600 27 74 20 6c 6f 73 65 20 61 64 6d 69 6e 20 66 69 6c 65 20 69 6e 66 6f 20 6f 72 20 73 65 61 72 63 ┆'t lose admin file info or searc┆ 0x04f200…09e600 68 20 6f 66 66 73 65 74 20 2a 2f 0a 09 6e 65 77 2e 6e 67 5f 66 6c 61 67 73 20 7c 3d 20 28 6e 67 ┆h offset */ new.ng_flags |= (ng┆ 0x04f200…09e600 70 2d 3e 6e 67 5f 66 6c 61 67 73 20 26 20 7e 4e 47 5f 41 43 54 46 4c 41 47 53 29 3b 0a 09 6e 65 ┆p->ng_flags & ~NG_ACTFLAGS); ne┆ 0x04f200…09e600 77 2e 6e 67 5f 66 73 65 65 6b 20 3d 20 6e 67 70 2d 3e 6e 67 5f 66 73 65 65 6b 3b 0a 09 6e 65 77 ┆w.ng_fseek = ngp->ng_fseek; new┆ 0x04f200…09e600 2e 6e 67 5f 6e 61 6d 65 20 3d 20 6e 67 70 2d 3e 6e 67 5f 6e 61 6d 65 3b 0a 0a 09 69 66 20 28 62 ┆.ng_name = ngp->ng_name; if (b┆ 0x04f200…09e600 70 72 6f 63 20 3d 3d 20 4e 55 4c 4c 50 52 45 44 29 0a 09 7b 0a 09 20 20 20 20 28 76 6f 69 64 29 ┆proc == NULLPRED) { (void)┆ 0x04f200…09e600 20 6d 65 6d 63 70 79 28 6e 67 70 2c 20 26 6e 65 77 2c 20 73 69 7a 65 6f 66 28 67 72 6f 75 70 5f ┆ memcpy(ngp, &new, sizeof(group_┆ 0x04f200…09e600 74 29 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 28 54 52 55 45 29 3b 0a 09 7d 0a 09 65 6c 73 65 ┆t)); return(TRUE); } else┆ 0x04f200…09e600 0a 09 20 20 20 20 72 65 74 75 72 6e 28 28 2a 62 70 72 6f 63 29 28 6e 67 70 2c 20 26 6e 65 77 29 ┆ return((*bproc)(ngp, &new)┆ 0x04f200…09e600 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 4e 4f 54 52 45 41 43 48 45 44 20 2a 2f 0a 7d 0a ┆); } /* NOTREACHED */ } ┆ 0x04f200…09e600 0a 23 69 66 20 64 65 66 69 6e 65 64 28 48 41 53 48 47 52 4f 55 50 53 29 20 26 26 20 64 65 66 69 ┆ #if defined(HASHGROUPS) && defi┆ 0x04f200…09e600 6e 65 64 28 53 4f 52 54 41 43 54 49 56 45 29 0a 76 6f 69 64 20 6e 67 72 65 68 61 73 68 28 29 0a ┆ned(SORTACTIVE) void ngrehash() ┆ 0x04f200…09e600 2f 2a 20 72 65 67 65 6e 65 72 61 74 65 20 74 68 65 20 68 61 73 68 20 6c 69 73 74 73 20 74 6f 20 ┆/* regenerate the hash lists to ┆ 0x04f200…09e600 72 65 66 6c 65 63 74 20 74 68 65 20 72 63 5f 6f 69 6e 64 65 78 20 66 69 65 6c 64 20 2a 2f 0a 7b ┆reflect the rc_oindex field */ {┆ 0x04f200…09e600 0a 20 20 20 20 72 65 67 69 73 74 65 72 20 67 72 6f 75 70 5f 74 20 2a 6e 67 70 2c 20 2a 6c 61 73 ┆ register group_t *ngp, *las┆ 0x04f200…09e600 74 67 72 70 20 3d 20 61 63 74 69 76 65 2e 6e 65 77 73 67 72 6f 75 70 73 20 2b 20 61 63 74 69 76 ┆tgrp = active.newsgroups + activ┆ 0x04f200…09e600 65 2e 6e 67 63 3b 0a 20 20 20 20 72 65 67 69 73 74 65 72 20 69 6e 74 09 2a 62 75 63 6b 65 74 3b ┆e.ngc; register int *bucket;┆ 0x04f200…09e600 0a 0a 20 20 20 20 28 76 6f 69 64 29 20 62 7a 65 72 6f 28 28 63 68 61 72 20 2a 29 62 75 63 6b 65 ┆ (void) bzero((char *)bucke┆ 0x04f200…09e600 74 73 2c 20 73 69 7a 65 6f 66 28 62 75 63 6b 65 74 73 29 29 3b 0a 20 20 20 20 66 6f 72 20 28 6e ┆ts, sizeof(buckets)); for (n┆ 0x04f200…09e600 67 70 20 3d 20 61 63 74 69 76 65 2e 6e 65 77 73 67 72 6f 75 70 73 3b 20 6e 67 70 20 3c 20 6c 61 ┆gp = active.newsgroups; ngp < la┆ 0x04f200…09e600 73 74 67 72 70 3b 20 6e 67 70 2b 2b 29 0a 09 6e 67 70 2d 3e 6e 67 5f 6e 65 78 74 67 20 3d 20 30 ┆stgrp; ngp++) ngp->ng_nextg = 0┆ 0x04f200…09e600 3b 0a 20 20 20 20 66 6f 72 20 28 6e 67 70 20 3d 20 61 63 74 69 76 65 2e 6e 65 77 73 67 72 6f 75 ┆; for (ngp = active.newsgrou┆ 0x04f200…09e600 70 73 3b 20 6e 67 70 20 3c 20 6c 61 73 74 67 72 70 3b 20 6e 67 70 2b 2b 29 0a 20 20 20 20 7b 0a ┆ps; ngp < lastgrp; ngp++) { ┆ 0x04f200…09e600 09 66 6f 72 5f 68 61 73 68 28 62 75 63 6b 65 74 2c 20 6e 67 70 2d 3e 6e 67 5f 6e 61 6d 65 29 0a ┆ for_hash(bucket, ngp->ng_name) ┆ 0x04f200…09e600 09 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 09 62 75 63 6b 65 74 5b 30 5d 20 3d 20 6e 67 70 20 ┆ continue; bucket[0] = ngp ┆ 0x04f200…09e600 2d 20 61 63 74 69 76 65 2e 6e 65 77 73 67 72 6f 75 70 73 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 7d ┆- active.newsgroups + 1; } }┆ 0x04f200…09e600 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 48 41 53 48 47 52 4f 55 50 53 29 20 26 ┆ #endif /* defined(HASHGROUPS) &┆ 0x04f200…09e600 26 20 64 65 66 69 6e 65 64 28 53 4f 52 54 41 43 54 49 56 45 29 20 2a 2f 0a 0a 23 69 66 64 65 66 ┆& defined(SORTACTIVE) */ #ifdef┆ 0x04f200…09e600 20 50 52 4f 46 49 4c 45 0a 63 68 61 72 20 2a 50 72 6f 67 6e 61 6d 65 20 3d 20 22 70 72 6f 66 61 ┆ PROFILE char *Progname = "profa┆ 0x04f200…09e600 63 74 69 76 65 22 3b 0a 0a 6d 61 69 6e 28 61 72 67 63 2c 20 61 72 67 76 29 0a 2f 2a 0a 20 2a 20 ┆ctive"; main(argc, argv) /* * ┆ 0x04f200…09e600 41 20 74 6f 72 74 75 72 65 20 74 65 73 74 65 72 20 66 6f 72 20 6e 67 66 69 6e 64 28 29 2e 20 43 ┆A torture tester for ngfind(). C┆ 0x04f200…09e600 6f 6d 70 69 6c 65 20 77 69 74 68 20 2d 70 20 74 6f 20 74 65 73 74 20 73 65 61 72 63 68 20 6f 70 ┆ompile with -p to test search op┆ 0x04f200…09e600 74 69 6d 69 7a 61 74 69 6f 6e 73 2e 0a 20 2a 20 54 61 6b 65 73 20 61 6e 20 69 74 65 72 61 74 69 ┆timizations. * Takes an iterati┆ 0x04f200…09e600 6f 6e 20 63 6f 75 6e 74 20 61 6e 64 20 61 20 73 65 65 64 20 66 6f 72 20 73 72 61 6e 64 28 29 20 ┆on count and a seed for srand() ┆ 0x04f200…09e600 61 73 20 61 72 67 75 6d 65 6e 74 73 20 2d 2d 20 72 61 6e 64 28 29 27 73 0a 20 2a 20 22 70 6f 6f ┆as arguments -- rand()'s * "poo┆ 0x04f200…09e600 72 20 73 70 65 63 74 72 61 6c 20 70 72 6f 70 65 72 74 69 65 73 22 20 61 72 65 20 6e 6f 20 70 72 ┆r spectral properties" are no pr┆ 0x04f200…09e600 6f 62 6c 65 6d 20 68 65 72 65 2c 20 77 65 27 72 65 20 6a 75 73 74 20 75 73 69 6e 67 20 69 74 20 ┆oblem here, we're just using it ┆ 0x04f200…09e600 74 6f 0a 20 2a 20 67 65 6e 65 72 61 74 65 20 61 20 6e 6f 6e 2d 73 6f 72 74 65 64 20 73 65 71 75 ┆to * generate a non-sorted sequ┆ 0x04f200…09e600 65 6e 63 65 20 6f 66 20 6e 61 6d 65 73 2e 20 4e 6f 74 65 20 74 68 61 74 20 74 68 69 73 20 63 6f ┆ence of names. Note that this co┆ 0x04f200…09e600 64 65 20 64 6f 65 73 20 2a 6e 6f 74 2a 0a 20 2a 20 74 65 73 74 20 74 68 65 20 69 6e 76 61 6c 69 ┆de does *not* * test the invali┆ 0x04f200…09e600 64 2d 67 72 6f 75 70 20 63 61 73 65 2e 0a 20 2a 2f 0a 69 6e 74 09 61 72 67 63 3b 0a 63 68 61 72 ┆d-group case. */ int argc; char┆ 0x04f200…09e600 09 2a 61 72 67 76 5b 5d 3b 0a 7b 0a 20 20 20 20 6c 6f 6e 67 20 69 74 65 72 61 74 69 6f 6e 73 20 ┆ *argv[]; { long iterations ┆ 0x04f200…09e600 3d 20 61 74 6f 6c 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20 72 65 67 69 73 74 65 72 20 67 72 ┆= atol(argv[1]); register gr┆ 0x04f200…09e600 6f 75 70 5f 74 20 2a 72 67 72 70 2c 20 2a 67 70 3b 0a 20 20 20 20 69 6e 74 20 69 20 3d 20 30 3b ┆oup_t *rgrp, *gp; int i = 0;┆ 0x04f200…09e600 0a 0a 20 20 20 20 6e 65 77 73 69 6e 69 74 28 29 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 72 64 61 ┆ newsinit(); (void) rda┆ 0x04f200…09e600 63 74 69 76 65 28 4e 55 4c 4c 50 52 45 44 29 3b 0a 20 20 20 20 73 72 61 6e 64 28 61 74 6f 6c 28 ┆ctive(NULLPRED); srand(atol(┆ 0x04f200…09e600 61 72 67 76 5b 32 5d 29 29 3b 0a 20 20 20 20 77 68 69 6c 65 20 28 69 74 65 72 61 74 69 6f 6e 73 ┆argv[2])); while (iterations┆ 0x04f200…09e600 2d 2d 29 0a 20 20 20 20 7b 0a 09 2f 2a 20 70 69 63 6b 20 61 20 72 61 6e 64 6f 6d 20 67 72 6f 75 ┆--) { /* pick a random grou┆ 0x04f200…09e600 70 20 2a 2f 0a 09 72 67 72 70 20 3d 20 61 63 74 69 76 65 2e 6e 65 77 73 67 72 6f 75 70 73 20 2b ┆p */ rgrp = active.newsgroups +┆ 0x04f200…09e600 20 72 61 6e 64 28 29 20 25 20 61 63 74 69 76 65 2e 6e 67 63 3b 0a 0a 09 69 66 20 28 28 67 70 20 ┆ rand() % active.ngc; if ((gp ┆ 0x04f200…09e600 3d 20 6e 67 66 69 6e 64 28 72 67 72 70 2d 3e 6e 67 5f 6e 61 6d 65 29 29 20 3d 3d 20 28 67 72 6f ┆= ngfind(rgrp->ng_name)) == (gro┆ 0x04f200…09e600 75 70 5f 74 20 2a 29 4e 55 4c 4c 29 0a 09 20 20 20 20 28 76 6f 69 64 29 20 70 72 69 6e 74 66 28 ┆up_t *)NULL) (void) printf(┆ 0x04f200…09e600 22 25 30 34 64 3a 20 45 52 52 4f 52 2c 20 25 73 20 4e 4f 54 20 46 4f 55 4e 44 5c 6e 22 2c 20 2b ┆"%04d: ERROR, %s NOT FOUND\n", +┆ 0x04f200…09e600 2b 69 2c 20 72 67 72 70 2d 3e 6e 67 5f 6e 61 6d 65 29 3b 0a 09 65 6c 73 65 0a 09 20 20 20 20 28 ┆+i, rgrp->ng_name); else (┆ 0x04f200…09e600 76 6f 69 64 29 20 70 72 69 6e 74 66 28 22 25 30 34 64 3a 20 47 72 6f 75 70 20 25 73 20 66 6f 75 ┆void) printf("%04d: Group %s fou┆ 0x04f200…09e600 6e 64 2c 20 6e 61 6d 65 20 25 73 5c 6e 22 2c 0a 09 09 09 09 2b 2b 69 2c 20 72 67 72 70 2d 3e 6e ┆nd, name %s\n", ++i, rgrp->n┆ 0x04f200…09e600 67 5f 6e 61 6d 65 2c 20 67 70 2d 3e 6e 67 5f 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 ┆g_name, gp->ng_name); } ┆ 0x04f200…09e600 63 6c 73 61 63 74 69 76 65 28 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 50 52 4f 46 49 4c 45 ┆clsactive(); } #endif /* PROFILE┆ 0x04f200…09e600 20 2a 2f 0a 0a 2f 2a 20 72 64 61 63 74 69 76 65 2e 63 20 65 6e 64 73 20 68 65 72 65 20 2a 2f 0a ┆ */ /* rdactive.c ends here */ ┆ 0x04f200…09e600 6f 75 70 5f 74 20 2a 72 67 72 70 2c 20 2a 67 70 3b 0a 20 20 20 20 69 6e 74 20 69 20 3d 20 30 3b ┆oup_t *rgrp, *gp; int i = 0;┆ 0x04f200…09e600 0a 0a 20 20 20 20 6e 65 77 73 69 6e 69 74 28 29 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 72 64 61 ┆ newsinit(); (void) rda┆ 0x04f200…09e600 63 74 69 76 65 28 4e 55 4c 4c 50 52 45 44 29 3b 0a 20 20 20 20 73 72 61 6e 64 28 61 74 6f 6c 28 ┆ctive(NULLPRED); srand(atol(┆ 0x04f200…09e600 61 72 67 76 5b 32 5d 29 29 3b 0a 20 20 20 20 77 68 69 6c 65 20 28 69 74 65 72 61 74 69 6f 6e 73 ┆argv[2])); while (iterations┆ 0x04f200…09e600 2d 2d 29 0a 20 20 20 20 7b 0a 09 2f 2a 20 70 69 63 6b 20 61 20 72 61 6e 64 6f 6d 20 67 72 6f 75 ┆--) { /* pick a random grou┆ 0x04f200…09e600 70 20 2a 2f 0a 09 72 67 72 70 20 3d 20 61 63 74 69 76 65 2e 6e 65 77 73 67 72 6f 75 70 73 20 2b ┆p */ rgrp = active.newsgroups +┆ 0x04f200…09e600 20 72 61 6e 64 28 29 20 25 20 61 63 74 69 76 65 2e 6e 67 63 3b 0a 0a 09 69 66 20 28 28 67 70 20 ┆ rand() % active.ngc; if ((gp ┆ 0x04f200…09e600 3d 20 6e 67 66 69 6e 64 28 72 67 72 70 2d 3e 6e 67 5f 6e 61 6d 65 29 29 20 3d 3d 20 28 67 72 6f ┆= ngfind(rgrp->ng_name)) == (gro┆ 0x04f200…09e600 75 70 5f 74 20 2a 29 4e 55 4c 4c 29 0a 09 20 20 20 20 28 76 6f 69 64 29 20 70 72 69 6e 74 66 28 ┆up_t *)NULL) (void) printf(┆ 0x04f200…09e600 22 25 30 34 64 3a 20 45 52 52 4f 52 2c 20 25 73 20 4e 4f 54 20 46 4f 55 4e 44 5c 6e 22 2c 20 2b ┆"%04d: ERROR, %s NOT FOUND\n", +┆ 0x04f200…09e600 2b 69 2c 20 72 67 72 70 2d 3e 6e 67 5f 6e 61 6d 65 29 3b 0a 09 65 6c 73 65 0a 09 20 20 20 20 28 ┆+i, rgrp->ng_name); else (┆ 0x04f200…09e600 76 6f 69 64 29 20 70 72 69 6e 74 66 28 22 25 30 34 64 3a 20 47 72 6f 75 70 20 25 73 20 66 6f 75 ┆void) printf("%04d: Group %s fou┆ 0x04f200…09e600 6e 64 2c 20 6e 61 6d 65 20 25 73 5c 6e 22 2c 0a 09 09 09 09 2b 2b 69 2c 20 72 67 72 70 2d 3e 6e ┆nd, name %s\n", ++i, rgrp->n┆ 0x04f200…09e600 67 5f 6e 61 6d 65 2c 20 67 70 2d 3e 6e 67 5f 6e 61 73 72 63 2f 44 2e 6e 65 77 73 2f 72 64 6e 65 ┆g_name, gp->ng_nasrc/D.news/rdne┆ 0x04f200…09e600 77 73 72 63 2e 63 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆wsrc.c ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆ ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 20 20 20 34 34 34 20 00 20 20 20 ┆ 444 ┆ 0x04f200…09e600 31 34 35 20 00 20 20 20 20 20 31 20 00 20 20 20 20 20 20 31 31 33 32 36 20 20 34 34 35 37 32 34 ┆145 1 11326 445724┆ 0x04f200…09e600 33 35 31 35 20 20 31 30 30 33 32 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆3515 10032 ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆ ┆ […0x9…] 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆ /**************┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆********************************┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 0a ┆****************************** ┆ 0x04f200…09e600 4e 41 4d 45 0a 20 20 20 72 64 6e 65 77 73 72 63 2e 63 20 2d 2d 20 66 75 6e 63 74 69 6f 6e 73 20 ┆NAME rdnewsrc.c -- functions ┆ 0x04f200…09e600 66 6f 72 20 72 65 61 64 69 6e 67 20 2e 6e 65 77 73 72 63 20 66 69 6c 65 73 0a 0a 53 59 4e 4f 50 ┆for reading .newsrc files SYNOP┆ 0x04f200…09e600 53 49 53 0a 20 20 20 23 69 6e 63 6c 75 64 65 20 22 61 63 74 69 76 65 2e 68 22 0a 20 20 20 23 69 ┆SIS #include "active.h" #i┆ 0x04f200…09e600 6e 63 6c 75 64 65 20 22 6e 65 77 73 72 63 2e 68 22 0a 0a 20 20 20 69 6e 74 20 72 64 6e 65 77 73 ┆nclude "newsrc.h" int rdnews┆ 0x04f200…09e600 72 63 28 6e 65 77 73 72 63 29 09 09 2d 2d 20 6c 6f 61 64 20 2e 6e 65 77 73 72 63 20 69 6e 66 6f ┆rc(newsrc) -- load .newsrc info┆ 0x04f200…09e600 20 66 72 6f 6d 20 67 69 76 65 6e 20 66 69 6c 65 0a 20 20 20 63 68 61 72 20 2a 6e 65 77 73 72 63 ┆ from given file char *newsrc┆ 0x04f200…09e600 3b 0a 0a 44 45 53 43 52 49 50 54 49 4f 4e 0a 20 20 20 54 68 65 73 65 20 66 75 6e 63 74 69 6f 6e ┆; DESCRIPTION These function┆ 0x04f200…09e600 73 20 70 72 6f 76 69 64 65 20 74 68 65 20 72 65 61 64 20 73 69 64 65 20 6f 66 20 61 20 63 6c 65 ┆s provide the read side of a cle┆ 0x04f200…09e600 61 6e 20 69 6e 74 65 72 66 61 63 65 20 74 6f 20 74 68 65 20 2e 6e 65 77 73 72 63 0a 66 69 6c 65 ┆an interface to the .newsrc file┆ 0x04f200…09e600 73 20 64 65 73 63 72 69 62 65 64 20 69 6e 20 6e 65 77 73 72 63 28 35 29 20 28 74 68 65 20 77 72 ┆s described in newsrc(5) (the wr┆ 0x04f200…09e600 69 74 65 20 73 69 64 65 20 6c 69 76 65 73 20 69 6e 20 77 72 6e 65 77 73 72 63 2e 63 29 2e 20 54 ┆ite side lives in wrnewsrc.c). T┆ 0x04f200…09e600 68 65 79 20 61 73 73 75 6d 65 0a 74 68 61 74 20 72 64 61 63 74 69 76 65 28 29 20 68 61 73 20 62 ┆hey assume that rdactive() has b┆ 0x04f200…09e600 65 65 6e 20 63 61 6c 6c 65 64 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 69 6e 2d ┆een called to initialize the in-┆ 0x04f200…09e600 63 6f 72 65 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 0a 68 6f 6c 64 73 20 67 ┆core data structure that holds g┆ 0x04f200…09e600 72 6f 75 70 20 64 61 74 61 2e 0a 0a 20 20 20 54 79 70 69 63 61 6c 6c 79 2c 20 74 68 65 20 63 61 ┆roup data. Typically, the ca┆ 0x04f200…09e600 6c 6c 65 72 20 77 69 6c 6c 20 70 65 72 66 6f 72 6d 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 63 61 ┆ller will perform one or more ca┆ 0x04f200…09e600 6c 6c 73 20 74 6f 20 74 68 65 20 72 64 6e 65 77 73 72 63 28 29 0a 66 75 6e 63 74 69 6f 6e 2e 20 ┆lls to the rdnewsrc() function. ┆ 0x04f200…09e600 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 65 72 67 65 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e ┆This function merges information┆ 0x04f200…09e600 20 66 72 6f 6d 20 61 20 67 69 76 65 6e 20 2e 6e 65 77 73 72 63 20 66 69 6c 65 0a 69 6e 74 6f 20 ┆ from a given .newsrc file into ┆ 0x04f200…09e600 74 68 65 20 6e 67 5f 62 69 74 73 20 70 61 72 74 73 20 6f 66 20 74 68 65 20 6e 65 77 73 67 72 6f ┆the ng_bits parts of the newsgro┆ 0x04f200…09e600 75 70 73 20 61 72 72 61 79 2e 0a 0a 46 49 4c 45 53 0a 20 20 20 7e 2f 2e 6e 65 77 73 72 63 09 09 ┆ups array. FILES ~/.newsrc ┆ 0x04f200…09e600 2d 2d 20 70 65 72 2d 75 73 65 72 20 69 6e 66 6f 20 6f 6e 20 77 68 69 63 68 20 61 72 74 69 63 6c ┆-- per-user info on which articl┆ 0x04f200…09e600 65 73 20 68 61 76 65 20 62 65 65 6e 20 72 65 61 64 0a 20 20 20 41 44 4d 2f 61 75 74 68 6f 72 69 ┆es have been read ADM/authori┆ 0x04f200…09e600 7a 65 64 09 2d 2d 20 75 73 65 72 20 6d 61 79 20 62 65 20 6c 6f 63 6b 65 64 20 6f 75 74 20 6f 66 ┆zed -- user may be locked out of┆ 0x04f200…09e600 20 73 75 62 73 63 72 69 62 69 6e 67 20 74 6f 20 73 6f 6d 65 20 67 72 6f 75 70 73 0a 0a 46 49 4c ┆ subscribing to some groups FIL┆ 0x04f200…09e600 45 20 46 4f 52 4d 41 54 0a 20 20 20 53 65 65 20 6e 65 77 73 28 35 29 2e 20 54 68 65 20 72 64 6e ┆E FORMAT See news(5). The rdn┆ 0x04f200…09e600 65 77 73 72 63 28 29 20 66 75 6e 63 74 69 6f 6e 20 69 67 6e 6f 72 65 73 20 6f 70 74 69 6f 6e 73 ┆ewsrc() function ignores options┆ 0x04f200…09e600 2c 20 63 6f 6d 6d 65 6e 74 73 2c 20 67 72 6f 75 70 0a 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 73 2c ┆, comments, group command lines,┆ 0x04f200…09e600 20 61 6e 64 20 75 6e 73 75 62 73 63 72 69 62 65 64 2d 64 69 73 63 75 73 73 69 6f 6e 20 49 44 73 ┆ and unsubscribed-discussion IDs┆ 0x04f200…09e600 2e 0a 0a 53 45 45 20 41 4c 53 4f 0a 20 20 20 72 64 62 69 74 73 2e 63 09 09 2d 2d 20 66 75 6e 63 ┆. SEE ALSO rdbits.c -- func┆ 0x04f200…09e600 74 69 6f 6e 73 20 74 6f 20 65 78 61 6d 69 6e 65 20 61 6e 64 20 73 65 74 20 73 65 65 6e 20 62 69 ┆tions to examine and set seen bi┆ 0x04f200…09e600 74 73 0a 20 20 20 77 72 6e 65 77 73 72 63 2e 63 09 2d 2d 20 66 75 6c 6c 20 2e 6e 65 77 73 72 63 ┆ts wrnewsrc.c -- full .newsrc┆ 0x04f200…09e600 20 69 6e 74 65 72 70 72 65 74 61 74 69 6f 6e 20 66 6f 72 20 75 73 65 20 77 69 74 68 20 72 65 61 ┆ interpretation for use with rea┆ 0x04f200…09e600 64 65 72 73 2e 0a 0a 41 55 54 48 4f 52 0a 20 20 20 45 72 69 63 20 53 2e 20 52 61 79 6d 6f 6e 64 ┆ders. AUTHOR Eric S. Raymond┆ 0x04f200…09e600 0a 20 20 20 54 68 69 73 20 73 6f 66 74 77 61 72 65 20 69 73 20 43 6f 70 79 72 69 67 68 74 20 28 ┆ This software is Copyright (┆ 0x04f200…09e600 43 29 20 31 39 38 39 20 62 79 20 45 72 69 63 20 53 2e 20 52 61 79 6d 6f 6e 64 20 66 6f 72 20 74 ┆C) 1989 by Eric S. Raymond for t┆ 0x04f200…09e600 68 65 20 73 6f 6c 65 20 70 75 72 70 6f 73 65 0a 6f 66 20 70 72 6f 74 65 63 74 69 6e 67 20 66 72 ┆he sole purpose of protecting fr┆ 0x04f200…09e600 65 65 20 72 65 64 69 73 74 72 69 62 75 74 69 6f 6e 3b 20 73 65 65 20 74 68 65 20 4c 49 43 45 4e ┆ee redistribution; see the LICEN┆ 0x04f200…09e600 53 45 20 66 69 6c 65 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆SE file for details. **********┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆********************************┆ […0x1…] 0x04f200…09e600 2f 0a 2f 2a 4c 49 4e 54 4c 49 42 52 41 52 59 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 6e 65 77 73 ┆/ /*LINTLIBRARY*/ #include "news┆ 0x04f200…09e600 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 61 63 74 69 76 65 2e 68 22 0a 23 69 6e 63 6c 75 64 65 ┆.h" #include "active.h" #include┆ 0x04f200…09e600 20 22 6e 65 77 73 72 63 2e 68 22 0a 23 69 66 64 65 66 20 43 4f 4d 4d 55 4e 49 53 54 0a 23 69 6e ┆ "newsrc.h" #ifdef COMMUNIST #in┆ 0x04f200…09e600 63 6c 75 64 65 20 22 66 61 73 63 69 73 74 2e 68 22 0a 23 65 6e 64 69 66 20 2f 2a 20 43 4f 4d 4d ┆clude "fascist.h" #endif /* COMM┆ 0x04f200…09e600 55 4e 49 53 54 20 2a 2f 0a 0a 70 72 69 76 61 74 65 20 69 6e 74 09 72 63 72 65 61 64 6f 6b 20 3d ┆UNIST */ private int rcreadok =┆ 0x04f200…09e600 20 30 3b 09 2f 2a 20 63 6f 75 6e 74 20 6f 66 20 2e 6e 65 77 73 72 63 20 66 69 6c 65 73 20 72 65 ┆ 0; /* count of .newsrc files re┆ 0x04f200…09e600 61 64 20 69 6e 20 2a 2f 0a 0a 69 6e 74 20 72 64 6e 65 77 73 72 63 28 6e 65 77 73 72 63 29 0a 2f ┆ad in */ int rdnewsrc(newsrc) /┆ 0x04f200…09e600 2a 0a 20 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 61 64 73 20 61 20 2e 6e 65 77 73 ┆* * This function reads a .news┆ 0x04f200…09e600 72 63 2d 66 6f 72 6d 61 74 20 66 69 6c 65 2c 20 61 6e 64 20 6c 6f 67 69 63 61 6c 2d 61 6e 64 73 ┆rc-format file, and logical-ands┆ 0x04f200…09e600 0a 20 2a 20 69 74 73 20 61 6c 72 65 61 64 79 2d 72 65 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e ┆ * its already-read information┆ 0x04f200…09e600 20 69 6e 74 6f 20 74 68 65 20 63 61 6c 6c 6f 63 27 64 20 61 72 65 61 20 63 72 65 61 74 65 64 0a ┆ into the calloc'd area created ┆ 0x04f200…09e600 20 2a 20 62 79 20 61 20 72 64 61 63 74 69 76 65 28 29 2e 20 46 6f 72 20 65 61 63 68 20 75 6e 72 ┆ * by a rdactive(). For each unr┆ 0x04f200…09e600 65 61 64 20 61 72 74 69 63 6c 65 20 61 20 7a 65 72 6f 20 69 73 20 61 6e 64 65 64 20 69 6e 74 6f ┆ead article a zero is anded into┆ 0x04f200…09e600 0a 20 2a 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 70 6c 61 63 65 20 69 6e 20 74 ┆ * the corresponding place in t┆ 0x04f200…09e600 68 65 20 62 69 74 6d 61 70 2e 20 49 66 20 6e 6f 20 72 64 61 63 74 69 76 65 28 29 20 6f 72 0a 20 ┆he bitmap. If no rdactive() or ┆ 0x04f200…09e600 2a 20 72 64 61 63 74 66 69 6c 65 28 29 20 68 61 73 20 62 65 65 6e 20 64 6f 6e 65 20 61 20 72 64 ┆* rdactfile() has been done a rd┆ 0x04f200…09e600 61 63 74 69 76 65 28 29 20 69 73 20 66 6f 72 63 65 64 2e 20 49 66 20 46 41 49 4c 20 69 73 0a 20 ┆active() is forced. If FAIL is ┆ 0x04f200…09e600 2a 20 72 65 74 75 72 6e 65 64 2c 20 65 72 72 6e 6f 20 77 69 6c 6c 20 62 65 20 73 65 74 20 74 6f ┆* returned, errno will be set to┆ 0x04f200…09e600 20 45 49 4e 56 41 4c 20 28 66 6f 72 20 62 61 64 20 66 6f 72 6d 61 74 29 20 69 66 20 74 68 65 0a ┆ EINVAL (for bad format) if the ┆ 0x04f200…09e600 20 2a 20 70 72 6f 62 6c 65 6d 20 77 61 73 20 61 20 66 6f 72 6d 61 74 20 65 72 72 6f 72 2c 20 6f ┆ * problem was a format error, o┆ 0x04f200…09e600 74 68 65 72 77 69 73 65 20 74 68 65 20 65 72 72 6e 6f 20 76 61 6c 75 65 20 77 69 6c 6c 20 62 65 ┆therwise the errno value will be┆ 0x04f200…09e600 0a 20 2a 20 77 68 61 74 65 76 65 72 20 63 6f 6e 64 69 74 69 6f 6e 20 63 61 75 73 65 64 20 66 6f ┆ * whatever condition caused fo┆ 0x04f200…09e600 70 65 6e 28 33 29 20 74 6f 20 66 61 69 6c 2e 0a 20 2a 2f 0a 63 68 61 72 09 2a 6e 65 77 73 72 63 ┆pen(3) to fail. */ char *newsrc┆ 0x04f200…09e600 3b 0a 7b 0a 20 20 20 20 72 65 67 69 73 74 65 72 20 67 72 6f 75 70 5f 74 20 2a 6e 67 70 3b 0a 20 ┆; { register group_t *ngp; ┆ 0x04f200…09e600 20 20 20 63 68 61 72 09 20 20 20 20 73 75 62 73 63 2c 20 2a 63 70 3b 0a 20 20 20 20 63 68 61 72 ┆ char subsc, *cp; char┆ 0x04f200…09e600 09 20 20 20 20 72 63 6c 69 6e 65 5b 42 55 46 4c 45 4e 5d 3b 0a 20 20 20 20 46 49 4c 45 09 20 20 ┆ rcline[BUFLEN]; FILE ┆ 0x04f200…09e600 20 20 2a 66 70 3b 0a 23 69 66 64 65 66 20 43 4f 4d 4d 55 4e 49 53 54 0a 20 20 20 20 6e 61 73 74 ┆ *fp; #ifdef COMMUNIST nast┆ 0x04f200…09e600 79 5f 74 09 20 20 20 20 2a 72 65 73 74 72 69 63 74 20 3d 20 66 61 73 63 69 73 74 28 75 73 65 72 ┆y_t *restrict = fascist(user┆ 0x04f200…09e600 6e 61 6d 65 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 43 4f 4d 4d 55 4e 49 53 54 20 2a 2f 0a 0a 20 ┆name); #endif /* COMMUNIST */ ┆ 0x04f200…09e600 20 20 20 69 66 20 28 61 63 74 69 76 65 2e 6e 65 77 73 67 72 6f 75 70 73 20 3d 3d 20 28 67 72 6f ┆ if (active.newsgroups == (gro┆ 0x04f200…09e600 75 70 5f 74 20 2a 29 4e 55 4c 4c 29 0a 09 28 76 6f 69 64 29 20 72 64 61 63 74 69 76 65 28 4e 55 ┆up_t *)NULL) (void) rdactive(NU┆ 0x04f200…09e600 4c 4c 50 52 45 44 29 3b 0a 0a 20 20 20 20 2f 2a 20 62 61 72 66 20 69 66 20 74 68 65 20 2e 6e 65 ┆LLPRED); /* barf if the .ne┆ 0x04f200…09e600 77 73 72 63 20 66 69 6c 65 20 69 73 20 69 6c 6c 2d 66 6f 72 6d 65 64 20 2a 2f 0a 20 20 20 20 69 ┆wsrc file is ill-formed */ i┆ 0x04f200…09e600 66 20 28 28 66 70 20 3d 20 66 6f 70 65 6e 28 6e 65 77 73 72 63 2c 20 22 72 22 29 29 20 3d 3d 20 ┆f ((fp = fopen(newsrc, "r")) == ┆ 0x04f200…09e600 28 46 49 4c 45 20 2a 29 4e 55 4c 4c 29 0a 09 72 65 74 75 72 6e 28 46 41 49 4c 29 3b 09 2f 2a 20 ┆(FILE *)NULL) return(FAIL); /* ┆ 0x04f200…09e600 65 72 72 6e 6f 20 73 65 74 20 62 79 20 66 6f 70 65 6e 28 29 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 ┆errno set by fopen() */ /* ┆ 0x04f200…09e600 6c 6f 6f 70 20 74 68 72 6f 75 67 68 20 74 68 65 20 2e 6e 65 77 73 72 63 20 66 69 6c 65 20 6c 69 ┆loop through the .newsrc file li┆ 0x04f200…09e600 6e 65 73 2c 20 69 6e 74 65 72 70 72 65 74 69 6e 67 20 74 68 65 6d 20 2a 2f 0a 20 20 20 20 77 68 ┆nes, interpreting them */ wh┆ 0x04f200…09e600 69 6c 65 20 28 66 67 65 74 73 28 72 63 6c 69 6e 65 2c 20 73 69 7a 65 6f 66 28 72 63 6c 69 6e 65 ┆ile (fgets(rcline, sizeof(rcline┆ 0x04f200…09e600 29 2c 20 66 70 29 29 0a 20 20 20 20 7b 0a 09 28 76 6f 69 64 29 20 6e 73 74 72 69 70 28 72 63 6c ┆), fp)) { (void) nstrip(rcl┆ 0x04f200…09e600 69 6e 65 29 3b 0a 0a 09 2f 2a 20 72 65 6a 65 63 74 20 6c 69 6e 65 73 20 77 65 20 63 61 6e 20 74 ┆ine); /* reject lines we can t┆ 0x04f200…09e600 65 6c 6c 20 61 72 65 6e 27 74 20 6e 65 77 73 67 72 6f 75 70 20 6c 69 6e 65 73 20 2a 2f 0a 09 69 ┆ell aren't newsgroup lines */ i┆ 0x04f200…09e600 66 20 28 21 69 73 61 6c 70 68 61 28 72 63 6c 69 6e 65 5b 30 5d 29 20 7c 7c 20 21 73 74 72 6e 63 ┆f (!isalpha(rcline[0]) || !strnc┆ 0x04f200…09e600 6d 70 28 72 63 6c 69 6e 65 2c 20 22 6f 70 74 69 6f 6e 73 22 2c 20 37 29 29 0a 09 20 20 20 20 63 ┆mp(rcline, "options", 7)) c┆ 0x04f200…09e600 6f 6e 74 69 6e 75 65 3b 0a 0a 23 69 66 64 65 66 20 4d 41 43 52 4f 53 0a 09 2f 2a 20 61 6e 64 20 ┆ontinue; #ifdef MACROS /* and ┆ 0x04f200…09e600 72 65 6a 65 63 74 20 6d 61 63 72 6f 20 64 65 66 69 6e 69 74 69 6f 6e 20 6c 69 6e 65 73 20 2a 2f ┆reject macro definition lines */┆ 0x04f200…09e600 0a 09 69 66 20 28 21 73 74 72 6e 63 6d 70 28 72 63 6c 69 6e 65 2c 20 22 6d 61 63 72 6f 22 2c 20 ┆ if (!strncmp(rcline, "macro", ┆ 0x04f200…09e600 35 29 29 0a 09 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 4d 41 43 ┆5)) continue; #endif /* MAC┆ 0x04f200…09e600 52 4f 53 20 2a 2f 0a 0a 09 2f 2a 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 66 6f 72 6d 61 ┆ROS */ /* check that the forma┆ 0x04f200…09e600 74 20 69 73 20 4f 2e 4b 20 66 6f 72 20 61 20 67 72 6f 75 70 20 6c 69 6e 65 20 2a 2f 0a 09 69 66 ┆t is O.K for a group line */ if┆ 0x04f200…09e600 20 28 28 63 70 20 3d 20 73 74 72 63 68 72 28 72 63 6c 69 6e 65 2c 20 53 55 42 53 43 4d 4b 29 29 ┆ ((cp = strchr(rcline, SUBSCMK))┆ 0x04f200…09e600 20 7c 7c 20 28 63 70 20 3d 20 73 74 72 63 68 72 28 72 63 6c 69 6e 65 2c 20 55 4e 53 55 42 53 43 ┆ || (cp = strchr(rcline, UNSUBSC┆ 0x04f200…09e600 4d 4b 29 29 29 0a 09 7b 0a 09 20 20 20 20 73 75 62 73 63 20 3d 20 2a 63 70 3b 0a 09 20 20 20 20 ┆MK))) { subsc = *cp; ┆ 0x04f200…09e600 2a 63 70 2b 2b 20 3d 20 30 3b 0a 09 7d 0a 09 65 6c 73 65 0a 09 7b 0a 09 20 20 20 20 65 72 72 6e ┆*cp++ = 0; } else { errn┆ 0x04f200…09e600 6f 20 3d 20 45 49 4e 56 41 4c 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 28 46 41 49 4c 29 3b 0a 09 ┆o = EINVAL; return(FAIL); ┆ 0x04f200…09e600 7d 0a 0a 09 2f 2a 0a 09 20 2a 20 74 68 65 20 73 70 65 63 69 61 6c 20 67 72 6f 75 70 20 6e 61 6d ┆} /* * the special group nam┆ 0x04f200…09e600 65 20 27 61 6c 6c 27 20 65 78 69 73 74 73 20 73 6f 20 77 65 20 63 61 6e 20 68 61 6e 67 20 67 6c ┆e 'all' exists so we can hang gl┆ 0x04f200…09e600 6f 62 61 6c 0a 09 20 2a 20 69 6e 69 74 69 61 6c 20 63 6f 6d 6d 61 6e 64 73 20 6f 66 66 20 69 74 ┆obal * initial commands off it┆ 0x04f200…09e600 0a 09 20 2a 2f 0a 09 69 66 20 28 73 74 72 63 6d 70 28 72 63 6c 69 6e 65 2c 20 22 61 6c 6c 22 29 ┆ */ if (strcmp(rcline, "all")┆ 0x04f200…09e600 20 3d 3d 20 30 29 0a 09 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 23 69 66 64 65 66 20 43 52 ┆ == 0) continue; #ifdef CR┆ 0x04f200…09e600 41 43 4b 4d 41 49 4c 0a 09 2f 2a 0a 09 20 2a 20 6d 61 69 6c 2e 2a 20 67 72 6f 75 70 73 20 64 65 ┆ACKMAIL /* * mail.* groups de┆ 0x04f200…09e600 63 6c 61 72 65 20 6d 61 69 6c 62 6f 78 65 73 20 74 6f 20 62 65 20 63 72 61 63 6b 65 64 2e 0a 09 ┆clare mailboxes to be cracked. ┆ 0x04f200…09e600 20 2a 2f 0a 09 69 66 20 28 73 74 72 6e 63 6d 70 28 72 63 6c 69 6e 65 2c 20 22 6d 61 69 6c 2e 22 ┆ */ if (strncmp(rcline, "mail."┆ 0x04f200…09e600 2c 20 35 29 20 3d 3d 20 30 29 0a 09 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 23 65 6e 64 69 66 ┆, 5) == 0) continue; #endif┆ 0x04f200…09e600 20 2f 2a 20 43 52 41 43 4b 4d 41 49 4c 20 2a 2f 0a 0a 09 2f 2a 20 69 67 6e 6f 72 65 20 67 72 6f ┆ /* CRACKMAIL */ /* ignore gro┆ 0x04f200…09e600 75 70 73 20 6e 6f 74 20 69 6e 20 74 68 65 20 69 6e 2d 63 6f 72 65 20 67 72 6f 75 70 20 6c 69 73 ┆ups not in the in-core group lis┆ 0x04f200…09e600 74 20 2a 2f 0a 09 69 66 20 28 6e 67 70 20 3d 20 6e 67 66 69 6e 64 28 72 63 6c 69 6e 65 29 29 0a ┆t */ if (ngp = ngfind(rcline)) ┆ 0x04f200…09e600 09 7b 0a 09 20 20 20 20 6e 67 70 2d 3e 72 63 5f 66 6c 61 67 73 20 7c 3d 20 52 43 5f 4e 4f 54 45 ┆ { ngp->rc_flags |= RC_NOTE┆ 0x04f200…09e600 44 3b 0a 09 20 20 20 20 69 66 20 28 73 75 62 73 63 20 3d 3d 20 55 4e 53 55 42 53 43 4d 4b 29 0a ┆D; if (subsc == UNSUBSCMK) ┆ 0x04f200…09e600 09 09 6e 67 70 2d 3e 72 63 5f 66 6c 61 67 73 20 7c 3d 20 52 43 5f 55 4e 53 55 42 3b 0a 09 20 20 ┆ ngp->rc_flags |= RC_UNSUB; ┆ 0x04f200…09e600 20 20 65 6c 73 65 0a 09 09 6e 67 70 2d 3e 72 63 5f 66 6c 61 67 73 20 7c 3d 20 52 43 5f 48 41 53 ┆ else ngp->rc_flags |= RC_HAS┆ 0x04f200…09e600 53 55 42 53 3b 0a 23 69 66 64 65 66 20 43 4f 4d 4d 55 4e 49 53 54 0a 09 20 20 20 20 69 66 20 28 ┆SUBS; #ifdef COMMUNIST if (┆ 0x04f200…09e600 21 6e 67 6d 61 74 63 68 28 6e 67 70 2d 3e 6e 67 5f 6e 61 6d 65 2c 20 72 65 73 74 72 69 63 74 2d ┆!ngmatch(ngp->ng_name, restrict-┆ 0x04f200…09e600 3e 6e 5f 72 65 61 64 29 29 0a 09 09 6e 67 70 2d 3e 72 63 5f 66 6c 61 67 73 20 7c 3d 20 52 43 5f ┆>n_read)) ngp->rc_flags |= RC_┆ 0x04f200…09e600 55 4e 53 55 42 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 43 4f 4d 4d 55 4e 49 53 54 20 2a 2f 0a 09 7d ┆UNSUB; #endif /* COMMUNIST */ }┆ 0x04f200…09e600 0a 09 65 6c 73 65 0a 09 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 09 77 68 69 6c 65 20 28 69 ┆ else continue; while (i┆ 0x04f200…09e600 73 73 70 61 63 65 28 2a 63 70 29 29 0a 09 20 20 20 20 63 70 2b 2b 3b 0a 20 20 20 20 0a 09 2f 2a ┆sspace(*cp)) cp++; /*┆ 0x04f200…09e600 0a 09 20 2a 20 49 66 20 74 68 65 72 65 27 73 20 6e 6f 74 68 69 6e 67 20 69 6e 20 74 68 65 20 61 ┆ * If there's nothing in the a┆ 0x04f200…09e600 72 74 69 63 6c 65 73 2d 72 65 61 64 20 70 61 72 74 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 6c ┆rticles-read part of the input l┆ 0x04f200…09e600 69 6e 65 2c 0a 09 20 2a 20 73 6b 69 70 20 74 68 65 20 62 69 74 20 6d 61 70 20 63 6f 6e 73 74 72 ┆ine, * skip the bit map constr┆ 0x04f200…09e600 75 63 74 69 6f 6e 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 ┆uction that follows. This means ┆ 0x04f200…09e600 74 68 61 74 0a 09 20 2a 20 6e 67 5f 62 69 74 73 20 66 69 65 6c 64 73 20 67 65 74 20 6c 65 66 74 ┆that * ng_bits fields get left┆ 0x04f200…09e600 20 4e 55 4c 4c 20 75 6e 74 69 6c 20 77 65 20 73 65 65 20 72 65 61 6c 20 69 6e 66 6f 20 66 6f 72 ┆ NULL until we see real info for┆ 0x04f200…09e600 20 74 68 65 6d 2e 0a 09 20 2a 20 41 6c 73 6f 20 73 6b 69 70 20 74 68 65 20 63 6f 6e 73 74 72 75 ┆ them. * Also skip the constru┆ 0x04f200…09e600 63 74 69 6f 6e 20 66 6f 72 20 61 6e 79 20 67 72 6f 75 70 20 6e 6f 74 20 63 61 72 72 79 69 6e 67 ┆ction for any group not carrying┆ 0x04f200…09e600 20 61 0a 09 20 2a 20 43 48 41 4e 47 45 44 20 6d 61 72 6b 3b 20 61 6c 6c 20 67 72 6f 75 70 73 20 ┆ a * CHANGED mark; all groups ┆ 0x04f200…09e600 68 61 76 65 20 74 68 69 73 20 61 66 74 65 72 20 74 68 65 20 66 69 72 73 74 20 72 64 61 63 74 69 ┆have this after the first rdacti┆ 0x04f200…09e600 76 65 28 29 2c 0a 09 20 2a 20 73 6f 6d 65 20 67 72 6f 75 70 73 20 6d 61 79 20 68 61 76 65 20 69 ┆ve(), * some groups may have i┆ 0x04f200…09e600 74 20 61 66 74 65 72 20 73 75 62 73 65 71 75 65 6e 74 20 72 64 61 63 74 69 76 65 28 29 20 63 61 ┆t after subsequent rdactive() ca┆ 0x04f200…09e600 6c 6c 73 2e 0a 09 20 2a 0a 09 20 2a 20 54 68 65 20 66 75 6e 20 61 6e 64 20 67 61 6d 65 73 20 77 ┆lls. * * The fun and games w┆ 0x04f200…09e600 69 74 68 20 72 63 72 65 61 64 6f 6b 20 6d 65 61 6e 20 74 68 61 74 20 6f 6e 20 74 68 65 20 73 65 ┆ith rcreadok mean that on the se┆ 0x04f200…09e600 63 6f 6e 64 20 74 68 72 6f 75 67 68 0a 09 20 2a 20 6e 74 68 20 2e 6e 65 77 73 72 63 20 72 65 61 ┆cond through * nth .newsrc rea┆ 0x04f200…09e600 64 73 2c 20 75 6e 73 75 62 73 63 72 69 62 65 64 20 67 72 6f 75 70 73 20 77 6f 6e 27 74 20 61 66 ┆ds, unsubscribed groups won't af┆ 0x04f200…09e600 66 65 63 74 20 74 68 65 20 6d 61 70 20 61 74 0a 09 20 2a 20 61 6c 6c 20 61 6e 64 20 28 69 6e 20 ┆fect the map at * all and (in ┆ 0x04f200…09e600 73 75 62 73 63 72 69 62 65 64 20 67 72 6f 75 70 73 29 20 6f 6e 6c 79 20 62 69 74 20 63 6c 65 61 ┆subscribed groups) only bit clea┆ 0x04f200…09e600 72 73 20 77 69 6c 6c 20 67 65 74 20 64 6f 6e 65 2e 0a 09 20 2a 2f 0a 09 69 66 20 28 2a 63 70 20 ┆rs will get done. */ if (*cp ┆ 0x04f200…09e600 26 26 0a 09 09 28 6e 67 70 2d 3e 6e 67 5f 66 6c 61 67 73 20 26 20 4e 47 5f 43 48 41 4e 47 45 44 ┆&& (ngp->ng_flags & NG_CHANGED┆ 0x04f200…09e600 29 20 26 26 0a 09 09 21 28 72 63 72 65 61 64 6f 6b 20 26 26 20 28 6e 67 70 2d 3e 72 63 5f 66 6c ┆) && !(rcreadok && (ngp->rc_fl┆ 0x04f200…09e600 61 67 73 20 26 20 52 43 5f 55 4e 53 55 42 29 29 20 26 26 0a 09 09 72 64 62 69 74 73 28 72 63 72 ┆ags & RC_UNSUB)) && rdbits(rcr┆ 0x04f200…09e600 65 61 64 6f 6b 20 3f 20 43 4c 45 41 52 20 3a 20 53 45 54 2c 20 63 70 2c 20 6e 67 70 29 29 0a 09 ┆eadok ? CLEAR : SET, cp, ngp)) ┆ 0x04f200…09e600 7b 0a 09 20 20 20 20 65 72 72 6e 6f 20 3d 20 45 49 4e 56 41 4c 3b 0a 09 20 20 20 20 72 65 74 75 ┆{ errno = EINVAL; retu┆ 0x04f200…09e600 72 6e 28 46 41 49 4c 29 3b 0a 09 7d 0a 0a 09 6e 67 70 2d 3e 6e 67 5f 66 6c 61 67 73 20 26 3d 7e ┆rn(FAIL); } ngp->ng_flags &=~┆ 0x04f200…09e600 20 4e 47 5f 43 48 41 4e 47 45 44 3b 09 2f 2a 20 72 65 61 64 20 62 69 74 73 20 61 72 65 20 6e 6f ┆ NG_CHANGED; /* read bits are no┆ 0x04f200…09e600 77 20 63 6f 72 72 65 63 74 20 2a 2f 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 63 74 69 76 65 2e 61 ┆w correct */ } active.a┆ 0x04f200…09e600 72 74 69 63 6c 65 2e 6d 5f 67 72 6f 75 70 20 3d 20 61 63 74 69 76 65 2e 6e 65 77 73 67 72 6f 75 ┆rticle.m_group = active.newsgrou┆ 0x04f200…09e600 70 73 3b 0a 20 20 20 20 72 63 72 65 61 64 6f 6b 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 28 53 ┆ps; rcreadok++; return(S┆ 0x04f200…09e600 55 43 43 45 45 44 29 3b 0a 7d 0a 0a 2f 2a 20 72 64 6e 65 77 73 72 63 2e 63 20 65 6e 64 73 20 68 ┆UCCEED); } /* rdnewsrc.c ends h┆ 0x04f200…09e600 65 72 65 20 2a 2f 0a 72 6f 75 67 68 0a 09 20 2a 20 6e 74 68 20 2e 6e 65 77 73 72 63 20 72 65 61 ┆ere */ rough * nth .newsrc rea┆ 0x04f200…09e600 64 73 2c 20 75 6e 73 75 62 73 63 72 69 62 65 64 20 67 72 6f 75 70 73 20 77 6f 6e 27 74 20 61 66 ┆ds, unsubscribed groups won't af┆ 0x04f200…09e600 66 65 63 74 20 74 68 65 20 6d 61 70 20 61 74 0a 09 20 2a 20 61 6c 6c 20 61 6e 64 20 28 69 6e 20 ┆fect the map at * all and (in ┆ 0x04f200…09e600 73 75 62 73 63 72 69 62 65 64 20 67 72 6f 75 70 73 29 20 6f 6e 6c 79 20 62 69 74 20 63 6c 65 61 ┆subscribed groups) only bit clea┆ 0x04f200…09e600 72 73 20 77 69 6c 6c 20 67 65 74 20 64 6f 6e 65 2e 0a 09 20 2a 2f 0a 09 69 66 20 28 2a 63 70 20 ┆rs will get done. */ if (*cp ┆ 0x04f200…09e600 26 26 0a 09 09 28 6e 67 70 2d 3e 6e 67 5f 66 6c 61 67 73 20 26 20 4e 47 5f 43 48 41 4e 47 45 44 ┆&& (ngp->ng_flags & NG_CHANGED┆ 0x04f200…09e600 29 20 26 26 0a 09 09 21 28 72 63 72 65 61 64 6f 6b 20 26 26 20 28 6e 67 70 2d 3e 72 63 5f 66 6c ┆) && !(rcreadok && (ngp->rc_fl┆ 0x04f200…09e600 61 67 73 20 26 20 52 43 5f 55 4e 53 55 42 29 29 20 26 26 0a 09 09 72 64 62 69 74 73 28 72 63 72 ┆ags & RC_UNSUB)) && rdbits(rcr┆ 0x04f200…09e600 65 61 64 6f 6b 20 3f 20 43 4c 45 41 52 20 3a 20 53 45 54 2c 20 63 70 2c 20 6e 67 70 29 29 0a 09 ┆eadok ? CLEAR : SET, cp, ngp)) ┆ 0x04f200…09e600 7b 0a 09 20 20 20 20 65 72 72 6e 6f 20 3d 20 45 49 73 72 63 2f 44 2e 6e 65 77 73 2f 73 79 73 6d ┆{ errno = EIsrc/D.news/sysm┆ 0x04f200…09e600 61 69 6c 2e 63 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆ail.c ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆ ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 20 20 20 34 34 34 20 00 20 20 20 ┆ 444 ┆ 0x04f200…09e600 31 34 35 20 00 20 20 20 20 20 31 20 00 20 20 20 20 20 20 31 34 35 31 30 20 20 34 34 35 36 31 35 ┆145 1 14510 445615┆ 0x04f200…09e600 34 30 34 36 20 20 20 37 36 36 31 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆4046 7661 ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆ ┆ […0x9…] 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆ /**************┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆********************************┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a ┆******************************* ┆ 0x04f200…09e600 0a 4e 41 4d 45 0a 20 20 20 73 79 73 6d 61 69 6c 2e 63 20 2d 2d 20 6d 61 69 6c 65 72 20 69 6e 74 ┆ NAME sysmail.c -- mailer int┆ 0x04f200…09e600 65 72 66 61 63 65 20 66 6f 72 20 6e 65 77 73 20 74 72 61 6e 73 6d 69 73 73 69 6f 6e 20 70 72 6f ┆erface for news transmission pro┆ 0x04f200…09e600 67 72 61 6d 73 0a 0a 53 59 4e 4f 50 53 49 53 0a 20 20 20 46 49 4c 45 20 2a 6d 61 69 6c 6f 70 65 ┆grams SYNOPSIS FILE *mailope┆ 0x04f200…09e600 6e 28 74 6f 2c 20 73 75 62 6a 65 63 74 29 09 2d 2d 20 6f 70 65 6e 20 61 20 70 69 70 65 20 74 6f ┆n(to, subject) -- open a pipe to┆ 0x04f200…09e600 20 6d 61 69 6c 0a 20 20 20 63 68 61 72 20 2a 74 6f 2c 20 2a 73 75 62 6a 65 63 74 3b 0a 0a 20 20 ┆ mail char *to, *subject; ┆ 0x04f200…09e600 20 69 6e 74 20 6d 61 69 6c 63 6c 6f 73 65 28 6d 66 70 29 09 09 2d 2d 20 63 6c 6f 73 65 20 61 20 ┆ int mailclose(mfp) -- close a ┆ 0x04f200…09e600 6d 61 69 6c 20 70 69 70 65 2c 20 73 65 6e 64 69 6e 67 20 74 68 65 20 6d 65 73 73 61 67 65 0a 20 ┆mail pipe, sending the message ┆ 0x04f200…09e600 20 20 46 49 4c 45 20 2a 6d 66 70 3b 0a 0a 20 20 20 63 68 61 72 20 2a 6d 61 69 6c 72 65 70 6c 79 ┆ FILE *mfp; char *mailreply┆ 0x04f200…09e600 28 68 70 74 72 29 09 2d 2d 20 63 6f 6d 70 75 74 65 20 61 20 72 65 70 6c 79 20 70 61 74 68 20 66 ┆(hptr) -- compute a reply path f┆ 0x04f200…09e600 6f 72 20 74 68 65 20 67 69 76 65 6e 20 68 65 61 64 65 72 0a 20 20 20 68 64 72 5f 74 20 2a 68 70 ┆or the given header hdr_t *hp┆ 0x04f200…09e600 74 72 3b 0a 0a 44 45 53 43 52 49 50 54 49 4f 4e 0a 20 20 20 54 68 65 73 65 20 66 75 6e 63 74 69 ┆tr; DESCRIPTION These functi┆ 0x04f200…09e600 6f 6e 73 20 70 72 6f 76 69 64 65 20 61 20 72 65 61 73 6f 6e 61 62 6c 79 20 73 65 63 75 72 65 20 ┆ons provide a reasonably secure ┆ 0x04f200…09e600 69 6e 74 65 72 66 61 63 65 20 74 6f 20 74 68 65 20 6d 61 69 6c 20 62 61 63 6b 20 65 6e 64 0a 66 ┆interface to the mail back end f┆ 0x04f200…09e600 6f 72 20 6e 65 74 6e 65 77 73 20 70 72 6f 67 72 61 6d 73 2e 20 54 68 65 79 20 66 75 6e 63 74 69 ┆or netnews programs. They functi┆ 0x04f200…09e600 6f 6e 20 61 6c 73 6f 20 74 72 79 20 74 6f 20 64 6f 20 73 6f 6d 65 20 6f 70 74 69 6d 69 7a 61 74 ┆on also try to do some optimizat┆ 0x04f200…09e600 69 6f 6e 20 6f 66 20 61 64 64 72 65 73 73 0a 70 61 74 68 73 20 28 69 6e 63 6c 75 64 69 6e 67 20 ┆ion of address paths (including ┆ 0x04f200…09e600 61 20 63 6f 75 70 6c 65 20 6f 66 20 72 65 61 6c 6c 79 20 75 67 6c 79 20 68 61 63 6b 73 20 66 6f ┆a couple of really ugly hacks fo┆ 0x04f200…09e600 72 20 73 70 65 63 69 66 69 63 20 6e 65 74 77 6f 72 6b 73 20 61 6e 64 0a 6d 61 63 68 69 6e 65 20 ┆r specific networks and machine ┆ 0x04f200…09e600 74 79 70 65 73 20 74 68 61 74 20 61 72 65 20 69 73 6f 6c 61 74 65 64 20 69 6e 20 74 68 65 20 70 ┆types that are isolated in the p┆ 0x04f200…09e600 61 74 68 6f 70 74 28 29 20 66 75 6e 63 74 69 6f 6e 29 0a 0a 4e 4f 54 45 0a 20 20 20 4d 61 69 6c ┆athopt() function) NOTE Mail┆ 0x04f200…09e600 6f 70 65 6e 28 29 20 77 72 69 74 65 73 20 44 61 74 65 2c 20 46 72 6f 6d 2c 20 54 6f 2c 20 61 6e ┆open() writes Date, From, To, an┆ 0x04f200…09e600 64 20 53 75 62 6a 65 63 74 20 68 65 61 64 65 72 73 2c 20 62 75 74 20 64 6f 65 73 20 6e 6f 74 0a ┆d Subject headers, but does not ┆ 0x04f200…09e600 66 6f 6c 6c 6f 77 20 74 68 65 6d 20 77 69 74 68 20 61 20 6e 65 77 6c 69 6e 65 2e 20 54 68 69 73 ┆follow them with a newline. This┆ 0x04f200…09e600 20 69 73 20 61 20 66 65 61 74 75 72 65 2c 20 6e 6f 74 20 61 20 62 75 67 20 2d 2d 20 69 74 20 65 ┆ is a feature, not a bug -- it e┆ 0x04f200…09e600 6e 61 62 6c 65 73 0a 63 61 6c 6c 65 72 73 20 74 6f 20 61 64 64 20 74 68 65 69 72 20 6f 77 6e 20 ┆nables callers to add their own ┆ 0x04f200…09e600 68 65 61 64 65 72 20 6c 69 6e 65 73 2e 0a 0a 42 55 47 53 0a 20 20 20 54 68 65 72 65 20 61 72 65 ┆header lines. BUGS There are┆ 0x04f200…09e600 20 73 6f 6d 65 20 72 65 61 6c 6c 79 20 75 67 6c 79 2d 6c 6f 6f 6b 69 6e 67 20 68 61 63 6b 73 20 ┆ some really ugly-looking hacks ┆ 0x04f200…09e600 69 6e 20 70 61 74 68 6f 70 74 2e 63 20 69 6e 68 65 72 69 74 65 64 20 66 72 6f 6d 20 6f 6c 64 65 ┆in pathopt.c inherited from olde┆ 0x04f200…09e600 72 0a 6e 65 77 73 20 76 65 72 73 69 6f 6e 73 2e 20 53 65 65 20 74 68 65 20 23 69 66 64 65 66 20 ┆r news versions. See the #ifdef ┆ 0x04f200…09e600 53 75 6e 33 20 61 6e 64 20 42 45 52 4b 4e 45 54 20 63 6f 64 65 2e 20 42 6c 65 74 63 68 2e 20 4c ┆Sun3 and BERKNET code. Bletch. L┆ 0x04f200…09e600 65 66 74 20 69 6e 20 66 6f 72 0a 63 6f 6d 70 6c 65 74 65 6e 65 73 73 3b 20 75 73 65 20 61 74 20 ┆eft in for completeness; use at ┆ 0x04f200…09e600 79 6f 75 72 20 6f 77 6e 20 72 69 73 6b 2e 0a 0a 52 45 56 49 53 45 44 20 42 59 0a 20 20 20 45 72 ┆your own risk. REVISED BY Er┆ 0x04f200…09e600 69 63 20 53 2e 20 52 61 79 6d 6f 6e 64 0a 20 20 20 54 68 69 73 20 73 6f 66 74 77 61 72 65 20 69 ┆ic S. Raymond This software i┆ 0x04f200…09e600 73 20 43 6f 70 79 72 69 67 68 74 20 28 43 29 20 31 39 38 39 20 62 79 20 45 72 69 63 20 53 2e 20 ┆s Copyright (C) 1989 by Eric S. ┆ 0x04f200…09e600 52 61 79 6d 6f 6e 64 20 66 6f 72 20 74 68 65 20 73 6f 6c 65 20 70 75 72 70 6f 73 65 0a 6f 66 20 ┆Raymond for the sole purpose of ┆ 0x04f200…09e600 70 72 6f 74 65 63 74 69 6e 67 20 66 72 65 65 20 72 65 64 69 73 74 72 69 62 75 74 69 6f 6e 3b 20 ┆protecting free redistribution; ┆ 0x04f200…09e600 73 65 65 20 74 68 65 20 4c 49 43 45 4e 53 45 20 66 69 6c 65 20 66 6f 72 20 64 65 74 61 69 6c 73 ┆see the LICENSE file for details┆ 0x04f200…09e600 2e 0a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆. *****************************┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆********************************┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 4c 49 4e 54 4c 49 42 52 41 52 59 2a 2f ┆***************/ /*LINTLIBRARY*/┆ 0x04f200…09e600 0a 23 69 6e 63 6c 75 64 65 20 22 6e 65 77 73 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 68 65 61 ┆ #include "news.h" #include "hea┆ 0x04f200…09e600 64 65 72 2e 68 22 0a 0a 23 64 65 66 69 6e 65 20 56 5f 42 4c 41 42 4d 41 49 4c 20 20 31 09 2f 2a ┆der.h" #define V_BLABMAIL 1 /*┆ 0x04f200…09e600 20 61 74 20 74 68 69 73 20 76 65 72 62 6f 73 65 20 6c 65 76 65 6c 20 6f 72 20 61 62 6f 76 65 2c ┆ at this verbose level or above,┆ 0x04f200…09e600 20 73 68 6f 77 20 6d 61 69 6c 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 44 5f ┆ show mail command */ #define D_┆ 0x04f200…09e600 43 41 54 4d 41 49 4c 20 20 20 32 09 2f 2a 20 61 74 20 74 68 69 73 20 64 65 62 75 67 20 6c 65 76 ┆CATMAIL 2 /* at this debug lev┆ 0x04f200…09e600 65 6c 20 61 6e 64 20 61 62 6f 76 65 2c 20 6a 75 73 74 20 60 63 61 74 60 20 6d 61 69 6c 20 2a 2f ┆el and above, just `cat` mail */┆ 0x04f200…09e600 0a 0a 23 64 65 66 69 6e 65 20 4d 41 58 50 4f 53 54 53 20 20 20 20 33 32 09 2f 2a 20 6d 61 78 69 ┆ #define MAXPOSTS 32 /* maxi┆ 0x04f200…09e600 6d 75 6d 20 23 20 6f 66 20 6d 61 69 6c 20 72 65 63 69 70 69 65 6e 74 73 20 74 6f 20 68 61 6e 64 ┆mum # of mail recipients to hand┆ 0x04f200…09e600 6c 65 20 2a 2f 0a 0a 70 72 69 76 61 74 65 20 63 68 61 72 20 2a 70 61 74 68 6f 70 74 28 70 74 72 ┆le */ private char *pathopt(ptr┆ 0x04f200…09e600 29 0a 2f 2a 20 74 72 79 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20 74 68 65 20 67 69 76 65 6e 20 61 ┆) /* try to optimize the given a┆ 0x04f200…09e600 64 64 72 65 73 73 20 66 6f 72 20 73 6f 6d 65 20 6b 6e 6f 77 6e 20 6e 65 74 77 6f 72 6b 20 71 75 ┆ddress for some known network qu┆ 0x04f200…09e600 69 72 6b 73 20 2a 2f 0a 63 68 61 72 09 2a 70 74 72 3b 0a 7b 0a 20 20 20 20 73 74 61 74 69 63 20 ┆irks */ char *ptr; { static ┆ 0x04f200…09e600 63 68 61 72 20 61 64 64 72 65 73 73 5b 50 41 54 48 4c 45 4e 5d 3b 0a 0a 20 20 20 20 28 76 6f 69 ┆char address[PATHLEN]; (voi┆ 0x04f200…09e600 64 29 20 73 74 72 63 70 79 28 61 64 64 72 65 73 73 2c 20 70 74 72 29 3b 0a 0a 23 69 66 64 65 66 ┆d) strcpy(address, ptr); #ifdef┆ 0x04f200…09e600 09 53 75 6e 49 49 49 0a 20 20 20 20 2f 2a 20 73 70 65 63 69 61 6c 20 68 61 6e 64 6c 69 6e 67 20 ┆ SunIII /* special handling ┆ 0x04f200…09e600 66 6f 72 20 53 75 6e 20 49 49 49 20 6e 65 74 77 6f 72 6b 65 64 20 6d 61 63 68 69 6e 65 73 20 6f ┆for Sun III networked machines o┆ 0x04f200…09e600 6e 6c 79 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 74 72 20 3d 20 73 74 72 72 63 68 72 28 61 64 64 ┆nly */ if (ptr = strrchr(add┆ 0x04f200…09e600 72 65 73 73 2c 20 27 2e 27 29 29 0a 20 20 20 20 7b 0a 09 69 66 20 28 70 72 65 66 69 78 28 2b 2b ┆ress, '.')) { if (prefix(++┆ 0x04f200…09e600 70 74 72 2c 20 22 4f 5a 22 29 29 0a 09 7b 0a 09 20 20 20 20 2f 2a 20 73 6f 6d 65 20 70 65 6f 70 ┆ptr, "OZ")) { /* some peop┆ 0x04f200…09e600 6c 65 20 6f 6e 6c 79 20 61 6c 6c 6f 77 20 69 74 20 69 6e 20 6c 6f 77 65 72 20 63 61 73 65 20 2e ┆le only allow it in lower case .┆ 0x04f200…09e600 2e 2e 20 2a 2f 0a 09 20 20 20 20 28 76 6f 69 64 29 20 73 74 72 63 70 79 28 70 74 72 2c 20 22 6f ┆.. */ (void) strcpy(ptr, "o┆ 0x04f200…09e600 7a 22 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 28 61 64 64 72 65 73 73 29 3b 0a 09 7d 0a 0a 09 ┆z"); return(address); } ┆ 0x04f200…09e600 69 66 20 28 70 72 65 66 69 78 28 70 74 72 2c 20 22 55 55 43 50 22 29 20 7c 7c 20 70 72 65 66 69 ┆if (prefix(ptr, "UUCP") || prefi┆ 0x04f200…09e600 78 28 70 74 72 2c 20 22 41 52 50 41 22 29 20 7c 7c 0a 09 09 09 70 72 65 66 69 78 28 70 74 72 2c ┆x(ptr, "ARPA") || prefix(ptr,┆ 0x04f200…09e600 20 22 44 45 43 22 29 20 7c 7c 20 70 72 65 66 69 78 28 70 74 72 2c 20 22 43 53 4e 45 54 22 29 29 ┆ "DEC") || prefix(ptr, "CSNET"))┆ 0x04f200…09e600 0a 09 7b 0a 09 20 20 20 20 28 76 6f 69 64 29 20 73 74 72 63 61 74 28 61 64 64 72 65 73 73 2c 20 ┆ { (void) strcat(address, ┆ 0x04f200…09e600 22 40 6d 75 6e 6e 61 72 69 2e 6f 7a 22 29 3b 20 20 2f 2a 20 76 69 61 20 73 75 6e 20 74 6f 20 6d ┆"@munnari.oz"); /* via sun to m┆ 0x04f200…09e600 75 6e 6e 61 72 69 20 2a 2f 0a 09 20 20 20 20 72 65 74 75 72 6e 28 61 64 64 72 65 73 73 29 3b 0a ┆unnari */ return(address); ┆ 0x04f200…09e600 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 6d 75 73 74 28 3f 29 20 ┆ } } /* * must(?) ┆ 0x04f200…09e600 68 61 76 65 20 63 6f 6d 65 20 66 72 6f 6d 20 61 20 75 75 63 70 20 73 69 74 65 2c 20 6c 65 74 73 ┆have come from a uucp site, lets┆ 0x04f200…09e600 20 6c 6f 6f 6b 20 73 65 65 20 69 66 20 70 61 74 68 20 70 61 73 73 65 73 0a 20 20 20 20 20 2a 20 ┆ look see if path passes * ┆ 0x04f200…09e600 74 68 72 6f 75 67 68 20 6d 75 6e 6e 61 72 69 2c 20 61 6e 64 20 69 66 20 73 6f 20 64 65 6c 65 74 ┆through munnari, and if so delet┆ 0x04f200…09e600 65 20 74 68 65 20 66 61 6b 65 20 75 75 63 70 20 70 61 74 68 20 61 66 74 65 72 20 74 68 61 74 2e ┆e the fake uucp path after that.┆ 0x04f200…09e600 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 20 28 70 74 72 20 3d 20 61 64 64 72 65 73 73 20 ┆ */ for (ptr = address ┆ 0x04f200…09e600 3b 3b 20 70 74 72 2b 2b 29 0a 20 20 20 20 7b 0a 09 69 66 20 28 70 72 65 66 69 78 28 70 74 72 2c ┆;; ptr++) { if (prefix(ptr,┆ 0x04f200…09e600 20 22 6d 75 6e 6e 61 72 69 21 22 29 29 0a 09 7b 0a 09 20 20 20 20 28 76 6f 69 64 29 20 73 74 72 ┆ "munnari!")) { (void) str┆ 0x04f200…09e600 63 70 79 28 61 64 64 72 65 73 73 2c 20 70 74 72 2b 38 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b ┆cpy(address, ptr+8); break;┆ 0x04f200…09e600 0a 09 7d 0a 09 70 74 72 20 3d 20 73 74 72 63 68 72 28 70 74 72 2c 20 50 41 54 48 53 45 50 29 3b ┆ } ptr = strchr(ptr, PATHSEP);┆ 0x04f200…09e600 0a 09 69 66 20 28 70 74 72 20 3d 3d 20 28 63 68 61 72 20 2a 29 30 29 0a 09 20 20 20 20 62 72 65 ┆ if (ptr == (char *)0) bre┆ 0x04f200…09e600 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 6e 6f 77 2c 20 6a 75 73 ┆ak; } /* * now, jus┆ 0x04f200…09e600 74 20 73 65 6e 64 20 74 68 65 20 61 64 64 72 65 73 73 20 77 65 20 68 61 76 65 20 6c 65 66 74 20 ┆t send the address we have left ┆ 0x04f200…09e600 74 6f 20 6d 75 6e 6e 61 72 69 2c 20 61 6e 64 0a 20 20 20 20 20 2a 20 68 6f 70 65 20 74 68 61 74 ┆to munnari, and * hope that┆ 0x04f200…09e600 20 73 6f 6d 65 74 68 69 6e 67 20 73 65 6e 73 69 62 6c 65 20 77 69 6c 6c 20 62 65 20 64 6f 6e 65 ┆ something sensible will be done┆ 0x04f200…09e600 20 77 69 74 68 20 69 74 20 74 68 65 72 65 2e 0a 20 20 20 20 20 2a 20 28 54 68 69 73 20 77 6f 72 ┆ with it there. * (This wor┆ 0x04f200…09e600 6b 73 20 69 6e 20 6d 6f 72 65 20 63 61 73 65 73 20 74 68 61 6e 20 79 6f 75 27 64 20 74 68 69 6e ┆ks in more cases than you'd thin┆ 0x04f200…09e600 6b 20 2e 2e 2e 29 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 28 76 6f 69 64 29 20 73 74 72 63 61 74 ┆k ...) */ (void) strcat┆ 0x04f200…09e600 28 61 64 64 72 65 73 73 2c 20 22 40 6d 75 6e 6e 61 72 69 2e 6f 7a 22 29 3b 0a 20 20 20 20 72 65 ┆(address, "@munnari.oz"); re┆ 0x04f200…09e600 74 75 72 6e 28 61 64 64 72 65 73 73 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 75 6e 49 49 49 20 ┆turn(address); #endif /* SunIII ┆ 0x04f200…09e600 2a 2f 0a 0a 23 69 66 64 65 66 20 42 45 52 4b 4e 45 54 09 2f 2a 20 74 68 69 73 20 69 73 20 61 20 ┆*/ #ifdef BERKNET /* this is a ┆ 0x04f200…09e600 66 6f 73 73 69 6c 2c 20 49 20 74 68 69 6e 6b 2e 2e 2e 20 2d 2d 20 65 73 72 20 2a 2f 0a 20 20 20 ┆fossil, I think... -- esr */ ┆ 0x04f200…09e600 20 2f 2a 0a 20 20 20 20 20 2a 20 50 6c 61 79 20 67 61 6d 65 73 20 73 74 72 69 70 70 69 6e 67 20 ┆ /* * Play games stripping ┆ 0x04f200…09e600 6f 66 66 20 6d 75 6c 74 69 70 6c 65 20 62 65 72 6b 6e 65 74 0a 20 20 20 20 20 2a 20 61 64 64 72 ┆off multiple berknet * addr┆ 0x04f200…09e600 65 73 73 65 73 20 28 61 21 62 21 63 3a 64 3a 65 20 3d 3e 20 61 21 62 21 64 3a 65 29 20 68 65 72 ┆esses (a!b!c:d:e => a!b!d:e) her┆ 0x04f200…09e600 65 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 20 28 70 74 72 20 3d 20 61 64 64 72 65 73 ┆e. */ for (ptr = addres┆ 0x04f200…09e600 73 3b 20 2a 70 74 72 3b 20 70 74 72 2b 2b 29 0a 20 20 20 20 7b 0a 09 72 65 67 69 73 74 65 72 20 ┆s; *ptr; ptr++) { register ┆ 0x04f200…09e600 63 68 61 72 20 2a 70 74 72 32 3b 0a 0a 09 69 66 20 28 73 74 72 63 68 72 28 4e 45 54 43 48 52 53 ┆char *ptr2; if (strchr(NETCHRS┆ 0x04f200…09e600 2c 2a 70 74 72 29 20 26 26 20 2a 70 74 72 3d 3d 27 3a 27 20 26 26 20 28 70 74 72 32 3d 73 74 72 ┆,*ptr) && *ptr==':' && (ptr2=str┆ 0x04f200…09e600 63 68 72 28 70 74 72 2b 31 2c 20 27 3a 27 29 29 29 0a 09 20 20 20 20 28 76 6f 69 64 29 20 73 74 ┆chr(ptr+1, ':'))) (void) st┆ 0x04f200…09e600 72 63 70 79 28 70 74 72 2c 20 70 74 72 32 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a ┆rcpy(ptr, ptr2); } #endif /*┆ 0x04f200…09e600 20 42 45 52 4b 4e 45 54 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 27 72 65 20 6c 6f 6f ┆ BERKNET */ /* If we're loo┆ 0x04f200…09e600 6b 69 6e 67 20 61 74 20 61 20 40 2d 61 64 64 72 65 73 73 2c 20 74 72 79 20 74 6f 20 66 69 6e 64 ┆king at a @-address, try to find┆ 0x04f200…09e600 20 61 20 70 61 74 68 20 74 6f 20 74 68 65 20 49 6e 74 65 72 6e 65 74 20 2a 2f 0a 20 20 20 20 69 ┆ a path to the Internet */ i┆ 0x04f200…09e600 66 20 28 28 70 74 72 20 3d 20 73 74 72 63 68 72 28 61 64 64 72 65 73 73 2c 20 27 40 27 29 29 20 ┆f ((ptr = strchr(address, '@')) ┆ 0x04f200…09e600 26 26 20 73 74 72 63 6d 70 28 73 69 74 65 2e 73 6d 61 72 74 68 6f 73 74 2c 20 22 25 73 22 29 29 ┆&& strcmp(site.smarthost, "%s"))┆ 0x04f200…09e600 0a 20 20 20 20 7b 0a 09 63 68 61 72 20 6d 62 75 66 5b 42 55 46 4c 45 4e 5d 3b 0a 0a 09 2f 2a 20 ┆ { char mbuf[BUFLEN]; /* ┆ 0x04f200…09e600 74 68 69 73 20 61 76 6f 69 64 73 20 61 62 73 75 72 64 20 72 6f 75 74 69 6e 67 20 74 68 72 6f 75 ┆this avoids absurd routing throu┆ 0x04f200…09e600 67 68 20 49 6e 74 65 72 6e 65 74 20 69 66 20 74 68 65 20 6d 61 69 6c 20 69 73 20 6c 6f 63 61 6c ┆gh Internet if the mail is local┆ 0x04f200…09e600 20 2a 2f 0a 09 69 66 20 28 21 73 74 72 63 6d 70 28 70 74 72 2b 31 2c 20 73 69 74 65 2e 66 72 6f ┆ */ if (!strcmp(ptr+1, site.fro┆ 0x04f200…09e600 6d 6e 61 6d 65 29 20 7c 7c 20 21 73 74 72 63 6d 70 28 70 74 72 2b 31 2c 20 73 69 74 65 2e 6e 6f ┆mname) || !strcmp(ptr+1, site.no┆ 0x04f200…09e600 64 65 6e 61 6d 65 29 29 0a 09 7b 0a 09 20 20 20 20 2a 70 74 72 20 3d 20 27 5c 30 27 3b 0a 09 20 ┆dename)) { *ptr = '\0'; ┆ 0x04f200…09e600 20 20 20 72 65 74 75 72 6e 28 61 64 64 72 65 73 73 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 49 66 20 77 ┆ return(address); } /* If w┆ 0x04f200…09e600 65 20 61 72 65 20 6c 75 63 6b 79 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20 21 20 6f 72 20 40 20 ┆e are lucky, there is no ! or @ ┆ 0x04f200…09e600 69 6e 20 74 68 65 20 66 6f 72 77 61 72 64 20 61 64 64 72 65 73 73 20 2a 2f 0a 09 28 76 6f 69 64 ┆in the forward address */ (void┆ 0x04f200…09e600 29 20 73 74 72 63 70 79 28 6d 62 75 66 2c 20 61 64 64 72 65 73 73 29 3b 0a 09 69 66 20 28 73 74 ┆) strcpy(mbuf, address); if (st┆ 0x04f200…09e600 72 70 62 72 6b 28 73 69 74 65 2e 73 6d 61 72 74 68 6f 73 74 2c 20 22 21 40 22 29 20 3d 3d 20 28 ┆rpbrk(site.smarthost, "!@") == (┆ 0x04f200…09e600 63 68 61 72 20 2a 29 4e 55 4c 4c 29 0a 09 20 20 20 20 28 76 6f 69 64 29 20 73 70 72 69 6e 74 66 ┆char *)NULL) (void) sprintf┆ 0x04f200…09e600 28 61 64 64 72 65 73 73 2c 20 73 69 74 65 2e 73 6d 61 72 74 68 6f 73 74 2c 20 6d 62 75 66 29 3b ┆(address, site.smarthost, mbuf);┆ 0x04f200…09e600 0a 09 65 6c 73 65 0a 09 7b 0a 09 20 20 20 20 63 68 61 72 20 2a 63 70 20 3d 20 73 74 72 63 68 72 ┆ else { char *cp = strchr┆ 0x04f200…09e600 28 6d 62 75 66 2c 20 27 40 27 29 3b 0a 0a 09 20 20 20 20 69 66 20 28 73 74 72 63 68 72 28 73 69 ┆(mbuf, '@'); if (strchr(si┆ 0x04f200…09e600 74 65 2e 73 6d 61 72 74 68 6f 73 74 2c 20 27 40 27 29 20 3d 3d 20 28 63 68 61 72 20 2a 29 4e 55 ┆te.smarthost, '@') == (char *)NU┆ 0x04f200…09e600 4c 4c 20 26 26 20 63 70 29 0a 09 20 20 20 20 7b 0a 09 09 2f 2a 20 77 65 20 68 61 76 65 20 74 6f ┆LL && cp) { /* we have to┆ 0x04f200…09e600 20 72 65 61 72 72 61 6e 67 65 20 74 68 65 20 61 64 64 72 65 73 73 20 73 6f 20 6e 6f 20 40 20 61 ┆ rearrange the address so no @ a┆ 0x04f200…09e600 72 65 20 69 6e 20 69 74 20 2a 2f 0a 09 09 63 68 61 72 20 61 61 64 64 72 65 73 73 5b 42 55 46 4c ┆re in it */ char aaddress[BUFL┆ 0x04f200…09e600 45 4e 5d 3b 0a 0a 09 09 2a 63 70 2b 2b 20 3d 20 27 5c 30 27 3b 0a 09 09 28 76 6f 69 64 29 20 73 ┆EN]; *cp++ = '\0'; (void) s┆ 0x04f200…09e600 70 72 69 6e 74 66 28 61 61 64 64 72 65 73 73 2c 20 22 25 73 21 25 73 22 2c 20 63 70 2c 20 6d 62 ┆printf(aaddress, "%s!%s", cp, mb┆ 0x04f200…09e600 75 66 29 3b 0a 09 09 28 76 6f 69 64 29 20 73 70 72 69 6e 74 66 28 61 64 64 72 65 73 73 2c 20 73 ┆uf); (void) sprintf(address, s┆ 0x04f200…09e600 69 74 65 2e 73 6d 61 72 74 68 6f 73 74 2c 20 61 61 64 64 72 65 73 73 29 3b 0a 09 20 20 20 20 7d ┆ite.smarthost, aaddress); }┆ 0x04f200…09e600 0a 09 20 20 20 20 65 6c 73 65 20 69 66 20 28 63 70 29 0a 09 20 20 20 20 7b 0a 09 09 2f 2a 20 73 ┆ else if (cp) { /* s┆ 0x04f200…09e600 6f 6d 65 20 64 61 79 73 20 79 6f 75 20 64 6f 6e 27 74 20 67 65 74 20 6c 75 63 6b 79 2e 20 70 72 ┆ome days you don't get lucky. pr┆ 0x04f200…09e600 65 73 75 6d 65 20 74 68 65 20 25 20 68 61 63 6b 20 2a 2f 0a 09 09 2a 63 70 20 3d 20 27 25 27 3b ┆esume the % hack */ *cp = '%';┆ 0x04f200…09e600 0a 09 09 28 76 6f 69 64 29 20 73 70 72 69 6e 74 66 28 61 64 64 72 65 73 73 2c 20 73 69 74 65 2e ┆ (void) sprintf(address, site.┆ 0x04f200…09e600 73 6d 61 72 74 68 6f 73 74 2c 20 6d 62 75 66 29 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 20 20 20 20 ┆smarthost, mbuf); } } ┆ 0x04f200…09e600 7d 0a 0a 20 20 20 20 72 65 74 75 72 6e 28 61 64 64 72 65 73 73 29 3b 0a 7d 0a 0a 46 49 4c 45 20 ┆} return(address); } FILE ┆ 0x04f200…09e600 2a 6d 61 69 6c 6f 70 65 6e 28 73 65 6e 64 74 6f 2c 20 73 75 62 6a 65 63 74 29 0a 2f 2a 0a 20 2a ┆*mailopen(sendto, subject) /* *┆ 0x04f200…09e600 20 52 65 74 75 72 6e 20 61 20 66 69 6c 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 6d 61 69 6c ┆ Return a file pointer to a mail┆ 0x04f200…09e600 65 72 20 72 65 61 64 79 20 74 6f 20 61 63 63 65 70 74 20 61 20 74 65 78 74 20 6d 65 73 73 61 67 ┆er ready to accept a text messag┆ 0x04f200…09e600 65 2e 0a 20 2a 20 54 68 65 20 73 65 6e 64 74 6f 20 61 72 67 75 6d 65 6e 74 20 6d 61 79 20 62 65 ┆e. * The sendto argument may be┆ 0x04f200…09e600 20 61 20 77 68 69 74 65 73 70 61 63 65 2d 73 65 70 61 72 61 74 65 64 20 6c 69 73 74 20 6f 66 20 ┆ a whitespace-separated list of ┆ 0x04f200…09e600 64 65 73 74 69 6e 61 74 69 6f 6e 73 2e 0a 20 2a 2f 0a 63 68 61 72 20 2a 73 65 6e 64 74 6f 2c 20 ┆destinations. */ char *sendto, ┆ 0x04f200…09e600 2a 73 75 62 6a 65 63 74 3b 0a 7b 0a 20 20 20 20 46 49 4c 45 20 20 20 20 2a 66 70 3b 0a 20 20 20 ┆*subject; { FILE *fp; ┆ 0x04f200…09e600 20 74 69 6d 65 5f 74 20 20 6e 6f 77 3b 0a 20 20 20 20 63 68 61 72 20 20 20 20 2a 63 70 2c 20 2a ┆ time_t now; char *cp, *┆ 0x04f200…09e600 61 64 64 72 65 73 73 65 73 2c 20 6d 61 69 6c 63 6d 64 5b 4c 42 55 46 4c 45 4e 5d 3b 0a 0a 20 20 ┆addresses, mailcmd[LBUFLEN]; ┆ 0x04f200…09e600 20 20 2f 2a 20 70 65 72 66 6f 72 6d 20 61 6c 6c 20 61 64 64 72 65 73 73 20 74 72 61 6e 73 6c 61 ┆ /* perform all address transla┆ 0x04f200…09e600 74 69 6f 6e 73 20 2a 2f 0a 20 20 20 20 28 76 6f 69 64 29 20 73 74 72 63 70 79 28 6d 61 69 6c 63 ┆tions */ (void) strcpy(mailc┆ 0x04f200…09e600 6d 64 2c 20 4d 41 49 4c 53 45 52 56 29 3b 0a 20 20 20 20 61 64 64 72 65 73 73 65 73 20 3d 20 6d ┆md, MAILSERV); addresses = m┆ 0x04f200…09e600 61 69 6c 63 6d 64 20 2b 20 73 74 72 6c 65 6e 28 6d 61 69 6c 63 6d 64 29 3b 0a 20 20 20 20 63 70 ┆ailcmd + strlen(mailcmd); cp┆ 0x04f200…09e600 20 3d 20 73 74 72 74 6f 6b 28 73 65 6e 64 74 6f 2c 20 22 20 5c 74 22 29 3b 0a 20 20 20 20 64 6f ┆ = strtok(sendto, " \t"); do┆ 0x04f200…09e600 20 7b 0a 09 28 76 6f 69 64 29 20 73 74 72 63 61 74 28 6d 61 69 6c 63 6d 64 2c 20 22 20 22 29 3b ┆ { (void) strcat(mailcmd, " ");┆ 0x04f200…09e600 0a 09 28 76 6f 69 64 29 20 73 74 72 63 61 74 28 6d 61 69 6c 63 6d 64 2c 20 70 61 74 68 6f 70 74 ┆ (void) strcat(mailcmd, pathopt┆ 0x04f200…09e600 28 63 70 29 29 3b 0a 20 20 20 20 7d 20 77 68 69 6c 65 0a 09 28 63 70 20 3d 20 73 74 72 74 6f 6b ┆(cp)); } while (cp = strtok┆ 0x04f200…09e600 28 28 63 68 61 72 20 2a 29 4e 55 4c 4c 2c 20 22 20 5c 74 22 29 29 3b 0a 0a 23 69 66 64 65 66 20 ┆((char *)NULL, " \t")); #ifdef ┆ 0x04f200…09e600 44 45 42 55 47 0a 20 20 20 20 69 66 20 28 76 65 72 62 6f 73 65 20 3e 3d 20 56 5f 42 4c 41 42 4d ┆DEBUG if (verbose >= V_BLABM┆ 0x04f200…09e600 41 49 4c 29 0a 20 20 20 20 7b 0a 09 28 76 6f 69 64 29 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 ┆AIL) { (void) fprintf(stder┆ 0x04f200…09e600 72 2c 20 22 73 79 73 6d 61 69 6c 28 5c 22 25 73 5c 22 2c 20 5c 22 25 73 5c 22 29 20 77 6f 75 6c ┆r, "sysmail(\"%s\", \"%s\") woul┆ 0x04f200…09e600 64 20 64 6f 3a 20 25 73 5c 6e 22 2c 0a 09 09 20 20 20 20 20 20 73 65 6e 64 74 6f 2c 20 73 75 62 ┆d do: %s\n", sendto, sub┆ 0x04f200…09e600 6a 65 63 74 2c 20 6d 61 69 6c 63 6d 64 29 3b 0a 09 69 66 20 28 64 65 62 75 67 20 3e 3d 20 44 5f ┆ject, mailcmd); if (debug >= D_┆ 0x04f200…09e600 43 41 54 4d 41 49 4c 29 0a 09 20 20 20 20 28 76 6f 69 64 29 20 73 74 72 63 70 79 28 6d 61 69 6c ┆CATMAIL) (void) strcpy(mail┆ 0x04f200…09e600 63 6d 64 2c 20 22 2f 62 69 6e 2f 63 61 74 22 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f ┆cmd, "/bin/cat"); } #endif /┆ 0x04f200…09e600 2a 20 44 45 42 55 47 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 63 61 6c 6c 20 74 68 65 20 6d 61 69 6c ┆* DEBUG */ /* call the mail┆ 0x04f200…09e600 65 72 20 2a 2f 0a 20 20 20 20 69 66 20 28 28 66 70 20 3d 20 70 65 6f 70 65 6e 28 6d 61 69 6c 63 ┆er */ if ((fp = peopen(mailc┆ 0x04f200…09e600 6d 64 2c 20 22 77 22 29 29 20 3d 3d 20 28 46 49 4c 45 20 2a 29 4e 55 4c 4c 29 0a 09 72 65 74 75 ┆md, "w")) == (FILE *)NULL) retu┆ 0x04f200…09e600 72 6e 28 28 46 49 4c 45 20 2a 29 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 2f 2a 20 67 65 6e 65 72 61 ┆rn((FILE *)NULL); /* genera┆ 0x04f200…09e600 74 65 20 73 74 61 6e 64 61 72 64 20 68 65 61 64 65 72 73 20 6f 6e 74 6f 20 74 68 65 20 6d 65 73 ┆te standard headers onto the mes┆ 0x04f200…09e600 73 61 67 65 20 2a 2f 0a 20 20 20 20 6e 6f 77 20 3d 20 74 69 6d 65 28 28 74 69 6d 65 5f 74 20 2a ┆sage */ now = time((time_t *┆ 0x04f200…09e600 29 4e 55 4c 4c 29 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 66 70 72 69 6e 74 66 28 66 70 2c 20 22 ┆)NULL); (void) fprintf(fp, "┆ 0x04f200…09e600 44 61 74 65 3a 20 25 73 5c 6e 22 2c 20 61 72 70 61 64 61 74 65 28 26 6e 6f 77 29 29 3b 0a 20 20 ┆Date: %s\n", arpadate(&now)); ┆ 0x04f200…09e600 20 20 28 76 6f 69 64 29 66 70 72 69 6e 74 66 28 66 70 2c 20 22 46 72 6f 6d 3a 20 25 73 40 25 73 ┆ (void)fprintf(fp, "From: %s@%s┆ 0x04f200…09e600 20 28 25 73 29 5c 6e 22 2c 0a 09 09 09 75 73 65 72 6e 61 6d 65 2c 20 73 69 74 65 2e 66 72 6f 6d ┆ (%s)\n", username, site.from┆ 0x04f200…09e600 6e 61 6d 65 2c 20 66 75 6c 6c 6e 61 6d 65 28 75 73 65 72 6e 61 6d 65 29 29 3b 0a 20 20 20 20 28 ┆name, fullname(username)); (┆ 0x04f200…09e600 76 6f 69 64 29 20 66 70 72 69 6e 74 66 28 66 70 2c 20 22 54 6f 3a 20 25 73 5c 6e 22 2c 20 61 64 ┆void) fprintf(fp, "To: %s\n", ad┆ 0x04f200…09e600 64 72 65 73 73 65 73 29 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 66 70 72 69 6e 74 66 28 66 70 2c ┆dresses); (void) fprintf(fp,┆ 0x04f200…09e600 20 22 53 75 62 6a 65 63 74 3a 20 25 73 5c 6e 22 2c 20 73 75 62 6a 65 63 74 29 3b 0a 0a 20 20 20 ┆ "Subject: %s\n", subject); ┆ 0x04f200…09e600 20 72 65 74 75 72 6e 28 66 70 29 3b 0a 7d 0a 0a 69 6e 74 20 6d 61 69 6c 63 6c 6f 73 65 28 66 70 ┆ return(fp); } int mailclose(fp┆ 0x04f200…09e600 29 0a 46 49 4c 45 09 2a 66 70 3b 0a 7b 0a 20 20 20 20 72 65 74 75 72 6e 28 70 65 63 6c 6f 73 65 ┆) FILE *fp; { return(peclose┆ 0x04f200…09e600 28 66 70 29 29 3b 0a 7d 0a 0a 0a 63 68 61 72 20 2a 6d 61 69 6c 72 65 70 6c 79 28 68 70 74 72 29 ┆(fp)); } char *mailreply(hptr)┆ 0x04f200…09e600 0a 68 64 72 5f 74 20 2a 68 70 74 72 3b 0a 7b 0a 20 20 20 20 72 65 67 69 73 74 65 72 20 63 68 61 ┆ hdr_t *hptr; { register cha┆ 0x04f200…09e600 72 20 2a 70 74 72 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63 68 61 72 20 61 64 64 72 65 73 73 5b ┆r *ptr; static char address[┆ 0x04f200…09e600 50 41 54 48 4c 45 4e 5d 3b 0a 0a 20 20 20 20 2f 2a 20 73 74 61 72 74 20 77 69 74 68 20 70 61 74 ┆PATHLEN]; /* start with pat┆ 0x04f200…09e600 68 20 6e 61 6d 65 3b 20 74 68 72 6f 77 20 61 77 61 79 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 ┆h name; throw away the name of t┆ 0x04f200…09e600 68 69 73 20 73 69 74 65 20 69 66 20 69 74 20 6c 65 61 64 73 20 2a 2f 0a 20 20 20 20 70 74 72 20 ┆his site if it leads */ ptr ┆ 0x04f200…09e600 3d 20 68 70 74 72 2d 3e 68 5f 70 61 74 68 3b 0a 20 20 20 20 69 66 20 28 70 72 65 66 69 78 28 70 ┆= hptr->h_path; if (prefix(p┆ 0x04f200…09e600 74 72 2c 73 69 74 65 2e 70 61 74 68 6e 61 6d 65 29 20 26 26 20 73 74 72 63 68 72 28 4e 45 54 43 ┆tr,site.pathname) && strchr(NETC┆ 0x04f200…09e600 48 52 53 2c 70 74 72 5b 73 74 72 6c 65 6e 28 73 69 74 65 2e 70 61 74 68 6e 61 6d 65 29 5d 29 29 ┆HRS,ptr[strlen(site.pathname)]))┆ 0x04f200…09e600 0a 09 70 74 72 20 3d 20 73 74 72 63 68 72 28 70 74 72 2c 20 50 41 54 48 53 45 50 29 20 2b 20 31 ┆ ptr = strchr(ptr, PATHSEP) + 1┆ 0x04f200…09e600 3b 0a 0a 20 20 20 20 2f 2a 20 75 73 65 20 52 65 70 6c 79 2d 54 6f 3a 20 69 66 20 70 6f 73 74 65 ┆; /* use Reply-To: if poste┆ 0x04f200…09e600 72 20 73 70 65 63 69 66 69 65 64 20 69 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 68 6c 6e 62 6c 61 ┆r specified it */ if (hlnbla┆ 0x04f200…09e600 6e 6b 28 68 70 74 72 2d 3e 68 5f 72 65 70 6c 79 74 6f 29 29 0a 09 70 74 72 20 3d 20 68 70 74 72 ┆nk(hptr->h_replyto)) ptr = hptr┆ 0x04f200…09e600 2d 3e 68 5f 72 65 70 6c 79 74 6f 3b 0a 0a 20 20 20 20 2f 2a 20 69 66 20 77 65 27 72 65 20 6f 6e ┆->h_replyto; /* if we're on┆ 0x04f200…09e600 20 49 6e 74 65 72 6e 65 74 2c 20 74 68 65 72 65 27 6c 6c 20 62 65 20 61 6e 20 49 6e 74 65 72 6e ┆ Internet, there'll be an Intern┆ 0x04f200…09e600 65 74 20 27 75 73 65 72 40 73 69 74 65 27 20 75 73 61 62 6c 65 20 2a 2f 0a 20 20 20 20 65 6c 73 ┆et 'user@site' usable */ els┆ 0x04f200…09e600 65 20 69 66 20 28 73 69 74 65 2e 73 6d 61 72 74 68 6f 73 74 5b 30 5d 20 26 26 20 68 6c 6e 62 6c ┆e if (site.smarthost[0] && hlnbl┆ 0x04f200…09e600 61 6e 6b 28 68 70 74 72 2d 3e 68 5f 66 72 6f 6d 29 29 0a 09 70 74 72 20 3d 20 68 70 74 72 2d 3e ┆ank(hptr->h_from)) ptr = hptr->┆ 0x04f200…09e600 68 5f 66 72 6f 6d 3b 0a 0a 20 20 20 20 2f 2a 20 64 69 73 63 61 72 64 20 61 6e 79 20 74 72 61 69 ┆h_from; /* discard any trai┆ 0x04f200…09e600 6c 69 6e 67 20 66 75 6c 6c 2d 6e 61 6d 65 20 63 6f 6d 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 28 76 ┆ling full-name comment */ (v┆ 0x04f200…09e600 6f 69 64 29 20 73 74 72 63 70 79 28 61 64 64 72 65 73 73 2c 20 70 74 72 29 3b 0a 20 20 20 20 69 ┆oid) strcpy(address, ptr); i┆ 0x04f200…09e600 66 20 28 70 74 72 20 3d 20 73 74 72 63 68 72 28 61 64 64 72 65 73 73 2c 20 27 28 27 29 29 0a 20 ┆f (ptr = strchr(address, '(')) ┆ 0x04f200…09e600 20 20 20 7b 0a 09 77 68 69 6c 65 20 28 70 74 72 5b 2d 31 5d 20 3d 3d 20 27 20 27 29 0a 09 20 20 ┆ { while (ptr[-1] == ' ') ┆ 0x04f200…09e600 20 20 70 74 72 2d 2d 3b 0a 09 2a 70 74 72 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 7d 0a 0a 20 20 ┆ ptr--; *ptr = '\0'; } ┆ 0x04f200…09e600 20 20 72 65 74 75 72 6e 28 70 61 74 68 6f 70 74 28 61 64 64 72 65 73 73 29 29 3b 0a 7d 0a 0a 2f ┆ return(pathopt(address)); } /┆ 0x04f200…09e600 2a 20 73 79 73 6d 61 69 6c 2e 63 20 65 6e 64 73 20 68 65 72 65 20 2a 2f 0a 45 50 29 20 2b 20 31 ┆* sysmail.c ends here */ EP) + 1┆ 0x04f200…09e600 3b 0a 0a 20 20 20 20 2f 2a 20 75 73 65 20 52 65 70 6c 79 2d 54 6f 3a 20 69 66 20 70 6f 73 74 65 ┆; /* use Reply-To: if poste┆ 0x04f200…09e600 72 20 73 70 65 63 69 66 69 65 64 20 69 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 68 6c 6e 62 6c 61 ┆r specified it */ if (hlnbla┆ 0x04f200…09e600 6e 6b 28 68 70 74 72 2d 3e 68 5f 72 65 70 6c 79 74 6f 29 29 0a 09 70 74 72 20 3d 20 68 70 74 72 ┆nk(hptr->h_replyto)) ptr = hptr┆ 0x04f200…09e600 2d 3e 68 5f 72 65 70 6c 79 74 6f 3b 0a 0a 20 20 20 20 2f 2a 20 69 66 20 77 65 27 72 65 20 6f 6e ┆->h_replyto; /* if we're on┆ 0x04f200…09e600 20 49 6e 74 65 72 6e 65 74 2c 20 74 68 65 72 65 27 6c 6c 20 62 65 20 61 6e 20 49 6e 74 65 72 6e ┆ Internet, there'll be an Intern┆ 0x04f200…09e600 65 74 20 27 75 73 65 72 40 73 69 74 65 27 20 75 73 73 72 63 2f 44 2e 6e 65 77 73 2f 74 74 79 69 ┆et 'user@site' ussrc/D.news/ttyi┆ 0x04f200…09e600 6e 2e 63 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆n.c ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆ ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 20 20 20 34 34 34 20 00 20 20 20 ┆ 444 ┆ 0x04f200…09e600 31 34 35 20 00 20 20 20 20 20 31 20 00 20 20 20 20 20 20 32 30 35 34 36 20 20 34 34 36 35 33 30 ┆145 1 20546 446530┆ 0x04f200…09e600 35 34 37 30 20 20 20 37 33 35 34 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆5470 7354 ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆ ┆ […0x9…] 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆ /**************┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆********************************┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a ┆******************************* ┆ 0x04f200…09e600 0a 4e 41 4d 45 0a 20 20 20 74 74 79 69 6e 2e 63 20 2d 2d 20 6c 69 6e 65 2d 6f 72 69 65 6e 74 65 ┆ NAME ttyin.c -- line-oriente┆ 0x04f200…09e600 64 20 63 6f 6d 6d 61 6e 64 2d 67 65 74 74 65 72 20 66 75 6e 63 74 69 6f 6e 73 0a 0a 53 59 4e 4f ┆d command-getter functions SYNO┆ 0x04f200…09e600 50 53 49 53 0a 20 20 20 23 69 6e 63 6c 75 64 65 20 22 6e 65 77 73 2e 68 22 0a 20 20 20 23 69 6e ┆PSIS #include "news.h" #in┆ 0x04f200…09e600 63 6c 75 64 65 20 22 76 69 6f 2e 68 22 0a 0a 20 20 20 76 6f 69 64 20 76 73 65 74 69 64 6c 65 28 ┆clude "vio.h" void vsetidle(┆ 0x04f200…09e600 66 75 6e 63 29 09 2d 2d 20 73 65 74 20 69 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 0a 20 20 20 76 ┆func) -- set idler function v┆ 0x04f200…09e600 6f 69 64 20 28 2a 66 75 6e 63 29 28 29 3b 0a 0a 20 20 20 63 68 61 72 20 76 67 65 74 63 28 29 09 ┆oid (*func)(); char vgetc() ┆ 0x04f200…09e600 09 2d 2d 20 67 65 74 20 6e 65 78 74 20 63 68 61 72 61 63 74 65 72 20 66 72 6f 6d 20 63 6f 6d 6d ┆ -- get next character from comm┆ 0x04f200…09e600 61 6e 64 20 6c 69 6e 65 0a 0a 20 20 20 76 6f 69 64 20 76 75 6e 67 65 74 63 68 28 63 29 09 2d 2d ┆and line void vungetch(c) --┆ 0x04f200…09e600 20 70 75 73 68 20 61 20 63 68 61 72 61 63 74 65 72 20 62 61 63 6b 20 74 6f 20 74 68 65 20 63 6f ┆ push a character back to the co┆ 0x04f200…09e600 6d 6d 61 6e 64 20 71 75 65 75 65 0a 20 20 20 63 68 61 72 20 63 3b 0a 0a 20 20 20 76 6f 69 64 20 ┆mmand queue char c; void ┆ 0x04f200…09e600 76 73 65 74 62 75 66 28 70 74 72 29 09 2d 2d 20 73 65 74 20 61 6c 74 65 72 6e 61 74 65 20 62 75 ┆vsetbuf(ptr) -- set alternate bu┆ 0x04f200…09e600 66 66 65 72 0a 20 20 20 63 68 61 72 20 2a 70 74 72 3b 0a 0a 20 20 20 76 6f 69 64 20 76 65 6e 71 ┆ffer char *ptr; void venq┆ 0x04f200…09e600 75 65 75 65 28 63 29 09 2d 2d 20 71 75 65 75 65 20 75 70 20 61 20 63 68 61 72 61 63 74 65 72 20 ┆ueue(c) -- queue up a character ┆ 0x04f200…09e600 66 6f 72 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 70 61 72 73 65 72 0a 20 20 20 69 6e 74 20 63 3b ┆for the command parser int c;┆ 0x04f200…09e600 0a 0a 20 20 20 76 6f 69 64 20 76 63 6c 65 61 72 69 6e 28 29 09 2d 2d 20 63 6c 65 61 72 20 74 68 ┆ void vclearin() -- clear th┆ 0x04f200…09e600 65 20 69 6e 70 75 74 20 71 75 65 75 65 0a 0a 20 20 20 76 6f 69 64 20 76 64 65 6c 61 79 28 29 09 ┆e input queue void vdelay() ┆ 0x04f200…09e600 2d 2d 20 64 65 6c 61 79 20 73 6f 20 61 20 6d 65 73 73 61 67 65 20 63 61 6e 20 62 65 20 72 65 61 ┆-- delay so a message can be rea┆ 0x04f200…09e600 64 0a 0a 20 20 20 76 6f 69 64 20 76 74 74 79 6d 6f 64 65 28 29 09 2d 2d 20 67 6f 20 74 6f 20 6e ┆d void vttymode() -- go to n┆ 0x04f200…09e600 6f 72 6d 61 6c 20 74 74 79 20 6d 6f 64 65 0a 0a 20 20 20 76 6f 69 64 20 76 63 72 74 6d 6f 64 65 ┆ormal tty mode void vcrtmode┆ 0x04f200…09e600 28 72 65 66 29 09 2d 2d 20 67 6f 20 74 6f 20 73 63 72 65 65 6e 20 6d 6f 64 65 0a 20 20 20 62 6f ┆(ref) -- go to screen mode bo┆ 0x04f200…09e600 6f 6c 20 72 65 66 3b 0a 0a 20 20 20 63 68 61 72 20 2a 76 67 65 74 6c 69 6e 65 28 70 72 6f 6d 70 ┆ol ref; char *vgetline(promp┆ 0x04f200…09e600 74 29 09 2d 2d 20 67 65 74 20 61 20 6c 69 6e 65 20 6f 66 20 64 61 74 61 0a 20 20 20 63 68 61 72 ┆t) -- get a line of data char┆ 0x04f200…09e600 20 2a 70 72 6f 6d 70 74 3b 0a 0a 20 20 20 63 68 61 72 20 2a 76 67 65 74 63 6d 64 28 70 72 29 09 ┆ *prompt; char *vgetcmd(pr) ┆ 0x04f200…09e600 2d 2d 20 66 65 74 63 68 20 61 20 6c 69 6e 65 20 6f 66 20 63 6f 6d 6d 61 6e 64 73 20 69 6e 74 6f ┆-- fetch a line of commands into┆ 0x04f200…09e600 20 74 68 65 20 69 6e 70 75 74 20 62 75 66 66 65 72 0a 20 20 20 63 68 61 72 20 2a 70 72 6f 6d 70 ┆ the input buffer char *promp┆ 0x04f200…09e600 74 3b 0a 0a 20 20 20 76 6f 69 64 20 76 68 6f 6d 65 28 29 09 09 2d 2d 20 68 6f 6d 65 20 63 75 72 ┆t; void vhome() -- home cur┆ 0x04f200…09e600 73 6f 72 20 28 6e 6f 2d 6f 70 29 0a 0a 20 20 20 76 63 6c 65 61 72 28 29 09 09 2d 2d 20 63 6c 65 ┆sor (no-op) vclear() -- cle┆ 0x04f200…09e600 61 72 20 73 63 72 65 65 6e 20 28 6e 6f 2d 6f 70 29 0a 0a 44 45 53 43 52 49 50 54 49 4f 4e 0a 20 ┆ar screen (no-op) DESCRIPTION ┆ 0x04f200…09e600 20 20 54 68 69 73 20 6d 6f 64 75 6c 65 20 70 72 6f 76 69 64 65 73 20 61 20 63 6f 6d 6d 6f 6e 20 ┆ This module provides a common ┆ 0x04f200…09e600 69 6e 74 65 72 66 61 63 65 20 6d 61 6e 61 67 65 72 20 66 6f 72 20 69 6e 74 65 72 66 61 63 65 73 ┆interface manager for interfaces┆ 0x04f200…09e600 20 74 68 61 74 0a 64 6f 20 6c 69 6e 65 2d 6f 72 69 65 6e 74 65 64 20 6f 75 74 70 75 74 2e 20 49 ┆ that do line-oriented output. I┆ 0x04f200…09e600 74 20 64 6f 65 73 20 6f 6e 65 20 69 6e 74 65 72 70 72 65 74 61 74 69 6f 6e 3b 20 74 68 65 20 73 ┆t does one interpretation; the s┆ 0x04f200…09e600 65 71 75 65 6e 63 65 20 45 53 43 2d 3c 78 3e 0a 69 73 20 72 65 74 75 72 6e 65 64 20 61 73 20 41 ┆equence ESC-<x> is returned as A┆ 0x04f200…09e600 4c 54 2d 78 2e 0a 0a 20 20 20 54 68 65 20 6f 6e 6c 79 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 ┆LT-x. The only function with┆ 0x04f200…09e600 20 75 6e 6f 62 76 69 6f 75 73 20 73 65 6d 61 6e 74 69 63 73 20 69 73 20 76 73 65 74 62 75 66 28 ┆ unobvious semantics is vsetbuf(┆ 0x04f200…09e600 29 2e 20 54 68 69 73 20 69 73 20 75 73 65 64 0a 74 6f 20 73 65 74 20 74 68 65 20 69 6e 74 65 72 ┆). This is used to set the inter┆ 0x04f200…09e600 66 61 63 65 20 74 6f 20 67 72 61 62 20 63 68 61 72 61 63 74 65 72 73 20 66 72 6f 6d 20 61 20 62 ┆face to grab characters from a b┆ 0x04f200…09e600 75 66 66 65 72 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65 20 73 74 61 6e 64 61 72 64 0a 70 72 ┆uffer other than the standard pr┆ 0x04f200…09e600 69 76 61 74 65 20 62 75 66 66 65 72 2e 20 54 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 72 ┆ivate buffer. The buffer pointer┆ 0x04f200…09e600 20 67 65 74 73 20 72 65 73 65 74 20 74 6f 20 64 65 66 61 75 6c 74 20 62 79 20 61 20 76 67 65 74 ┆ gets reset to default by a vget┆ 0x04f200…09e600 63 6d 64 28 29 20 6f 72 0a 76 63 6c 65 61 72 69 6e 28 29 2e 20 54 68 65 20 6d 61 69 6e 20 75 73 ┆cmd() or vclearin(). The main us┆ 0x04f200…09e600 65 20 61 6e 74 69 63 69 70 61 74 65 64 20 66 6f 72 20 69 74 20 69 73 20 66 6f 72 20 6d 6f 76 69 ┆e anticipated for it is for movi┆ 0x04f200…09e600 6e 67 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 62 75 66 66 65 72 0a 70 6f 69 6e 74 65 72 20 70 61 ┆ng the command buffer pointer pa┆ 0x04f200…09e600 73 74 20 74 65 78 74 20 74 68 61 74 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70 61 ┆st text that has already been pa┆ 0x04f200…09e600 72 73 65 64 2e 0a 0a 41 55 54 48 4f 52 0a 20 20 20 45 72 69 63 20 53 2e 20 52 61 79 6d 6f 6e 64 ┆rsed. AUTHOR Eric S. Raymond┆ 0x04f200…09e600 0a 20 20 20 54 68 69 73 20 73 6f 66 74 77 61 72 65 20 69 73 20 43 6f 70 79 72 69 67 68 74 20 28 ┆ This software is Copyright (┆ 0x04f200…09e600 43 29 20 31 39 38 39 20 62 79 20 45 72 69 63 20 53 2e 20 52 61 79 6d 6f 6e 64 20 66 6f 72 20 74 ┆C) 1989 by Eric S. Raymond for t┆ 0x04f200…09e600 68 65 20 73 6f 6c 65 20 70 75 72 70 6f 73 65 0a 6f 66 20 70 72 6f 74 65 63 74 69 6e 67 20 66 72 ┆he sole purpose of protecting fr┆ 0x04f200…09e600 65 65 20 72 65 64 69 73 74 72 69 62 75 74 69 6f 6e 3b 20 73 65 65 20 74 68 65 20 4c 49 43 45 4e ┆ee redistribution; see the LICEN┆ 0x04f200…09e600 53 45 20 66 69 6c 65 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆SE file for details. **********┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆********************************┆ […0x1…] 0x04f200…09e600 2a 2a 2a 2f 0a 2f 2a 4c 49 4e 54 4c 49 42 52 41 52 59 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 6c ┆***/ /*LINTLIBRARY*/ #include "l┆ 0x04f200…09e600 69 62 70 6f 72 74 2e 68 22 09 09 2f 2a 20 66 6f 72 20 73 74 64 69 6f 2e 68 2c 20 63 74 79 70 65 ┆ibport.h" /* for stdio.h, ctype┆ 0x04f200…09e600 2e 68 20 61 6e 64 20 74 69 6d 65 5f 74 20 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 76 69 6f 2e 68 ┆.h and time_t */ #include "vio.h┆ 0x04f200…09e600 22 0a 0a 23 69 66 6e 64 65 66 20 70 72 69 76 61 74 65 0a 23 64 65 66 69 6e 65 20 70 72 69 76 61 ┆" #ifndef private #define priva┆ 0x04f200…09e600 74 65 20 73 74 61 74 69 63 0a 23 65 6e 64 69 66 20 2f 2a 20 70 72 69 76 61 74 65 20 2a 2f 0a 23 ┆te static #endif /* private */ #┆ 0x04f200…09e600 64 65 66 69 6e 65 20 70 75 62 6c 69 63 0a 0a 23 64 65 66 69 6e 65 20 4e 4f 5f 49 44 4c 45 52 09 ┆define public #define NO_IDLER ┆ 0x04f200…09e600 28 76 6f 69 64 28 2a 29 28 29 29 4e 55 4c 4c 0a 0a 70 72 69 76 61 74 65 20 63 68 61 72 09 76 63 ┆(void(*)())NULL private char vc┆ 0x04f200…09e600 6d 64 62 75 66 5b 56 42 55 46 4c 45 4e 5d 3b 09 2f 2a 20 63 6f 6d 6d 6f 6e 20 69 6e 70 75 74 20 ┆mdbuf[VBUFLEN]; /* common input ┆ 0x04f200…09e600 62 75 66 66 65 72 20 2a 2f 0a 70 72 69 76 61 74 65 20 63 68 61 72 09 2a 76 62 75 66 70 74 72 3b ┆buffer */ private char *vbufptr;┆ 0x04f200…09e600 09 09 2f 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20 63 75 72 72 65 6e 74 20 69 6e 70 75 74 20 62 75 ┆ /* pointer to current input bu┆ 0x04f200…09e600 66 66 65 72 20 2a 2f 0a 70 72 69 76 61 74 65 20 63 68 61 72 09 2a 63 6d 64 20 3d 20 76 63 6d 64 ┆ffer */ private char *cmd = vcmd┆ 0x04f200…09e600 62 75 66 3b 09 09 2f 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20 63 75 72 72 65 6e 74 20 63 6f 6d 6d ┆buf; /* pointer to current comm┆ 0x04f200…09e600 61 6e 64 20 63 68 61 72 20 20 2a 2f 0a 70 72 69 76 61 74 65 20 62 6f 6f 6c 09 72 65 73 74 61 72 ┆and char */ private bool restar┆ 0x04f200…09e600 74 3b 09 09 2f 2a 20 54 52 55 45 20 69 66 20 73 65 74 6a 6d 70 20 6f 6e 20 73 69 67 6a 6d 70 20 ┆t; /* TRUE if setjmp on sigjmp ┆ 0x04f200…09e600 76 61 6c 69 64 20 2a 2f 0a 70 72 69 76 61 74 65 20 6a 6d 70 5f 62 75 66 09 73 69 67 6a 6d 70 62 ┆valid */ private jmp_buf sigjmpb┆ 0x04f200…09e600 75 66 3b 09 09 2f 2a 20 66 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 20 73 69 67 6e 61 6c 20 69 6e ┆uf; /* for processing signal in┆ 0x04f200…09e600 74 65 72 72 75 70 74 73 20 2a 2f 0a 70 72 69 76 61 74 65 20 69 6e 74 09 76 73 69 67 63 61 75 67 ┆terrupts */ private int vsigcaug┆ 0x04f200…09e600 68 74 3b 09 09 2f 2a 20 68 61 76 65 20 77 65 20 63 61 75 67 68 74 20 61 20 73 69 67 6e 61 6c 20 ┆ht; /* have we caught a signal ┆ 0x04f200…09e600 2a 2f 0a 70 72 69 76 61 74 65 20 76 6f 69 64 09 28 2a 69 64 6c 65 72 29 28 29 20 3d 20 4e 4f 5f ┆*/ private void (*idler)() = NO_┆ 0x04f200…09e600 49 44 4c 45 52 3b 09 2f 2a 20 74 68 65 20 69 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 ┆IDLER; /* the idler function poi┆ 0x04f200…09e600 6e 74 65 72 20 2a 2f 0a 0a 66 6f 72 77 61 72 64 20 73 74 61 74 69 63 20 63 68 61 72 20 2a 76 67 ┆nter */ forward static char *vg┆ 0x04f200…09e600 65 74 63 6c 69 6e 28 29 3b 0a 0a 76 6f 69 64 20 76 73 65 74 69 64 6c 65 28 68 6f 6f 6b 29 0a 2f ┆etclin(); void vsetidle(hook) /┆ 0x04f200…09e600 2a 20 73 65 74 20 61 6e 20 69 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 65 78 65 63 75 ┆* set an idler function to execu┆ 0x04f200…09e600 74 65 20 64 75 72 69 6e 67 20 6b 65 79 62 6f 61 72 64 20 77 61 69 74 73 20 2a 2f 0a 76 6f 69 64 ┆te during keyboard waits */ void┆ 0x04f200…09e600 09 28 2a 68 6f 6f 6b 29 28 29 3b 0a 7b 0a 20 20 20 20 69 64 6c 65 72 20 3d 20 68 6f 6f 6b 3b 0a ┆ (*hook)(); { idler = hook; ┆ 0x04f200…09e600 7d 0a 0a 69 6e 74 20 76 67 65 74 63 68 28 29 0a 2f 2a 20 67 65 74 20 61 6e 6f 74 68 65 72 20 63 ┆} int vgetch() /* get another c┆ 0x04f200…09e600 68 61 72 61 63 74 65 72 20 66 72 6f 6d 20 74 68 65 20 62 75 66 66 65 72 20 2a 2f 0a 7b 0a 20 20 ┆haracter from the buffer */ { ┆ 0x04f200…09e600 20 20 72 65 74 75 72 6e 28 2a 63 6d 64 20 3f 20 2a 63 6d 64 2b 2b 20 3a 20 45 4f 46 29 3b 0a 7d ┆ return(*cmd ? *cmd++ : EOF); }┆ 0x04f200…09e600 0a 0a 69 6e 74 20 76 67 65 74 63 28 29 0a 2f 2a 20 67 65 74 20 63 68 61 72 61 63 74 65 72 20 2a ┆ int vgetc() /* get character *┆ 0x04f200…09e600 2f 0a 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 74 68 69 73 20 65 78 69 73 74 73 20 61 73 ┆/ { /* * this exists as┆ 0x04f200…09e600 20 61 20 64 75 6d 6d 79 20 6f 6e 6c 79 20 62 65 63 61 75 73 65 20 73 63 72 65 65 6e 2d 6f 72 69 ┆ a dummy only because screen-ori┆ 0x04f200…09e600 65 6e 74 65 64 20 49 2f 4f 20 6d 61 6e 61 67 65 72 73 0a 20 20 20 20 20 2a 20 72 65 63 6f 67 6e ┆ented I/O managers * recogn┆ 0x04f200…09e600 69 7a 65 20 61 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 65 63 68 6f 65 64 20 ┆ize a difference between echoed ┆ 0x04f200…09e600 61 6e 64 20 6e 6f 6e 2d 65 63 68 6f 65 64 20 69 6e 70 75 74 0a 20 20 20 20 20 2a 2f 0a 20 20 20 ┆and non-echoed input */ ┆ 0x04f200…09e600 20 72 65 74 75 72 6e 28 76 67 65 74 63 68 28 29 29 3b 0a 7d 0a 0a 76 6f 69 64 20 76 75 6e 67 65 ┆ return(vgetch()); } void vunge┆ 0x04f200…09e600 74 63 68 28 63 29 0a 2f 2a 20 70 75 73 68 20 61 20 63 68 61 72 20 62 61 63 6b 20 74 6f 20 74 68 ┆tch(c) /* push a char back to th┆ 0x04f200…09e600 65 20 62 75 66 66 65 72 20 2a 2f 0a 63 68 61 72 09 63 3b 0a 7b 0a 20 20 20 20 69 66 20 28 63 6d ┆e buffer */ char c; { if (cm┆ 0x04f200…09e600 64 20 3e 20 76 62 75 66 70 74 72 29 0a 09 2a 2d 2d 63 6d 64 20 3d 20 63 3b 0a 20 20 20 20 65 6c ┆d > vbufptr) *--cmd = c; el┆ 0x04f200…09e600 73 65 0a 20 20 20 20 7b 0a 09 72 65 67 69 73 74 65 72 20 63 68 61 72 20 2a 63 70 3b 0a 0a 09 66 ┆se { register char *cp; f┆ 0x04f200…09e600 6f 72 20 28 63 70 20 3d 20 76 62 75 66 70 74 72 20 2b 20 73 74 72 6c 65 6e 28 76 62 75 66 70 74 ┆or (cp = vbufptr + strlen(vbufpt┆ 0x04f200…09e600 72 29 3b 20 63 70 20 3e 3d 20 76 62 75 66 70 74 72 3b 20 63 70 2d 2d 29 0a 09 20 20 20 20 63 70 ┆r); cp >= vbufptr; cp--) cp┆ 0x04f200…09e600 5b 31 5d 20 3d 20 63 70 5b 30 5d 3b 0a 09 76 62 75 66 70 74 72 5b 30 5d 20 3d 20 63 3b 0a 20 20 ┆[1] = cp[0]; vbufptr[0] = c; ┆ 0x04f200…09e600 20 20 7d 0a 7d 0a 0a 76 6f 69 64 20 76 73 65 74 62 75 66 28 70 74 72 29 0a 2f 2a 20 73 65 74 20 ┆ } } void vsetbuf(ptr) /* set ┆ 0x04f200…09e600 61 6c 74 65 72 6e 61 74 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 63 68 61 72 ┆alternate buffer pointer */ char┆ 0x04f200…09e600 20 2a 70 74 72 3b 0a 7b 0a 20 20 20 20 63 6d 64 20 3d 20 76 62 75 66 70 74 72 20 3d 20 70 74 72 ┆ *ptr; { cmd = vbufptr = ptr┆ 0x04f200…09e600 3b 0a 7d 0a 0a 76 6f 69 64 20 76 65 6e 71 75 65 75 65 28 63 29 0a 2f 2a 20 67 65 74 20 61 6e 6f ┆; } void venqueue(c) /* get ano┆ 0x04f200…09e600 74 68 65 72 20 63 68 61 72 61 63 74 65 72 20 66 72 6f 6d 20 74 68 65 20 62 75 66 66 65 72 20 2a ┆ther character from the buffer *┆ 0x04f200…09e600 2f 0a 63 68 61 72 09 63 3b 0a 7b 0a 20 20 20 20 2a 63 6d 64 2b 2b 20 3d 20 63 3b 0a 7d 0a 0a 76 ┆/ char c; { *cmd++ = c; } v┆ 0x04f200…09e600 6f 69 64 20 76 63 6c 65 61 72 69 6e 28 29 0a 2f 2a 20 63 6c 65 61 72 20 74 68 65 20 69 6e 70 75 ┆oid vclearin() /* clear the inpu┆ 0x04f200…09e600 74 20 62 75 66 66 65 72 20 2a 2f 0a 7b 0a 20 20 20 20 2a 28 63 6d 64 20 3d 20 76 63 6d 64 62 75 ┆t buffer */ { *(cmd = vcmdbu┆ 0x04f200…09e600 66 29 20 3d 20 27 5c 30 27 3b 0a 7d 0a 0a 2f 2a 20 41 52 47 53 55 53 45 44 30 20 2a 2f 0a 63 68 ┆f) = '\0'; } /* ARGSUSED0 */ ch┆ 0x04f200…09e600 61 72 20 2a 76 67 65 74 6c 69 6e 65 28 70 72 6f 6d 70 74 29 0a 2f 2a 20 67 65 74 20 61 20 6c 69 ┆ar *vgetline(prompt) /* get a li┆ 0x04f200…09e600 6e 65 20 6f 66 20 69 6e 70 75 74 20 66 6f 72 20 74 68 65 20 67 65 6e 65 72 69 63 20 63 6f 6d 6d ┆ne of input for the generic comm┆ 0x04f200…09e600 61 6e 64 20 69 6e 74 65 72 70 72 65 74 65 72 20 2a 2f 0a 63 68 61 72 09 2a 70 72 6f 6d 70 74 3b ┆and interpreter */ char *prompt;┆ 0x04f200…09e600 0a 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 68 61 72 09 6c 62 75 66 5b 56 42 55 46 4c 45 4e 5d ┆ { static char lbuf[VBUFLEN]┆ 0x04f200…09e600 3b 0a 20 20 20 20 63 68 61 72 09 2a 74 70 3b 0a 20 20 20 20 69 6e 74 09 09 63 63 3b 0a 0a 20 20 ┆; char *tp; int cc; ┆ 0x04f200…09e600 20 20 6c 62 75 66 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 66 6f 72 20 28 74 70 20 3d 20 ┆ lbuf[0] = '\0'; for (tp = ┆ 0x04f200…09e600 6c 62 75 66 3b 20 28 63 63 20 3d 20 76 67 65 74 63 68 28 29 29 20 21 3d 20 45 4f 46 20 26 26 20 ┆lbuf; (cc = vgetch()) != EOF && ┆ 0x04f200…09e600 63 63 20 21 3d 20 27 5c 6e 27 3b 20 74 70 2b 2b 29 20 7b 0a 09 69 66 20 28 63 63 20 21 3d 20 27 ┆cc != '\n'; tp++) { if (cc != '┆ 0x04f200…09e600 20 27 20 26 26 20 63 63 20 21 3d 20 27 5c 74 27 29 0a 09 09 2a 74 70 20 3d 20 63 63 3b 0a 09 65 ┆ ' && cc != '\t') *tp = cc; e┆ 0x04f200…09e600 6c 73 65 20 2d 2d 74 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 74 70 20 3d 20 27 5c 30 27 3b 0a ┆lse --tp; } *tp = '\0'; ┆ 0x04f200…09e600 20 20 20 20 72 65 74 75 72 6e 28 6c 62 75 66 29 3b 0a 7d 0a 0a 63 68 61 72 20 2a 76 67 65 74 63 ┆ return(lbuf); } char *vgetc┆ 0x04f200…09e600 6d 64 28 70 72 6f 6d 70 74 29 0a 2f 2a 20 67 65 74 20 61 6e 64 20 70 61 72 73 65 20 61 20 63 6f ┆md(prompt) /* get and parse a co┆ 0x04f200…09e600 6d 6d 61 6e 64 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 64 69 67 65 73 74 65 64 20 66 6f ┆mmand and return the digested fo┆ 0x04f200…09e600 72 6d 20 74 6f 20 74 68 65 20 75 73 65 72 20 2a 2f 0a 63 68 61 72 20 2a 70 72 6f 6d 70 74 3b 0a ┆rm to the user */ char *prompt; ┆ 0x04f200…09e600 7b 0a 20 20 20 20 72 65 67 69 73 74 65 72 20 63 68 61 72 20 2a 73 70 2c 20 2a 74 70 3b 0a 0a 20 ┆{ register char *sp, *tp; ┆ 0x04f200…09e600 20 20 20 69 66 20 28 76 67 65 74 63 6c 69 6e 28 70 72 6f 6d 70 74 29 20 3d 3d 20 28 63 68 61 72 ┆ if (vgetclin(prompt) == (char┆ 0x04f200…09e600 20 2a 29 4e 55 4c 4c 29 0a 09 72 65 74 75 72 6e 28 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a ┆ *)NULL) return((char *)NULL); ┆ 0x04f200…09e600 20 20 20 20 63 6d 64 20 3d 20 76 62 75 66 70 74 72 20 3d 20 76 63 6d 64 62 75 66 3b 0a 0a 23 69 ┆ cmd = vbufptr = vcmdbuf; #i┆ 0x04f200…09e600 66 6e 64 65 66 20 6c 69 6e 74 09 2f 2a 20 74 68 69 73 20 73 61 76 65 73 20 75 73 20 66 72 6f 6d ┆fndef lint /* this saves us from┆ 0x04f200…09e600 20 2a 69 6e 63 72 65 64 69 62 6c 65 2a 20 68 61 73 73 6c 65 73 20 77 69 74 68 20 6c 69 6e 74 20 ┆ *incredible* hassles with lint ┆ 0x04f200…09e600 2a 2f 0a 23 69 66 64 65 66 20 4d 41 43 52 4f 53 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 41 ┆*/ #ifdef MACROS /* * A┆ 0x04f200…09e600 63 63 65 70 74 20 63 68 61 72 73 20 76 69 61 20 76 67 65 74 63 68 28 29 20 74 69 6c 6c 20 77 65 ┆ccept chars via vgetch() till we┆ 0x04f200…09e600 20 67 65 74 20 61 20 72 65 63 6f 67 6e 69 7a 65 64 20 6d 61 63 72 6f 20 6f 72 0a 20 20 20 20 20 ┆ get a recognized macro or ┆ 0x04f200…09e600 2a 20 73 6f 6d 65 74 68 69 6e 67 20 74 68 61 74 20 63 61 6e 27 74 20 62 65 20 61 20 70 72 65 66 ┆* something that can't be a pref┆ 0x04f200…09e600 69 78 20 6f 66 20 61 6e 79 20 6d 61 63 72 6f 2c 20 61 6e 64 20 65 6e 71 75 65 75 65 0a 20 20 20 ┆ix of any macro, and enqueue ┆ 0x04f200…09e600 20 20 2a 20 74 68 65 20 72 65 73 75 6c 74 73 20 66 6f 72 20 76 67 65 74 63 28 29 2e 0a 20 20 20 ┆ * the results for vgetc(). ┆ 0x04f200…09e600 20 20 2a 2f 0a 20 20 20 20 76 6d 61 63 72 6f 28 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 4d 41 43 ┆ */ vmacro(); #endif /* MAC┆ 0x04f200…09e600 52 4f 53 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 6c 69 6e 74 20 2a 2f 0a 0a 20 20 20 20 2f 2a ┆ROS */ #endif /* lint */ /*┆ 0x04f200…09e600 20 70 65 72 66 6f 72 6d 20 65 73 63 61 70 65 20 69 6e 74 65 72 70 72 65 74 61 74 69 6f 6e 20 2a ┆ perform escape interpretation *┆ 0x04f200…09e600 2f 0a 20 20 20 20 66 6f 72 20 28 73 70 20 3d 20 74 70 20 3d 20 76 62 75 66 70 74 72 3b 20 2a 73 ┆/ for (sp = tp = vbufptr; *s┆ 0x04f200…09e600 70 3b 20 73 70 2b 2b 29 0a 09 69 66 20 28 2a 73 70 20 3d 3d 20 45 53 43 29 0a 09 20 20 20 20 2a ┆p; sp++) if (*sp == ESC) *┆ 0x04f200…09e600 74 70 2b 2b 20 3d 20 41 4c 54 28 2a 2b 2b 73 70 29 3b 0a 09 65 6c 73 65 0a 09 20 20 20 20 2a 74 ┆tp++ = ALT(*++sp); else *t┆ 0x04f200…09e600 70 2b 2b 20 3d 20 2a 73 70 3b 0a 20 20 20 20 2a 74 70 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 20 20 ┆p++ = *sp; *tp = '\0'; ┆ 0x04f200…09e600 72 65 74 75 72 6e 28 76 62 75 66 70 74 72 29 3b 0a 7d 0a 0a 2f 2a 20 41 52 47 53 55 53 45 44 30 ┆return(vbufptr); } /* ARGSUSED0┆ 0x04f200…09e600 20 2a 2f 0a 76 6f 69 64 20 76 74 74 79 6d 6f 64 65 28 29 0a 2f 2a 20 72 65 73 74 6f 72 65 20 74 ┆ */ void vttymode() /* restore t┆ 0x04f200…09e600 74 79 20 74 6f 20 62 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2c 20 64 69 73 61 62 6c 65 20 69 64 6c ┆ty to blocking mode, disable idl┆ 0x04f200…09e600 65 72 20 2a 2f 0a 7b 0a 23 69 66 64 65 66 20 55 53 47 0a 20 20 20 20 69 6e 74 09 6f 66 6c 61 67 ┆er */ { #ifdef USG int oflag┆ 0x04f200…09e600 73 20 3d 20 66 63 6e 74 6c 28 30 2c 20 46 5f 47 45 54 46 4c 2c 20 30 29 3b 0a 0a 20 20 20 20 28 ┆s = fcntl(0, F_GETFL, 0); (┆ 0x04f200…09e600 76 6f 69 64 29 20 66 63 6e 74 6c 28 30 2c 20 46 5f 53 45 54 46 4c 2c 20 6f 66 6c 61 67 73 20 26 ┆void) fcntl(0, F_SETFL, oflags &┆ 0x04f200…09e600 3d 20 7e 4f 5f 4e 44 45 4c 41 59 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 55 53 47 20 2a 2f 0a 7d ┆= ~O_NDELAY); #endif /* USG */ }┆ 0x04f200…09e600 0a 0a 2f 2a 20 41 52 47 53 55 53 45 44 30 20 2a 2f 0a 76 6f 69 64 20 76 63 72 74 6d 6f 64 65 28 ┆ /* ARGSUSED0 */ void vcrtmode(┆ 0x04f200…09e600 66 29 0a 62 6f 6f 6c 20 66 3b 0a 2f 2a 20 70 75 74 20 74 68 65 20 74 74 79 20 69 6e 20 6e 6f 6e ┆f) bool f; /* put the tty in non┆ 0x04f200…09e600 2d 62 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2c 20 73 6f 20 74 68 65 20 69 64 6c 65 72 20 77 69 6c ┆-blocking mode, so the idler wil┆ 0x04f200…09e600 6c 20 77 6f 72 6b 20 2a 2f 0a 7b 0a 23 69 66 64 65 66 20 55 53 47 0a 20 20 20 20 69 6e 74 09 6f ┆l work */ { #ifdef USG int o┆ 0x04f200…09e600 66 6c 61 67 73 20 3d 20 66 63 6e 74 6c 28 30 2c 20 46 5f 47 45 54 46 4c 2c 20 30 29 3b 0a 0a 20 ┆flags = fcntl(0, F_GETFL, 0); ┆ 0x04f200…09e600 20 20 20 28 76 6f 69 64 29 20 66 63 6e 74 6c 28 30 2c 20 46 5f 53 45 54 46 4c 2c 20 6f 66 6c 61 ┆ (void) fcntl(0, F_SETFL, ofla┆ 0x04f200…09e600 67 73 20 7c 3d 20 4f 5f 4e 44 45 4c 41 59 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 55 53 47 20 2a ┆gs |= O_NDELAY); #endif /* USG *┆ 0x04f200…09e600 2f 0a 7d 0a 0a 2f 2a 20 41 52 47 53 55 53 45 44 30 20 2a 2f 0a 76 6f 69 64 20 76 64 65 6c 61 79 ┆/ } /* ARGSUSED0 */ void vdelay┆ 0x04f200…09e600 28 29 09 09 7b 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69 6e 20 63 6f 6f 6b 65 64 20 6d 6f 64 65 ┆() { /* no-op in cooked mode┆ 0x04f200…09e600 20 2a 2f 09 20 20 20 20 7d 0a 76 6f 69 64 20 76 68 6f 6d 65 28 29 09 09 7b 20 20 20 20 2f 2a 20 ┆ */ } void vhome() { /* ┆ 0x04f200…09e600 6e 6f 2d 6f 70 20 69 6e 20 63 6f 6f 6b 65 64 20 6d 6f 64 65 20 2a 2f 09 20 20 20 20 7d 0a 76 6f ┆no-op in cooked mode */ } vo┆ 0x04f200…09e600 69 64 20 76 63 6c 65 61 72 28 29 09 09 7b 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69 6e 20 6e 6f ┆id vclear() { /* no-op in no┆ 0x04f200…09e600 6e 2d 73 63 72 65 65 6e 20 6d 6f 64 65 73 20 2a 2f 7d 0a 0a 2f 2a 20 66 72 6f 6d 20 68 65 72 65 ┆n-screen modes */} /* from here┆ 0x04f200…09e600 20 64 6f 77 6e 20 69 73 20 61 6c 6c 20 73 74 75 66 66 20 66 6f 72 20 69 6e 74 65 72 61 63 74 69 ┆ down is all stuff for interacti┆ 0x04f200…09e600 76 65 20 6c 69 6e 65 20 69 6e 70 75 74 20 2a 2f 0a 0a 2f 2a 0a 20 2a 20 52 6f 75 74 69 6e 65 20 ┆ve line input */ /* * Routine ┆ 0x04f200…09e600 74 6f 20 63 61 74 63 68 20 73 69 67 6e 61 6c 73 20 77 68 69 6c 65 20 67 65 74 74 69 6e 67 20 61 ┆to catch signals while getting a┆ 0x04f200…09e600 20 75 73 65 72 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 2e 0a 20 2a 2f 0a 70 72 69 76 61 74 65 20 ┆ user command line. */ private ┆ 0x04f200…09e600 63 61 74 63 68 5f 74 20 63 61 74 63 68 73 69 67 28 73 69 67 29 0a 69 6e 74 20 73 69 67 3b 0a 7b ┆catch_t catchsig(sig) int sig; {┆ 0x04f200…09e600 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 42 53 44 34 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65 ┆ #if !defined(BSD4_2) && !define┆ 0x04f200…09e600 64 28 53 59 53 56 33 29 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 4f 6c 64 65 72 20 55 4e 49 ┆d(SYSV3) /* * Older UNI┆ 0x04f200…09e600 58 20 73 79 73 74 65 6d 73 20 72 65 73 65 74 20 63 61 75 67 68 74 20 73 69 67 6e 61 6c 73 20 74 ┆X systems reset caught signals t┆ 0x04f200…09e600 6f 20 53 49 47 5f 44 46 4c 2e 0a 20 20 20 20 20 2a 20 54 68 69 73 20 62 61 64 20 64 65 73 69 67 ┆o SIG_DFL. * This bad desig┆ 0x04f200…09e600 6e 20 72 65 71 75 69 72 65 73 20 74 68 61 74 20 74 68 65 20 74 72 61 70 20 62 65 20 73 65 74 20 ┆n requires that the trap be set ┆ 0x04f200…09e600 61 67 61 69 6e 20 68 65 72 65 2e 0a 20 20 20 20 20 2a 20 55 6e 66 6f 72 74 75 6e 61 74 65 6c 79 ┆again here. * Unfortunately┆ 0x04f200…09e600 2c 20 69 66 20 74 68 65 20 73 69 67 6e 61 6c 20 72 65 63 75 72 73 20 62 65 66 6f 72 65 20 74 68 ┆, if the signal recurs before th┆ 0x04f200…09e600 65 20 74 72 61 70 20 69 73 20 73 65 74 2c 0a 20 20 20 20 20 2a 20 74 68 65 20 70 72 6f 67 72 61 ┆e trap is set, * the progra┆ 0x04f200…09e600 6d 20 77 69 6c 6c 20 64 69 65 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 28 76 6f 69 64 29 20 73 ┆m will die. */ (void) s┆ 0x04f200…09e600 69 67 6e 61 6c 28 73 69 67 2c 20 53 49 47 43 41 53 54 28 63 61 74 63 68 73 69 67 29 29 3b 0a 23 ┆ignal(sig, SIGCAST(catchsig)); #┆ 0x04f200…09e600 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 42 53 44 34 5f 32 29 20 26 26 20 21 64 65 ┆endif /* !defined(BSD4_2) && !de┆ 0x04f200…09e600 66 69 6e 65 64 28 53 59 53 56 33 29 20 2a 2f 0a 20 20 20 20 76 73 69 67 63 61 75 67 68 74 20 3d ┆fined(SYSV3) */ vsigcaught =┆ 0x04f200…09e600 20 73 69 67 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b ┆ sig; (void) fflush(stdout);┆ 0x04f200…09e600 0a 23 69 66 64 65 66 20 53 49 47 43 4f 4e 54 0a 20 20 20 20 69 66 20 28 73 69 67 20 3d 3d 20 53 ┆ #ifdef SIGCONT if (sig == S┆ 0x04f200…09e600 49 47 43 4f 4e 54 29 0a 09 76 75 70 64 61 74 65 28 29 3b 0a 20 20 20 20 65 6c 73 65 0a 23 65 6e ┆IGCONT) vupdate(); else #en┆ 0x04f200…09e600 64 69 66 20 2f 2a 20 53 49 47 43 4f 4e 54 20 2a 2f 0a 09 28 76 6f 69 64 29 20 70 75 74 63 68 61 ┆dif /* SIGCONT */ (void) putcha┆ 0x04f200…09e600 72 28 27 5c 6e 27 29 3b 0a 20 20 20 20 69 66 20 28 73 69 67 20 21 3d 20 53 49 47 49 4e 54 20 26 ┆r('\n'); if (sig != SIGINT &┆ 0x04f200…09e600 26 20 72 65 73 74 61 72 74 29 0a 09 6c 6f 6e 67 6a 6d 70 28 73 69 67 6a 6d 70 62 75 66 2c 20 31 ┆& restart) longjmp(sigjmpbuf, 1┆ 0x04f200…09e600 29 3b 0a 7d 0a 0a 70 72 69 76 61 74 65 20 63 68 61 72 20 2a 76 67 65 74 63 6c 69 6e 28 70 72 6f ┆); } private char *vgetclin(pro┆ 0x04f200…09e600 6d 70 74 29 0a 63 68 61 72 20 2a 70 72 6f 6d 70 74 3b 0a 2f 2a 0a 20 2a 20 74 68 69 73 20 69 73 ┆mpt) char *prompt; /* * this is┆ 0x04f200…09e600 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20 67 65 74 73 20 61 20 63 6f 6d 6d 61 6e 64 20 6c 69 ┆ the code that gets a command li┆ 0x04f200…09e600 6e 65 20 66 72 6f 6d 20 74 68 65 20 75 73 65 72 3b 0a 20 2a 20 69 74 73 20 70 72 69 76 61 74 65 ┆ne from the user; * its private┆ 0x04f200…09e600 20 69 6e 74 65 72 72 75 70 74 2d 63 61 74 63 68 65 72 20 66 6f 6c 6c 6f 77 73 2e 0a 20 2a 2f 0a ┆ interrupt-catcher follows. */ ┆ 0x04f200…09e600 7b 0a 20 20 20 20 2f 2a 20 77 65 20 75 73 65 20 73 65 74 6a 6d 70 28 29 2c 20 73 6f 20 64 6f 6e ┆{ /* we use setjmp(), so don┆ 0x04f200…09e600 27 74 20 64 65 63 6c 61 72 65 20 61 6e 79 20 6f 66 20 74 68 65 73 65 20 72 65 67 69 73 74 65 72 ┆'t declare any of these register┆ 0x04f200…09e600 3b 0a 20 20 20 20 20 2a 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 20 64 6f 6e 27 74 20 72 65 73 74 ┆; * some systems don't rest┆ 0x04f200…09e600 6f 72 65 20 72 65 67 69 73 74 65 72 20 76 61 72 69 61 62 6c 65 73 20 70 72 6f 70 65 72 6c 79 20 ┆ore register variables properly ┆ 0x04f200…09e600 6f 6e 20 6c 6f 6e 67 6a 6d 70 28 29 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 09 63 63 6f ┆on longjmp() */ int cco┆ 0x04f200…09e600 75 6e 74 2c 20 69 63 6f 75 6e 74 3b 0a 20 20 20 20 63 61 74 63 68 5f 74 20 28 2a 6f 69 6e 74 72 ┆unt, icount; catch_t (*ointr┆ 0x04f200…09e600 29 28 29 3b 0a 23 69 66 64 65 66 09 53 49 47 43 4f 4e 54 0a 20 20 20 20 63 61 74 63 68 5f 74 20 ┆)(); #ifdef SIGCONT catch_t ┆ 0x04f200…09e600 28 2a 6f 63 6f 6e 74 29 28 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 66 6f 72 20 28 3b 3b 29 ┆(*ocont)(); #endif for (;;)┆ 0x04f200…09e600 0a 20 20 20 20 7b 0a 09 28 76 6f 69 64 29 20 73 65 74 6a 6d 70 28 73 69 67 6a 6d 70 62 75 66 29 ┆ { (void) setjmp(sigjmpbuf)┆ 0x04f200…09e600 3b 0a 0a 09 72 65 73 74 61 72 74 20 3d 20 54 52 55 45 3b 0a 09 76 73 69 67 63 61 75 67 68 74 20 ┆; restart = TRUE; vsigcaught ┆ 0x04f200…09e600 3d 20 30 3b 0a 0a 09 69 66 20 28 70 72 6f 6d 70 74 29 0a 09 20 20 20 20 28 76 6f 69 64 29 20 66 ┆= 0; if (prompt) (void) f┆ 0x04f200…09e600 70 75 74 73 28 70 72 6f 6d 70 74 2c 20 73 74 64 6f 75 74 29 3b 0a 09 28 76 6f 69 64 29 20 66 66 ┆puts(prompt, stdout); (void) ff┆ 0x04f200…09e600 6c 75 73 68 28 73 74 64 6f 75 74 29 3b 0a 0a 09 2f 2a 0a 09 20 2a 20 6e 6f 77 20 67 72 61 62 20 ┆lush(stdout); /* * now grab ┆ 0x04f200…09e600 74 68 65 20 61 63 74 75 61 6c 20 63 6f 6d 6d 61 6e 64 3b 20 77 65 20 70 6c 61 79 20 73 6f 6d 65 ┆the actual command; we play some┆ 0x04f200…09e600 20 67 61 6d 65 73 20 74 6f 20 73 65 74 20 75 70 20 61 0a 09 20 2a 20 74 65 6d 70 6f 72 61 72 79 ┆ games to set up a * temporary┆ 0x04f200…09e600 20 69 6e 74 65 72 72 75 70 74 20 63 61 74 63 68 65 72 20 64 75 72 69 6e 67 20 74 68 65 20 67 65 ┆ interrupt catcher during the ge┆ 0x04f200…09e600 74 0a 09 20 2a 2f 0a 09 6f 69 6e 74 72 20 3d 20 73 69 67 6e 61 6c 28 53 49 47 49 4e 54 2c 20 53 ┆t */ ointr = signal(SIGINT, S┆ 0x04f200…09e600 49 47 43 41 53 54 28 63 61 74 63 68 73 69 67 29 29 3b 0a 23 69 66 64 65 66 20 53 49 47 43 4f 4e ┆IGCAST(catchsig)); #ifdef SIGCON┆ 0x04f200…09e600 54 0a 09 6f 63 6f 6e 74 20 3d 20 73 69 67 6e 61 6c 28 53 49 47 43 4f 4e 54 2c 20 53 49 47 43 41 ┆T ocont = signal(SIGCONT, SIGCA┆ 0x04f200…09e600 53 54 28 63 61 74 63 68 73 69 67 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 ┆ST(catchsig)); #endif #if define┆ 0x04f200…09e600 64 28 55 53 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 46 49 4f 4e 52 45 41 44 29 20 7c 7c 20 64 ┆d(USG) || defined(FIONREAD) || d┆ 0x04f200…09e600 65 66 69 6e 65 64 28 46 49 4f 52 44 43 48 4b 29 0a 09 2f 2a 0a 09 20 2a 20 55 53 47 20 6f 72 20 ┆efined(FIORDCHK) /* * USG or ┆ 0x04f200…09e600 42 65 72 6b 65 6c 65 79 20 73 79 73 74 65 6d 20 2d 2d 20 72 65 70 65 61 74 65 64 6c 79 20 70 6f ┆Berkeley system -- repeatedly po┆ 0x04f200…09e600 6c 6c 20 74 68 65 20 74 74 79 2c 20 65 78 65 63 75 74 69 6e 67 20 74 68 65 0a 09 20 2a 20 69 64 ┆ll the tty, executing the * id┆ 0x04f200…09e600 6c 65 72 20 66 75 6e 63 74 69 6f 6e 20 62 65 74 77 65 65 6e 20 74 72 69 65 73 2e 0a 09 20 2a 2f ┆ler function between tries. */┆ 0x04f200…09e600 0a 09 66 6f 72 20 28 69 63 6f 75 6e 74 20 3d 20 30 3b 3b 29 0a 09 7b 0a 23 69 66 64 65 66 20 46 ┆ for (icount = 0;;) { #ifdef F┆ 0x04f200…09e600 49 4f 4e 52 45 41 44 0a 09 20 20 20 20 69 6e 74 20 63 6f 75 6e 74 20 3d 20 30 3b 09 09 09 2f 2a ┆IONREAD int count = 0; /*┆ 0x04f200…09e600 20 69 6e 20 63 61 73 65 20 46 49 4f 4e 52 45 41 44 20 66 61 69 6c 73 20 2a 2f 0a 0a 09 20 20 20 ┆ in case FIONREAD fails */ ┆ 0x04f200…09e600 20 28 76 6f 69 64 29 20 69 6f 63 74 6c 28 30 2c 20 28 69 6e 74 29 46 49 4f 4e 52 45 41 44 2c 20 ┆ (void) ioctl(0, (int)FIONREAD, ┆ 0x04f200…09e600 28 63 68 61 72 20 2a 29 26 63 6f 75 6e 74 29 3b 0a 09 20 20 20 20 69 66 20 28 63 6f 75 6e 74 29 ┆(char *)&count); if (count)┆ 0x04f200…09e600 0a 23 65 6e 64 69 66 20 2f 2a 20 46 49 4f 4e 52 45 41 44 20 2a 2f 0a 23 69 66 64 65 66 20 46 49 ┆ #endif /* FIONREAD */ #ifdef FI┆ 0x04f200…09e600 4f 52 44 43 48 4b 0a 09 20 20 20 20 69 66 20 28 69 6f 63 74 6c 28 30 2c 20 28 69 6e 74 29 46 49 ┆ORDCHK if (ioctl(0, (int)FI┆ 0x04f200…09e600 4f 52 44 43 48 4b 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 29 0a 23 65 6e 64 69 66 20 2f 2a ┆ORDCHK, (char *)NULL)) #endif /*┆ 0x04f200…09e600 20 46 49 4f 52 44 43 48 4b 20 2a 2f 0a 09 09 2f 2a 20 6f 6e 20 61 20 55 53 47 20 73 79 73 74 65 ┆ FIORDCHK */ /* on a USG syste┆ 0x04f200…09e600 6d 2c 20 6e 65 78 74 20 63 61 6c 6c 20 77 6f 6e 27 74 20 62 6c 6f 63 6b 20 74 69 6c 20 69 6e 70 ┆m, next call won't block til inp┆ 0x04f200…09e600 75 74 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 55 53 47 29 20 7c 7c 20 ┆ut */ #endif /* defined(USG) || ┆ 0x04f200…09e600 64 65 66 69 6e 65 64 28 46 49 4f 4e 52 45 41 44 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 46 49 4f ┆defined(FIONREAD) || defined(FIO┆ 0x04f200…09e600 52 44 43 48 4b 29 20 2a 2f 0a 09 09 2f 2a 20 62 75 74 20 6f 6e 20 61 20 56 36 20 6f 72 20 56 37 ┆RDCHK) */ /* but on a V6 or V7┆ 0x04f200…09e600 20 73 79 73 74 65 6d 2c 20 69 74 20 77 69 6c 6c 20 2a 2f 0a 09 09 69 66 20 28 28 63 63 6f 75 6e ┆ system, it will */ if ((ccoun┆ 0x04f200…09e600 74 20 3d 20 72 65 61 64 28 30 2c 20 76 63 6d 64 62 75 66 2c 20 28 69 6f 6c 65 6e 5f 74 29 56 42 ┆t = read(0, vcmdbuf, (iolen_t)VB┆ 0x04f200…09e600 55 46 4c 45 4e 29 29 20 3e 20 30 29 0a 09 09 20 20 20 20 62 72 65 61 6b 3b 0a 23 69 66 20 64 65 ┆UFLEN)) > 0) break; #if de┆ 0x04f200…09e600 66 69 6e 65 64 28 55 53 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 46 49 4f 4e 52 45 41 44 29 20 ┆fined(USG) || defined(FIONREAD) ┆ 0x04f200…09e600 7c 7c 20 64 65 66 69 6e 65 64 28 46 49 4f 52 44 43 48 4b 29 0a 09 20 20 20 20 69 66 20 28 69 64 ┆|| defined(FIORDCHK) if (id┆ 0x04f200…09e600 6c 65 72 20 21 3d 20 4e 4f 5f 49 44 4c 45 52 29 0a 09 09 28 2a 69 64 6c 65 72 29 28 2b 2b 69 63 ┆ler != NO_IDLER) (*idler)(++ic┆ 0x04f200…09e600 6f 75 6e 74 29 3b 09 2f 2a 20 65 78 65 63 75 74 65 20 74 68 65 20 69 64 6c 65 72 20 6f 6e 63 65 ┆ount); /* execute the idler once┆ 0x04f200…09e600 20 2a 2f 0a 09 20 20 20 20 28 76 6f 69 64 29 20 73 6c 65 65 70 28 30 29 3b 09 2f 2a 20 63 68 65 ┆ */ (void) sleep(0); /* che┆ 0x04f200…09e600 61 70 20 77 61 79 20 6f 66 20 67 69 76 69 6e 67 20 75 70 20 6f 75 72 20 70 72 6f 63 65 73 73 20 ┆ap way of giving up our process ┆ 0x04f200…09e600 73 6c 6f 74 20 2a 2f 0a 09 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 55 53 47 ┆slot */ } #endif /* defined(USG┆ 0x04f200…09e600 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 46 49 4f 4e 52 45 41 44 29 20 7c 7c 20 64 65 66 69 6e 65 ┆) || defined(FIONREAD) || define┆ 0x04f200…09e600 64 28 46 49 4f 52 44 43 48 4b 29 20 2a 2f 0a 09 69 66 20 28 76 73 69 67 63 61 75 67 68 74 20 3d ┆d(FIORDCHK) */ if (vsigcaught =┆ 0x04f200…09e600 3d 20 53 49 47 49 4e 54 29 0a 09 20 20 20 20 72 65 74 75 72 6e 28 28 63 68 61 72 20 2a 29 4e 55 ┆= SIGINT) return((char *)NU┆ 0x04f200…09e600 4c 4c 29 3b 0a 09 72 65 73 74 61 72 74 20 3d 20 46 41 4c 53 45 3b 0a 09 28 76 6f 69 64 29 20 73 ┆LL); restart = FALSE; (void) s┆ 0x04f200…09e600 69 67 6e 61 6c 28 53 49 47 49 4e 54 2c 20 53 49 47 43 41 53 54 28 6f 69 6e 74 72 29 29 3b 0a 23 ┆ignal(SIGINT, SIGCAST(ointr)); #┆ 0x04f200…09e600 69 66 64 65 66 20 53 49 47 43 4f 4e 54 0a 09 28 76 6f 69 64 29 20 73 69 67 6e 61 6c 28 53 49 47 ┆ifdef SIGCONT (void) signal(SIG┆ 0x04f200…09e600 43 4f 4e 54 2c 20 53 49 47 43 41 53 54 28 6f 63 6f 6e 74 29 29 3b 0a 23 65 6e 64 69 66 0a 09 69 ┆CONT, SIGCAST(ocont)); #endif i┆ 0x04f200…09e600 66 20 28 63 63 6f 75 6e 74 20 21 3d 20 46 41 49 4c 29 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 ┆f (ccount != FAIL) break; ┆ 0x04f200…09e600 69 66 20 28 21 76 73 69 67 63 61 75 67 68 74 29 0a 09 20 20 20 20 72 65 74 75 72 6e 28 76 63 6d ┆if (!vsigcaught) return(vcm┆ 0x04f200…09e600 64 62 75 66 29 3b 0a 23 69 66 64 65 66 20 53 49 47 43 4f 4e 54 0a 09 65 6c 73 65 20 69 66 20 28 ┆dbuf); #ifdef SIGCONT else if (┆ 0x04f200…09e600 76 73 69 67 63 61 75 67 68 74 20 21 3d 20 53 49 47 43 4f 4e 54 29 0a 23 65 6e 64 69 66 0a 09 20 ┆vsigcaught != SIGCONT) #endif ┆ 0x04f200…09e600 20 20 20 28 76 6f 69 64 29 20 70 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a 0a 20 ┆ (void) printf("\n"); } ┆ 0x04f200…09e600 20 20 20 76 63 6d 64 62 75 66 5b 63 63 6f 75 6e 74 20 2d 20 31 5d 20 3d 20 27 5c 30 27 3b 09 2f ┆ vcmdbuf[ccount - 1] = '\0'; /┆ 0x04f200…09e600 2a 20 73 74 72 69 70 20 74 72 61 69 6c 69 6e 67 20 27 5c 6e 27 20 2a 2f 0a 20 20 20 20 72 65 74 ┆* strip trailing '\n' */ ret┆ 0x04f200…09e600 75 72 6e 28 76 63 6d 64 62 75 66 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 49 47 54 53 54 50 0a ┆urn(vcmdbuf); } #ifdef SIGTSTP ┆ 0x04f200…09e600 69 6e 74 20 6f 6e 73 74 6f 70 28 73 69 67 6e 6f 29 0a 2f 2a 20 68 61 6e 64 6c 65 20 69 6e 63 6f ┆int onstop(signo) /* handle inco┆ 0x04f200…09e600 6d 69 6e 67 20 73 74 6f 70 20 73 69 67 6e 61 6c 20 64 75 72 69 6e 67 20 73 75 62 2d 73 68 65 6c ┆ming stop signal during sub-shel┆ 0x04f200…09e600 6c 20 65 78 65 63 75 74 69 6f 6e 20 2a 2f 0a 69 6e 74 20 73 69 67 6e 6f 3b 0a 7b 0a 09 28 76 6f ┆l execution */ int signo; { (vo┆ 0x04f200…09e600 69 64 29 20 73 69 67 6e 61 6c 28 73 69 67 6e 6f 2c 20 53 49 47 43 41 53 54 28 53 49 47 5f 44 46 ┆id) signal(signo, SIGCAST(SIG_DF┆ 0x04f200…09e600 4c 29 29 3b 0a 23 69 66 64 65 66 20 42 53 44 34 5f 32 0a 09 28 76 6f 69 64 29 20 73 69 67 62 6c ┆L)); #ifdef BSD4_2 (void) sigbl┆ 0x04f200…09e600 6f 63 6b 28 73 69 67 6d 61 73 6b 28 53 49 47 41 4c 52 4d 29 7c 73 69 67 6d 61 73 6b 28 53 49 47 ┆ock(sigmask(SIGALRM)|sigmask(SIG┆ 0x04f200…09e600 49 4e 54 29 29 3b 0a 09 28 76 6f 69 64 29 20 73 69 67 73 65 74 6d 61 73 6b 28 73 69 67 62 6c 6f ┆INT)); (void) sigsetmask(sigblo┆ 0x04f200…09e600 63 6b 28 30 29 20 26 20 7e 73 69 67 6d 61 73 6b 28 73 69 67 6e 6f 29 29 3b 0a 23 65 6c 73 65 20 ┆ck(0) & ~sigmask(signo)); #else ┆ 0x04f200…09e600 2f 2a 20 42 53 44 34 5f 31 20 2a 2f 0a 09 28 76 6f 69 64 29 20 61 6c 61 72 6d 28 28 75 6e 73 69 ┆/* BSD4_1 */ (void) alarm((unsi┆ 0x04f200…09e600 67 6e 65 64 29 20 30 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 42 53 44 34 5f 31 20 2a 2f 0a 09 28 ┆gned) 0); #endif /* BSD4_1 */ (┆ 0x04f200…09e600 76 6f 69 64 29 20 6b 69 6c 6c 28 30 2c 20 73 69 67 6e 6f 29 3b 09 2f 2a 20 73 74 6f 70 20 68 65 ┆void) kill(0, signo); /* stop he┆ 0x04f200…09e600 72 65 20 75 6e 74 69 6c 20 63 6f 6e 74 69 6e 75 65 64 20 2a 2f 0a 0a 09 28 76 6f 69 64 29 20 73 ┆re until continued */ (void) s┆ 0x04f200…09e600 69 67 6e 61 6c 28 73 69 67 6e 6f 2c 20 53 49 47 43 41 53 54 28 6f 6e 73 74 6f 70 29 29 3b 0a 23 ┆ignal(signo, SIGCAST(onstop)); #┆ 0x04f200…09e600 69 66 64 65 66 20 42 53 44 34 5f 32 0a 09 28 76 6f 69 64 29 20 73 69 67 73 65 74 6d 61 73 6b 28 ┆ifdef BSD4_2 (void) sigsetmask(┆ 0x04f200…09e600 73 69 67 62 6c 6f 63 6b 28 30 29 20 26 20 7e 28 73 69 67 6d 61 73 6b 28 53 49 47 41 4c 52 4d 29 ┆sigblock(0) & ~(sigmask(SIGALRM)┆ 0x04f200…09e600 7c 73 69 67 6d 61 73 6b 28 53 49 47 49 4e 54 29 29 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 42 53 ┆|sigmask(SIGINT))); #endif /* BS┆ 0x04f200…09e600 44 34 5f 32 20 2a 2f 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 49 47 53 54 50 20 2a 2f 0a 0a 2f ┆D4_2 */ } #endif /* SIGSTP */ /┆ 0x04f200…09e600 2a 20 74 74 79 69 6e 2e 63 20 65 6e 64 73 20 68 65 72 65 20 2a 2f 0a 20 73 75 62 2d 73 68 65 6c ┆* ttyin.c ends here */ sub-shel┆ 0x04f200…09e600 6c 20 65 78 65 63 75 74 69 6f 6e 20 2a 2f 0a 69 6e 74 20 73 69 67 6e 6f 3b 0a 7b 0a 09 28 76 6f ┆l execution */ int signo; { (vo┆ 0x04f200…09e600 69 64 29 20 73 69 67 6e 61 6c 28 73 69 67 6e 6f 2c 20 53 49 47 43 41 53 54 28 53 49 47 5f 44 46 ┆id) signal(signo, SIGCAST(SIG_DF┆ 0x04f200…09e600 4c 29 29 3b 0a 23 69 66 64 65 66 20 42 53 44 34 5f 32 0a 09 28 76 6f 69 64 29 20 73 69 67 62 6c ┆L)); #ifdef BSD4_2 (void) sigbl┆ 0x04f200…09e600 6f 63 6b 28 73 69 67 6d 61 73 6b 28 53 49 47 41 4c 52 4d 29 7c 73 69 67 6d 61 73 6b 28 53 49 47 ┆ock(sigmask(SIGALRM)|sigmask(SIG┆ 0x04f200…09e600 49 4e 54 29 29 3b 0a 09 28 76 6f 69 64 29 20 73 69 73 72 63 2f 44 2e 6e 65 77 73 2f 74 74 79 6f ┆INT)); (void) sisrc/D.news/ttyo┆ 0x04f200…09e600 75 74 2e 63 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆ut.c ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆ ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 20 20 20 34 34 34 20 00 20 20 20 ┆ 444 ┆ 0x04f200…09e600 31 34 35 20 00 20 20 20 20 20 31 20 00 20 20 20 20 20 20 20 32 31 33 37 20 20 34 34 35 36 31 35 ┆145 1 2137 445615┆ 0x04f200…09e600 34 30 34 32 20 20 20 37 35 32 36 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆4042 7526 ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆ ┆ […0x9…] 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆ /**************┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆********************************┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a ┆******************************* ┆ 0x04f200…09e600 0a 4e 41 4d 45 0a 20 20 20 74 74 79 6f 75 74 2e 63 20 2d 2d 20 69 6e 74 65 72 66 61 63 65 20 6d ┆ NAME ttyout.c -- interface m┆ 0x04f200…09e600 61 6e 61 67 65 72 20 69 6e 70 75 74 20 66 75 6e 63 74 69 6f 6e 73 20 66 6f 72 20 6c 69 6e 65 2d ┆anager input functions for line-┆ 0x04f200…09e600 6f 72 69 65 6e 74 65 64 20 64 69 73 70 6c 61 79 0a 0a 53 59 4e 4f 50 53 49 53 0a 20 20 20 76 6f ┆oriented display SYNOPSIS vo┆ 0x04f200…09e600 69 64 20 6d 73 67 28 2e 2e 2e 29 20 20 20 20 2d 2d 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 ┆id msg(...) -- equivalent to ┆ 0x04f200…09e600 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 2e 2e 2e 29 20 66 6f 72 20 75 70 20 74 6f 20 34 20 ┆fprintf(stderr,...) for up to 4 ┆ 0x04f200…09e600 61 72 67 73 0a 0a 20 20 20 76 6f 69 64 20 76 70 72 69 6e 74 28 73 29 20 20 20 2d 2d 20 70 72 69 ┆args void vprint(s) -- pri┆ 0x04f200…09e600 6e 74 20 61 20 6c 69 6e 65 0a 20 20 20 63 68 61 72 20 2a 73 3b 0a 0a 20 20 20 76 6f 69 64 20 76 ┆nt a line char *s; void v┆ 0x04f200…09e600 64 65 6c 61 79 28 29 20 20 20 20 2d 2d 20 64 75 6d 6d 79 20 66 75 6e 63 74 69 6f 6e 0a 0a 44 45 ┆delay() -- dummy function DE┆ 0x04f200…09e600 53 43 52 49 50 54 49 4f 4e 0a 20 20 20 54 68 69 73 20 6d 6f 64 75 6c 65 20 70 72 6f 76 69 64 65 ┆SCRIPTION This module provide┆ 0x04f200…09e600 73 20 61 20 63 6f 6d 6d 6f 6e 20 69 6e 74 65 72 66 61 63 65 20 6d 61 6e 61 67 65 72 20 66 6f 72 ┆s a common interface manager for┆ 0x04f200…09e600 20 74 6f 6f 6c 73 20 74 68 61 74 0a 64 6f 20 6c 69 6e 65 2d 6f 72 69 65 6e 74 65 64 20 6f 75 74 ┆ tools that do line-oriented out┆ 0x04f200…09e600 70 75 74 2e 0a 0a 41 55 54 48 4f 52 0a 20 20 20 45 72 69 63 20 53 2e 20 52 61 79 6d 6f 6e 64 0a ┆put. AUTHOR Eric S. Raymond ┆ 0x04f200…09e600 20 20 20 54 68 69 73 20 73 6f 66 74 77 61 72 65 20 69 73 20 43 6f 70 79 72 69 67 68 74 20 28 43 ┆ This software is Copyright (C┆ 0x04f200…09e600 29 20 31 39 38 39 20 62 79 20 45 72 69 63 20 53 2e 20 52 61 79 6d 6f 6e 64 20 66 6f 72 20 74 68 ┆) 1989 by Eric S. Raymond for th┆ 0x04f200…09e600 65 20 73 6f 6c 65 20 70 75 72 70 6f 73 65 0a 6f 66 20 70 72 6f 74 65 63 74 69 6e 67 20 66 72 65 ┆e sole purpose of protecting fre┆ 0x04f200…09e600 65 20 72 65 64 69 73 74 72 69 62 75 74 69 6f 6e 3b 20 73 65 65 20 74 68 65 20 4c 49 43 45 4e 53 ┆e redistribution; see the LICENS┆ 0x04f200…09e600 45 20 66 69 6c 65 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆E file for details. ***********┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆********************************┆ […0x1…] 0x04f200…09e600 2a 2a 2f 0a 2f 2a 4c 49 4e 54 4c 49 42 52 41 52 59 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 6e 65 ┆**/ /*LINTLIBRARY*/ #include "ne┆ 0x04f200…09e600 77 73 2e 68 22 09 09 2f 2a 20 66 6f 72 20 73 74 64 69 6f 2e 68 2c 20 63 74 79 70 65 2e 68 2c 20 ┆ws.h" /* for stdio.h, ctype.h, ┆ 0x04f200…09e600 6e 61 72 74 5f 74 20 61 6e 64 20 74 69 6d 65 5f 74 20 2a 2f 0a 0a 69 6e 74 20 6d 73 67 28 73 29 ┆nart_t and time_t */ int msg(s)┆ 0x04f200…09e600 0a 2f 2a 20 65 6d 69 74 20 61 20 6d 65 73 73 61 67 65 20 74 6f 20 74 68 65 20 75 73 65 72 20 2d ┆ /* emit a message to the user -┆ 0x04f200…09e600 2d 20 61 6c 77 61 79 73 20 63 61 6c 6c 65 64 20 74 68 72 6f 75 67 68 20 6d 61 63 72 6f 73 20 2a ┆- always called through macros *┆ 0x04f200…09e600 2f 0a 63 68 61 72 20 2a 73 3b 0a 7b 0a 20 20 20 20 28 76 6f 69 64 29 20 66 70 75 74 73 28 73 2c ┆/ char *s; { (void) fputs(s,┆ 0x04f200…09e600 20 73 74 64 65 72 72 29 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 66 70 75 74 63 28 27 5c 6e 27 2c ┆ stderr); (void) fputc('\n',┆ 0x04f200…09e600 20 73 74 64 65 72 72 29 3b 0a 7d 0a 0a 69 6e 74 20 76 70 72 69 6e 74 28 6c 69 6e 65 29 0a 2f 2a ┆ stderr); } int vprint(line) /*┆ 0x04f200…09e600 20 77 72 69 74 65 20 61 20 6c 69 6e 65 20 6f 66 20 6f 75 74 70 75 74 20 28 63 61 6c 6c 65 64 20 ┆ write a line of output (called ┆ 0x04f200…09e600 74 68 72 6f 75 67 68 20 76 70 72 69 6e 74 5b 30 31 5d 28 29 20 6d 61 63 72 6f 73 29 2a 2f 0a 63 ┆through vprint[01]() macros)*/ c┆ 0x04f200…09e600 68 61 72 09 2a 6c 69 6e 65 3b 0a 7b 0a 20 20 20 20 28 76 6f 69 64 29 20 70 75 74 73 28 6c 69 6e ┆har *line; { (void) puts(lin┆ 0x04f200…09e600 65 29 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b 0a 20 ┆e); (void) fflush(stdout); ┆ 0x04f200…09e600 20 20 20 72 65 74 75 72 6e 28 53 55 43 43 45 45 44 29 3b 0a 7d 0a 0a 2f 2a 20 74 74 79 6f 75 74 ┆ return(SUCCEED); } /* ttyout┆ 0x04f200…09e600 2e 63 20 65 6e 64 73 20 68 65 72 65 20 2a 2f 0a 6c 73 2e 0a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆.c ends here */ ls. ***********┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆********************************┆ […0x1…] 0x04f200…09e600 2a 2a 2f 0a 2f 2a 4c 49 4e 54 4c 49 42 52 41 52 59 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 6e 65 ┆**/ /*LINTLIBRARY*/ #include "ne┆ 0x04f200…09e600 77 73 2e 68 22 09 09 2f 2a 20 66 6f 72 20 73 74 64 69 6f 2e 68 2c 20 63 74 79 70 65 2e 68 2c 20 ┆ws.h" /* for stdio.h, ctype.h, ┆ 0x04f200…09e600 6e 61 72 74 5f 74 20 61 6e 64 20 74 69 6d 65 5f 74 20 2a 2f 0a 0a 69 6e 74 20 6d 73 67 28 73 29 ┆nart_t and time_t */ int msg(s)┆ 0x04f200…09e600 0a 2f 2a 20 65 6d 69 74 20 61 20 6d 65 73 73 61 67 65 20 74 6f 20 74 68 65 20 75 73 65 72 20 2d ┆ /* emit a message to the user -┆ 0x04f200…09e600 2d 20 61 6c 77 61 79 73 20 63 61 6c 6c 65 64 20 74 68 72 6f 75 67 68 20 6d 61 63 72 6f 73 20 2a ┆- always called through macros *┆ 0x04f200…09e600 2f 0a 63 68 61 72 20 2a 73 3b 0a 7b 0a 20 20 20 20 28 76 6f 69 64 29 20 66 70 75 74 73 28 73 2c ┆/ char *s; { (void) fputs(s,┆ 0x04f200…09e600 20 73 74 64 65 72 72 29 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 66 70 75 74 63 28 27 5c 6e 27 2c ┆ stderr); (void) fputc('\n',┆ 0x04f200…09e600 20 73 74 64 65 72 72 29 3b 0a 7d 0a 0a 69 6e 74 20 76 70 72 69 6e 74 28 6c 69 6e 65 29 0a 2f 2a ┆ stderr); } int vprint(line) /*┆ 0x04f200…09e600 20 77 72 69 74 65 20 61 20 6c 69 6e 65 20 6f 66 20 6f 75 74 70 75 74 20 28 63 61 6c 6c 65 64 20 ┆ write a line of output (called ┆ 0x04f200…09e600 74 68 72 6f 75 67 68 20 76 70 72 69 6e 74 5b 30 31 5d 28 29 20 6d 61 63 72 6f 73 29 2a 2f 0a 63 ┆through vprint[01]() macros)*/ c┆ 0x04f200…09e600 68 61 72 09 2a 6c 69 6e 65 3b 0a 7b 0a 20 20 20 20 73 72 63 2f 44 2e 6e 65 77 73 2f 6e 65 77 73 ┆har *line; { src/D.news/news┆ 0x04f200…09e600 72 63 2e 68 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆rc.h ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆ ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 20 20 20 34 34 34 20 00 20 20 20 ┆ 444 ┆ 0x04f200…09e600 31 34 35 20 00 20 20 20 20 20 31 20 00 20 20 20 20 20 20 20 36 35 31 32 20 20 34 34 36 31 32 33 ┆145 1 6512 446123┆ 0x04f200…09e600 33 31 32 34 20 20 20 37 34 36 30 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆3124 7460 ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆ ┆ […0x9…] 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 2f 2a 20 6e 65 77 73 72 63 2e 68 20 2d 2d 20 ┆ /* newsrc.h -- ┆ 0x04f200…09e600 64 65 66 69 6e 65 73 20 61 6e 64 20 74 79 70 65 73 20 66 6f 72 20 75 73 69 6e 67 20 2e 6e 65 77 ┆defines and types for using .new┆ 0x04f200…09e600 73 72 63 20 66 69 6c 65 73 20 2a 2f 0a 0a 2f 2a 0a 20 2a 20 4e 6f 74 65 3a 20 74 68 69 73 20 68 ┆src files */ /* * Note: this h┆ 0x04f200…09e600 65 61 64 65 72 20 66 69 6c 65 20 64 65 66 69 6e 65 73 20 74 68 65 20 69 6e 74 65 72 66 61 63 65 ┆eader file defines the interface┆ 0x04f200…09e600 20 74 6f 20 2a 74 68 72 65 65 2a 20 6f 62 6a 65 63 74 20 6d 6f 64 75 6c 65 73 20 2d 2d 0a 20 2a ┆ to *three* object modules -- *┆ 0x04f200…09e600 20 20 20 20 72 64 62 69 74 73 2e 6f 20 28 66 6f 72 20 72 65 61 64 69 6e 67 20 2e 6e 65 77 73 72 ┆ rdbits.o (for reading .newsr┆ 0x04f200…09e600 63 2d 73 74 79 6c 65 20 62 69 74 20 76 65 63 74 6f 72 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f ┆c-style bit vector representatio┆ 0x04f200…09e600 6e 73 29 0a 20 2a 20 20 20 20 72 64 6e 65 77 73 72 63 2e 6f 20 28 66 6f 72 20 72 65 61 64 69 6e ┆ns) * rdnewsrc.o (for readin┆ 0x04f200…09e600 67 20 2e 6e 65 77 73 72 63 20 66 69 6c 65 20 61 72 74 69 63 6c 65 73 2d 73 65 65 6e 20 64 61 74 ┆g .newsrc file articles-seen dat┆ 0x04f200…09e600 61 20 6f 6e 6c 79 29 0a 20 2a 20 20 20 20 77 72 6e 65 77 73 72 63 2e 6f 20 28 66 75 6c 6c 20 2e ┆a only) * wrnewsrc.o (full .┆ 0x04f200…09e600 6e 65 77 73 72 63 20 66 6f 72 6d 61 74 20 72 65 61 64 20 26 20 77 72 69 74 65 20 66 61 63 69 6c ┆newsrc format read & write facil┆ 0x04f200…09e600 69 74 69 65 73 20 66 6f 72 20 72 65 61 64 65 72 73 29 0a 20 2a 2f 0a 0a 2f 2a 20 6d 6f 72 65 20 ┆ities for readers) */ /* more ┆ 0x04f200…09e600 6d 61 73 6b 73 20 66 6f 72 20 74 68 65 20 72 63 5f 66 6c 61 67 73 20 66 69 65 6c 64 20 6f 66 20 ┆masks for the rc_flags field of ┆ 0x04f200…09e600 67 72 6f 75 70 5f 74 2c 20 73 65 65 20 61 63 74 69 76 65 2e 68 20 2a 2f 0a 23 64 65 66 69 6e 65 ┆group_t, see active.h */ #define┆ 0x04f200…09e600 20 52 43 5f 4e 4f 54 45 44 09 30 78 30 30 30 31 09 2f 2a 20 67 72 6f 75 70 20 69 73 20 69 6e 20 ┆ RC_NOTED 0x0001 /* group is in ┆ 0x04f200…09e600 75 73 65 72 27 73 20 2e 6e 65 77 73 72 63 20 2a 2f 0a 23 64 65 66 69 6e 65 20 52 43 5f 55 4e 53 ┆user's .newsrc */ #define RC_UNS┆ 0x04f200…09e600 45 4c 09 30 78 30 30 30 32 09 2f 2a 20 69 74 20 77 61 73 20 65 78 63 6c 75 64 65 64 20 62 79 20 ┆EL 0x0002 /* it was excluded by ┆ 0x04f200…09e600 73 75 62 73 63 72 69 70 74 69 6f 6e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 52 43 5f 55 4e 53 55 42 ┆subscription */ #define RC_UNSUB┆ 0x04f200…09e600 09 30 78 30 30 30 34 09 2f 2a 20 69 74 27 73 20 62 65 65 6e 20 65 78 70 6c 69 63 69 74 6c 79 20 ┆ 0x0004 /* it's been explicitly ┆ 0x04f200…09e600 75 6e 73 75 73 63 72 69 62 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 52 43 5f 44 52 4f 50 53 55 ┆unsuscribed */ #define RC_DROPSU┆ 0x04f200…09e600 42 53 43 09 30 78 30 30 30 38 09 2f 2a 20 69 74 20 77 69 6c 6c 20 62 65 20 75 6e 73 75 62 73 63 ┆BSC 0x0008 /* it will be unsubsc┆ 0x04f200…09e600 72 69 62 65 64 20 61 74 20 73 65 73 73 69 6f 6e 20 65 6e 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 ┆ribed at session end */ #define ┆ 0x04f200…09e600 52 43 5f 56 49 53 49 54 45 44 09 30 78 30 30 31 30 09 2f 2a 20 69 74 27 73 20 62 65 65 6e 20 76 ┆RC_VISITED 0x0010 /* it's been v┆ 0x04f200…09e600 69 73 69 74 65 64 20 61 74 20 6c 65 61 73 74 20 6f 6e 63 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 ┆isited at least once */ #define ┆ 0x04f200…09e600 52 43 5f 4d 41 49 4c 42 4f 58 09 30 78 30 30 32 30 09 2f 2a 20 74 68 65 20 67 72 6f 75 70 20 69 ┆RC_MAILBOX 0x0020 /* the group i┆ 0x04f200…09e600 73 20 61 63 74 75 61 6c 6c 79 20 61 20 6d 61 69 6c 62 6f 78 20 2a 2f 0a 23 64 65 66 69 6e 65 20 ┆s actually a mailbox */ #define ┆ 0x04f200…09e600 52 43 5f 48 41 53 53 55 42 53 09 30 78 30 30 34 30 09 2f 2a 20 67 72 6f 75 70 20 68 61 73 20 61 ┆RC_HASSUBS 0x0040 /* group has a┆ 0x04f200…09e600 74 20 6c 65 61 73 74 20 6f 6e 65 20 73 75 62 73 63 72 69 62 65 72 20 2a 2f 0a 0a 23 64 65 66 69 ┆t least one subscriber */ #defi┆ 0x04f200…09e600 6e 65 20 53 55 42 53 43 4d 4b 09 20 20 20 20 27 3a 27 09 09 20 20 20 20 2f 2a 20 61 66 74 65 72 ┆ne SUBSCMK ':' /* after┆ 0x04f200…09e600 20 61 20 67 72 6f 75 70 20 6e 61 6d 65 20 69 6e 20 61 20 2e 6e 65 77 73 72 63 20 2a 2f 0a 23 64 ┆ a group name in a .newsrc */ #d┆ 0x04f200…09e600 65 66 69 6e 65 20 55 4e 53 55 42 53 43 4d 4b 20 20 20 27 21 27 09 09 20 20 20 20 2f 2a 20 74 68 ┆efine UNSUBSCMK '!' /* th┆ 0x04f200…09e600 65 73 65 20 73 61 79 20 77 68 65 74 68 65 72 20 69 74 27 73 20 73 75 62 73 63 72 69 62 65 64 20 ┆ese say whether it's subscribed ┆ 0x04f200…09e600 74 6f 20 2a 2f 0a 0a 23 64 65 66 69 6e 65 20 53 45 54 09 20 20 20 20 30 78 30 31 09 2f 2a 20 74 ┆to */ #define SET 0x01 /* t┆ 0x04f200…09e600 65 6c 6c 20 72 64 62 69 74 73 28 29 20 74 6f 20 64 6f 20 62 69 74 20 73 65 74 73 20 2a 2f 0a 23 ┆ell rdbits() to do bit sets */ #┆ 0x04f200…09e600 64 65 66 69 6e 65 20 43 4c 45 41 52 09 20 20 20 20 30 78 30 32 09 2f 2a 20 74 65 6c 6c 20 72 64 ┆define CLEAR 0x02 /* tell rd┆ 0x04f200…09e600 62 69 74 73 28 29 20 74 6f 20 64 6f 20 62 69 74 20 63 6c 65 61 72 73 20 2a 2f 0a 0a 2f 2a 20 75 ┆bits() to do bit clears */ /* u┆ 0x04f200…09e600 73 65 20 74 68 69 73 20 61 73 20 61 72 67 20 6f 66 20 72 65 61 64 6f 70 74 73 28 29 20 74 6f 20 ┆se this as arg of readopts() to ┆ 0x04f200…09e600 73 75 70 70 72 65 73 73 20 6f 70 74 69 6f 6e 73 20 70 72 6f 63 65 73 73 69 6e 67 20 2a 2f 0a 23 ┆suppress options processing */ #┆ 0x04f200…09e600 64 65 66 69 6e 65 20 4e 4f 4f 50 54 53 09 20 20 20 20 28 69 6e 74 20 28 2a 29 28 29 29 4e 55 4c ┆define NOOPTS (int (*)())NUL┆ 0x04f200…09e600 4c 0a 0a 23 64 65 66 69 6e 65 20 4e 4f 5f 49 4e 44 45 58 09 2d 31 09 2f 2a 20 6f 75 74 2d 6f 66 ┆L #define NO_INDEX -1 /* out-of┆ 0x04f200…09e600 2d 62 61 6e 64 20 66 6f 72 20 73 75 62 6a 65 63 74 20 69 6e 64 65 78 20 6c 69 6e 65 20 23 20 2a ┆-band for subject index line # *┆ 0x04f200…09e600 2f 0a 0a 2f 2a 20 64 69 72 65 63 74 69 76 65 20 74 79 70 65 73 20 2a 2f 0a 23 64 65 66 69 6e 65 ┆/ /* directive types */ #define┆ 0x04f200…09e600 20 4e 5f 4f 50 54 49 4f 4e 53 09 31 09 2f 2a 20 6d 61 72 6b 73 20 61 6e 20 6f 70 74 69 6f 6e 73 ┆ N_OPTIONS 1 /* marks an options┆ 0x04f200…09e600 20 6c 69 6e 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 5f 4d 41 43 52 4f 09 09 32 09 2f 2a 20 6d ┆ line */ #define N_MACRO 2 /* m┆ 0x04f200…09e600 61 72 6b 73 20 61 20 6d 61 63 72 6f 20 64 65 66 69 6e 69 74 69 6f 6e 20 6c 69 6e 65 20 2a 2f 0a ┆arks a macro definition line */ ┆ 0x04f200…09e600 0a 23 69 66 64 65 66 20 4d 55 4c 54 49 53 4f 55 52 43 45 0a 2f 2a 0a 20 2a 20 74 68 69 73 20 73 ┆ #ifdef MULTISOURCE /* * this s┆ 0x04f200…09e600 74 72 75 63 74 75 72 65 20 73 70 65 63 69 66 69 65 73 20 65 76 65 72 79 74 68 69 6e 67 20 77 65 ┆tructure specifies everything we┆ 0x04f200…09e600 20 6e 65 65 64 20 74 6f 20 6b 6e 6f 77 20 61 62 6f 75 74 20 61 20 72 65 61 64 65 72 20 72 65 73 ┆ need to know about a reader res┆ 0x04f200…09e600 6f 75 72 63 65 0a 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 72 64 63 6f 6e 6e 65 ┆ource */ typedef struct rdconne┆ 0x04f200…09e600 63 74 0a 7b 0a 20 20 20 20 63 68 61 72 09 2a 72 5f 6e 61 6d 65 3b 09 2f 2a 20 74 68 65 20 72 65 ┆ct { char *r_name; /* the re┆ 0x04f200…09e600 73 6f 75 72 63 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 76 6f 69 64 09 28 2a 72 5f 6f 70 65 6e ┆source name */ void (*r_open┆ 0x04f200…09e600 29 28 29 3b 09 2f 2a 20 6f 70 65 6e 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 ┆)(); /* open a connection */ ┆ 0x04f200…09e600 20 63 68 61 72 09 28 2a 72 5f 61 63 74 69 76 65 29 28 29 3b 09 2f 2a 20 67 65 74 20 61 6e 20 61 ┆ char (*r_active)(); /* get an a┆ 0x04f200…09e600 63 74 69 76 65 20 66 69 6c 65 20 63 6f 70 79 20 2a 2f 0a 20 20 20 20 69 6e 74 09 09 28 2a 72 5f ┆ctive file copy */ int (*r_┆ 0x04f200…09e600 61 72 74 6e 61 6d 65 29 28 29 3b 09 2f 2a 20 67 65 74 20 61 20 63 6f 70 79 20 6f 66 20 61 20 67 ┆artname)(); /* get a copy of a g┆ 0x04f200…09e600 69 76 65 6e 20 61 72 74 69 63 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74 09 09 28 2a 72 5f 68 73 74 ┆iven article */ int (*r_hst┆ 0x04f200…09e600 73 65 65 6b 29 28 29 3b 09 2f 2a 20 73 65 6c 65 63 74 20 61 6e 20 61 72 74 69 63 6c 65 20 49 44 ┆seek)(); /* select an article ID┆ 0x04f200…09e600 20 66 6f 72 20 70 65 72 75 73 61 6c 20 2a 2f 0a 20 20 20 20 69 6e 74 09 09 28 2a 72 5f 6e 65 78 ┆ for perusal */ int (*r_nex┆ 0x04f200…09e600 74 6c 6f 63 29 28 29 3b 09 2f 2a 20 67 65 74 20 74 68 65 20 6e 65 78 74 20 6c 6f 63 61 74 69 6f ┆tloc)(); /* get the next locatio┆ 0x04f200…09e600 6e 20 6f 66 20 74 68 65 20 61 72 74 69 63 6c 65 20 2a 2f 0a 20 20 20 20 76 6f 69 64 09 28 2a 72 ┆n of the article */ void (*r┆ 0x04f200…09e600 5f 63 6c 6f 73 65 29 28 29 3b 09 2f 2a 20 63 6c 6f 73 65 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 ┆_close)(); /* close the connecti┆ 0x04f200…09e600 6f 6e 20 2a 2f 0a 7d 0a 72 63 6f 6e 6e 5f 74 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 4d 55 4c 54 49 ┆on */ } rconn_t; #endif /* MULTI┆ 0x04f200…09e600 53 4f 55 52 43 45 20 2a 2f 0a 0a 65 78 74 65 72 6e 20 69 6e 74 20 72 64 6e 65 77 73 72 63 28 29 ┆SOURCE */ extern int rdnewsrc()┆ 0x04f200…09e600 3b 09 09 2f 2a 20 72 65 61 64 20 61 20 75 73 65 72 27 73 20 2e 6e 65 77 73 72 63 20 64 61 74 61 ┆; /* read a user's .newsrc data┆ 0x04f200…09e600 20 2a 2f 0a 65 78 74 65 72 6e 20 69 6e 74 20 72 65 61 64 6f 70 74 73 28 29 3b 09 09 2f 2a 20 72 ┆ */ extern int readopts(); /* r┆ 0x04f200…09e600 65 61 64 20 63 75 72 72 65 6e 74 20 75 73 65 72 27 73 20 2e 6e 65 77 73 72 63 20 2b 20 6f 70 74 ┆ead current user's .newsrc + opt┆ 0x04f200…09e600 69 6f 6e 73 20 2a 2f 0a 65 78 74 65 72 6e 20 69 6e 74 20 72 63 75 70 64 61 74 65 28 29 3b 09 09 ┆ions */ extern int rcupdate(); ┆ 0x04f200…09e600 2f 2a 20 63 68 65 63 6b 20 66 6f 72 20 6e 65 77 20 61 72 74 69 63 6c 65 73 20 77 61 69 74 69 6e ┆/* check for new articles waitin┆ 0x04f200…09e600 67 20 2a 2f 0a 65 78 74 65 72 6e 20 6e 61 72 74 5f 74 20 72 63 63 6f 75 6e 74 28 29 3b 09 2f 2a ┆g */ extern nart_t rccount(); /*┆ 0x04f200…09e600 20 63 6f 75 6e 74 20 6e 65 77 20 61 72 74 69 63 6c 65 73 20 77 61 69 74 69 6e 67 20 2a 2f 0a 65 ┆ count new articles waiting */ e┆ 0x04f200…09e600 78 74 65 72 6e 20 76 6f 69 64 20 73 65 74 73 75 62 73 63 28 29 3b 09 09 2f 2a 20 73 65 74 20 61 ┆xtern void setsubsc(); /* set a┆ 0x04f200…09e600 20 73 75 62 73 63 72 69 70 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 65 78 74 65 72 6e 20 76 6f 69 ┆ subscription list */ extern voi┆ 0x04f200…09e600 64 20 77 72 6e 65 77 73 72 63 28 29 3b 09 09 2f 2a 20 77 72 69 74 65 20 61 20 75 73 65 72 27 73 ┆d wrnewsrc(); /* write a user's┆ 0x04f200…09e600 20 2e 6e 65 77 73 72 63 20 64 61 74 61 20 2a 2f 0a 65 78 74 65 72 6e 20 76 6f 69 64 20 74 6f 75 ┆ .newsrc data */ extern void tou┆ 0x04f200…09e600 63 68 72 63 28 29 3b 09 09 2f 2a 20 74 6f 75 63 68 20 74 68 65 20 63 61 6c 6c 65 72 27 73 20 2e ┆chrc(); /* touch the caller's .┆ 0x04f200…09e600 6e 65 77 73 72 63 20 2a 2f 0a 0a 23 64 65 66 69 6e 65 20 72 63 73 75 62 73 63 28 67 70 29 09 28 ┆newsrc */ #define rcsubsc(gp) (┆ 0x04f200…09e600 21 28 28 67 70 29 2d 3e 72 63 5f 66 6c 61 67 73 20 26 20 28 52 43 5f 55 4e 53 55 42 20 7c 20 52 ┆!((gp)->rc_flags & (RC_UNSUB | R┆ 0x04f200…09e600 43 5f 55 4e 53 45 4c 29 29 29 0a 0a 23 64 65 66 69 6e 65 20 72 63 66 6c 61 67 28 6e 29 09 28 61 ┆C_UNSEL))) #define rcflag(n) (a┆ 0x04f200…09e600 63 74 69 76 65 2e 61 72 74 69 63 6c 65 2e 6d 5f 67 72 6f 75 70 2d 3e 72 63 5f 66 6c 61 67 73 20 ┆ctive.article.m_group->rc_flags ┆ 0x04f200…09e600 26 20 28 6e 29 29 0a 23 64 65 66 69 6e 65 20 72 63 66 73 65 74 28 6e 29 09 28 61 63 74 69 76 65 ┆& (n)) #define rcfset(n) (active┆ 0x04f200…09e600 2e 61 72 74 69 63 6c 65 2e 6d 5f 67 72 6f 75 70 2d 3e 72 63 5f 66 6c 61 67 73 20 7c 3d 20 28 6e ┆.article.m_group->rc_flags |= (n┆ 0x04f200…09e600 29 29 0a 23 64 65 66 69 6e 65 20 72 63 66 63 6c 65 61 72 28 6e 29 09 28 61 63 74 69 76 65 2e 61 ┆)) #define rcfclear(n) (active.a┆ 0x04f200…09e600 72 74 69 63 6c 65 2e 6d 5f 67 72 6f 75 70 2d 3e 72 63 5f 66 6c 61 67 73 20 26 3d 20 7e 28 6e 29 ┆rticle.m_group->rc_flags &= ~(n)┆ 0x04f200…09e600 29 0a 0a 23 64 65 66 69 6e 65 20 72 63 69 6e 64 65 78 28 29 09 61 63 74 69 76 65 2e 61 72 74 69 ┆) #define rcindex() active.arti┆ 0x04f200…09e600 63 6c 65 2e 6d 5f 67 72 6f 75 70 2d 3e 72 63 5f 6c 69 6e 64 65 78 0a 0a 2f 2a 20 68 61 6e 64 6c ┆cle.m_group->rc_lindex /* handl┆ 0x04f200…09e600 69 6e 67 20 6f 66 20 73 75 62 73 63 72 69 62 65 73 20 61 6e 64 20 75 6e 73 75 62 73 63 72 69 62 ┆ing of subscribes and unsubscrib┆ 0x04f200…09e600 65 73 20 2a 2f 0a 65 78 74 65 72 6e 20 76 6f 69 64 20 73 75 62 73 63 72 69 62 65 28 29 3b 20 20 ┆es */ extern void subscribe(); ┆ 0x04f200…09e600 20 20 2f 2a 20 73 75 62 73 63 72 69 62 65 20 74 6f 20 61 20 67 72 6f 75 70 20 2a 2f 0a 65 78 74 ┆ /* subscribe to a group */ ext┆ 0x04f200…09e600 65 72 6e 20 62 6f 6f 6c 20 75 6e 73 75 62 73 63 72 69 62 65 28 29 3b 20 20 2f 2a 20 75 6e 73 75 ┆ern bool unsubscribe(); /* unsu┆ 0x04f200…09e600 62 73 63 72 69 62 65 20 66 72 6f 6d 20 61 20 67 72 6f 75 70 20 28 69 66 20 41 44 4d 53 55 42 20 ┆bscribe from a group (if ADMSUB ┆ 0x04f200…09e600 70 65 72 6d 69 74 73 29 20 2a 2f 0a 65 78 74 65 72 6e 20 62 6f 6f 6c 20 63 6b 66 6f 6c 6c 6f 77 ┆permits) */ extern bool ckfollow┆ 0x04f200…09e600 28 29 3b 09 20 20 20 20 2f 2a 20 63 68 65 63 6b 20 69 66 20 61 6e 20 49 44 20 69 73 20 69 6e 20 ┆(); /* check if an ID is in ┆ 0x04f200…09e600 6e 6f 2d 66 6f 6c 6c 6f 77 75 70 73 20 6c 69 73 74 20 2a 2f 0a 65 78 74 65 72 6e 20 76 6f 69 64 ┆no-followups list */ extern void┆ 0x04f200…09e600 20 64 6f 6e 74 66 6f 6c 6c 6f 77 28 29 3b 20 20 20 2f 2a 20 61 64 64 20 61 6e 20 49 44 20 74 6f ┆ dontfollow(); /* add an ID to┆ 0x04f200…09e600 20 74 68 65 20 6e 6f 2d 66 6f 6c 6c 6f 77 75 70 73 20 6c 69 73 74 20 2a 2f 0a 0a 23 75 6e 64 65 ┆ the no-followups list */ #unde┆ 0x04f200…09e600 66 20 73 65 74 62 69 74 09 09 2f 2a 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 61 76 6f 69 64 20 ┆f setbit /* necessary to avoid ┆ 0x04f200…09e600 66 6f 6f 75 70 20 6f 6e 20 34 2e 33 42 53 44 20 2a 2f 0a 0a 65 78 74 65 72 6e 20 69 6e 74 20 67 ┆fooup on 4.3BSD */ extern int g┆ 0x04f200…09e600 65 74 62 69 74 28 29 3b 09 2f 2a 20 67 65 74 20 74 68 65 20 27 73 65 65 6e 27 20 62 69 74 20 66 ┆etbit(); /* get the 'seen' bit f┆ 0x04f200…09e600 6f 72 20 61 6e 20 61 72 74 69 63 6c 65 20 2a 2f 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 65 74 62 ┆or an article */ extern int setb┆ 0x04f200…09e600 69 74 28 29 3b 09 2f 2a 20 73 65 74 20 61 6e 20 61 72 74 69 63 6c 65 20 27 73 65 65 6e 27 20 2a ┆it(); /* set an article 'seen' *┆ 0x04f200…09e600 2f 0a 65 78 74 65 72 6e 20 69 6e 74 20 63 6c 65 61 72 62 69 74 28 29 3b 09 2f 2a 20 63 6c 65 61 ┆/ extern int clearbit(); /* clea┆ 0x04f200…09e600 72 20 61 6e 20 61 72 74 69 63 6c 65 27 73 20 27 73 65 65 6e 27 20 62 69 74 20 2a 2f 0a 65 78 74 ┆r an article's 'seen' bit */ ext┆ 0x04f200…09e600 65 72 6e 20 69 6e 74 20 72 64 62 69 74 73 28 29 3b 09 2f 2a 20 72 65 61 64 20 62 75 66 66 65 72 ┆ern int rdbits(); /* read buffer┆ 0x04f200…09e600 20 69 6e 20 2e 6e 65 77 73 72 63 20 66 6f 72 6d 20 74 6f 20 62 69 74 6d 61 70 20 2a 2f 0a 65 78 ┆ in .newsrc form to bitmap */ ex┆ 0x04f200…09e600 74 65 72 6e 20 76 6f 69 64 20 77 72 62 69 74 73 28 29 3b 09 2f 2a 20 77 72 69 74 65 20 62 69 74 ┆tern void wrbits(); /* write bit┆ 0x04f200…09e600 6d 61 70 20 74 6f 20 62 75 66 66 65 72 20 69 6e 20 2e 6e 65 77 73 72 63 20 66 6f 72 6d 20 2a 2f ┆map to buffer in .newsrc form */┆ 0x04f200…09e600 0a 0a 2f 2a 20 6e 65 77 73 72 63 2e 68 20 65 6e 64 73 20 68 65 72 65 20 2a 2f 0a 6f 6c 6c 6f 77 ┆ /* newsrc.h ends here */ ollow┆ 0x04f200…09e600 28 29 3b 09 20 20 20 20 2f 2a 20 63 68 65 63 6b 20 69 66 20 61 6e 20 49 44 20 69 73 20 69 6e 20 ┆(); /* check if an ID is in ┆ 0x04f200…09e600 6e 6f 2d 66 6f 6c 6c 6f 77 75 70 73 20 6c 69 73 74 20 2a 2f 0a 65 78 74 65 72 6e 20 76 6f 69 64 ┆no-followups list */ extern void┆ 0x04f200…09e600 20 64 6f 6e 74 66 6f 6c 6c 6f 77 28 29 3b 20 20 20 2f 2a 20 61 64 64 20 61 6e 20 49 44 20 74 6f ┆ dontfollow(); /* add an ID to┆ 0x04f200…09e600 20 74 68 65 20 6e 6f 2d 66 6f 6c 6c 6f 77 75 70 73 20 6c 69 73 74 20 2a 2f 0a 0a 23 75 6e 64 65 ┆ the no-followups list */ #unde┆ 0x04f200…09e600 66 20 73 65 74 62 69 74 09 09 2f 2a 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 61 76 6f 69 64 20 ┆f setbit /* necessary to avoid ┆ 0x04f200…09e600 66 6f 6f 75 70 20 6f 6e 20 34 2e 33 42 53 44 20 2a 73 72 63 2f 44 2e 6e 65 77 73 2f 67 65 74 61 ┆fooup on 4.3BSD *src/D.news/geta┆ 0x04f200…09e600 72 74 2e 63 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆rt.c ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆ ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 20 20 20 34 34 34 20 00 20 20 20 ┆ 444 ┆ 0x04f200…09e600 31 34 35 20 00 20 20 20 20 20 31 20 00 20 20 20 20 20 20 31 35 34 32 32 20 20 34 34 36 31 33 30 ┆145 1 15422 446130┆ 0x04f200…09e600 31 33 36 37 20 20 20 37 34 36 35 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆1367 7465 ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆ ┆ […0x9…] 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆ /**************┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆********************************┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 0a 4e 41 ┆**************************** NA┆ 0x04f200…09e600 4d 45 0a 20 20 20 67 65 74 61 72 74 2e 63 20 2d 2d 20 63 6f 64 65 20 74 6f 20 61 63 63 65 73 73 ┆ME getart.c -- code to access┆ 0x04f200…09e600 20 61 72 74 69 63 6c 65 20 74 65 78 74 2e 0a 0a 53 59 4e 4f 50 53 49 53 0a 20 20 20 69 6e 74 20 ┆ article text. SYNOPSIS int ┆ 0x04f200…09e600 67 65 74 61 72 74 28 70 6c 2c 20 68 64 2c 20 66 6e 29 09 20 20 20 20 09 2d 2d 20 67 65 74 20 61 ┆getart(pl, hd, fn) -- get a┆ 0x04f200…09e600 72 74 69 63 6c 65 20 74 65 78 74 0a 20 20 20 70 6c 61 63 65 5f 74 20 2a 70 6c 3b 20 68 64 72 5f ┆rticle text place_t *pl; hdr_┆ 0x04f200…09e600 74 20 2a 68 64 3b 20 63 68 61 72 20 2a 66 6e 3b 0a 0a 20 20 20 69 6e 74 20 61 72 74 65 72 72 28 ┆t *hd; char *fn; int arterr(┆ 0x04f200…09e600 73 74 2c 20 70 6c 2c 20 68 64 2c 20 62 75 66 29 09 20 20 20 20 09 2d 2d 20 67 65 6e 65 72 61 74 ┆st, pl, hd, buf) -- generat┆ 0x04f200…09e600 65 20 66 65 74 63 68 20 73 74 61 74 75 73 20 6d 65 73 73 61 67 65 0a 20 20 20 69 6e 74 20 73 74 ┆e fetch status message int st┆ 0x04f200…09e600 3b 20 70 6c 61 63 65 5f 74 20 2a 70 6c 3b 20 68 64 72 5f 74 20 2a 68 64 3b 20 63 68 61 72 20 2a ┆; place_t *pl; hdr_t *hd; char *┆ 0x04f200…09e600 62 75 66 3b 0a 0a 20 20 20 69 6e 74 20 69 6e 64 65 78 6c 69 6e 65 28 6e 67 70 2c 20 6d 73 67 2c ┆buf; int indexline(ngp, msg,┆ 0x04f200…09e600 20 62 75 66 29 09 09 2d 2d 20 67 65 74 20 61 72 74 69 63 6c 65 20 69 6e 64 65 78 20 6c 69 6e 65 ┆ buf) -- get article index line┆ 0x04f200…09e600 0a 20 20 20 67 72 6f 75 70 5f 74 20 2a 6e 67 70 3b 20 6e 61 72 74 5f 74 20 6d 73 67 3b 20 63 68 ┆ group_t *ngp; nart_t msg; ch┆ 0x04f200…09e600 61 72 20 2a 62 75 66 3b 0a 0a 20 20 20 76 6f 69 64 20 61 75 74 68 6f 72 28 68 70 2c 20 62 75 66 ┆ar *buf; void author(hp, buf┆ 0x04f200…09e600 29 09 09 09 2d 2d 20 74 68 65 20 61 72 74 69 63 6c 65 20 73 65 6e 64 65 72 27 73 20 6e 61 6d 65 ┆) -- the article sender's name┆ 0x04f200…09e600 0a 20 20 20 68 64 72 5f 74 20 2a 68 70 3b 20 63 68 61 72 20 2a 62 75 66 3b 0a 0a 44 45 53 43 52 ┆ hdr_t *hp; char *buf; DESCR┆ 0x04f200…09e600 49 50 54 49 4f 4e 0a 20 20 20 41 6c 6c 20 66 65 74 63 68 69 6e 67 20 6f 66 20 61 72 74 69 63 6c ┆IPTION All fetching of articl┆ 0x04f200…09e600 65 20 74 65 78 74 20 69 73 20 64 6f 6e 65 20 74 68 72 6f 75 67 68 20 74 68 65 20 66 75 6e 63 74 ┆e text is done through the funct┆ 0x04f200…09e600 69 6f 6e 20 67 65 74 61 72 74 2e 63 2c 20 77 68 69 63 68 0a 69 73 20 65 78 70 65 63 74 65 64 20 ┆ion getart.c, which is expected ┆ 0x04f200…09e600 74 6f 20 74 61 6b 65 20 74 68 72 65 65 20 61 72 67 75 6d 65 6e 74 73 3b 20 74 68 65 20 61 64 64 ┆to take three arguments; the add┆ 0x04f200…09e600 72 65 73 73 20 6f 66 20 61 20 70 6c 61 63 65 2c 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 0a ┆ress of a place, the address of ┆ 0x04f200…09e600 61 20 68 65 61 64 65 72 20 62 6c 6f 63 6b 2c 20 61 6e 64 20 74 68 65 20 61 64 64 72 65 73 73 20 ┆a header block, and the address ┆ 0x04f200…09e600 6f 66 20 61 20 66 69 6c 65 6e 61 6d 65 20 62 75 66 66 65 72 2e 20 54 68 65 20 66 75 6e 63 74 69 ┆of a filename buffer. The functi┆ 0x04f200…09e600 6f 6e 20 69 73 20 65 78 70 65 63 74 65 64 0a 74 6f 20 6c 6f 61 64 20 74 68 65 20 68 65 61 64 65 ┆on is expected to load the heade┆ 0x04f200…09e600 72 20 62 6c 6f 63 6b 20 77 69 74 68 20 68 65 61 64 65 72 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 ┆r block with header information ┆ 0x04f200…09e600 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 61 72 74 69 63 6c 65 2c 0a 69 6e 63 6c 75 64 69 6e 67 ┆for the given article, including┆ 0x04f200…09e600 20 74 68 65 20 68 5f 66 70 2c 20 68 5f 73 74 61 72 74 6f 66 66 2c 20 68 5f 74 65 78 74 6f 66 66 ┆ the h_fp, h_startoff, h_textoff┆ 0x04f200…09e600 20 61 6e 64 20 68 5f 65 6e 64 6f 66 66 20 66 69 65 6c 64 73 20 74 68 61 74 20 67 69 76 65 20 74 ┆ and h_endoff fields that give t┆ 0x04f200…09e600 68 65 0a 72 65 61 64 65 72 20 61 20 72 65 61 6c 20 68 61 6e 64 6c 65 20 6f 6e 20 74 68 65 20 61 ┆he reader a real handle on the a┆ 0x04f200…09e600 72 74 69 63 6c 65 20 74 65 78 74 2e 0a 0a 20 20 20 54 68 65 20 61 72 74 65 72 72 28 29 20 66 75 ┆rticle text. The arterr() fu┆ 0x04f200…09e600 6e 63 74 69 6f 6e 20 66 6f 72 6d 61 74 73 20 61 20 73 74 61 74 75 73 20 6d 65 73 73 61 67 65 20 ┆nction formats a status message ┆ 0x04f200…09e600 66 6f 72 20 61 20 67 69 76 65 6e 20 73 74 61 74 75 73 2c 20 68 65 61 64 65 72 0a 61 6e 64 20 61 ┆for a given status, header and a┆ 0x04f200…09e600 72 74 69 63 6c 65 20 6c 6f 63 61 74 69 6f 6e 2e 20 49 74 20 69 73 20 70 72 6f 76 69 64 65 64 20 ┆rticle location. It is provided ┆ 0x04f200…09e600 69 6e 20 74 68 69 73 20 66 6f 72 6d 20 73 6f 20 74 68 61 74 20 49 2f 4f 20 6d 61 6e 61 67 65 72 ┆in this form so that I/O manager┆ 0x04f200…09e600 73 20 6d 61 79 20 64 6f 0a 77 68 61 74 20 74 68 65 79 20 77 69 6c 6c 20 77 69 74 68 20 74 68 65 ┆s may do what they will with the┆ 0x04f200…09e600 20 67 65 6e 65 72 61 74 65 64 20 6d 65 73 73 61 67 65 2e 0a 0a 20 20 20 54 68 65 20 69 6e 64 65 ┆ generated message. The inde┆ 0x04f200…09e600 78 6c 69 6e 65 28 29 20 65 6e 74 72 79 20 70 6f 69 6e 74 20 72 65 74 75 72 6e 73 20 61 20 73 75 ┆xline() entry point returns a su┆ 0x04f200…09e600 62 6a 65 63 74 20 61 62 73 74 72 61 63 74 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 0a 61 72 ┆bject abstract of the current ar┆ 0x04f200…09e600 74 69 63 6c 65 2c 20 70 72 65 66 69 78 65 64 20 62 79 20 61 20 63 68 61 72 61 63 74 65 72 20 6f ┆ticle, prefixed by a character o┆ 0x04f200…09e600 66 20 73 74 61 74 75 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 49 66 20 52 4e 45 53 43 41 50 ┆f status information. If RNESCAP┆ 0x04f200…09e600 45 53 20 69 73 20 65 6e 61 62 6c 65 64 0a 74 68 65 20 66 6f 72 6d 61 74 20 6f 66 20 74 68 65 20 ┆ES is enabled the format of the ┆ 0x04f200…09e600 73 75 62 6a 65 63 74 20 61 62 73 74 72 61 63 74 20 70 61 72 74 20 69 73 20 6d 61 63 72 6f 65 78 ┆subject abstract part is macroex┆ 0x04f200…09e600 70 61 6e 64 65 64 20 66 72 6f 6d 20 74 68 65 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 0a 76 61 72 69 ┆panded from the environment vari┆ 0x04f200…09e600 61 62 6c 65 20 53 55 42 4a 4c 49 4e 45 2e 20 43 75 72 72 65 6e 74 6c 79 20 74 68 65 20 6f 6e 6c ┆able SUBJLINE. Currently the onl┆ 0x04f200…09e600 79 20 66 6c 61 67 20 70 72 65 66 69 78 20 63 68 61 72 61 63 74 65 72 20 73 75 70 70 6f 72 74 65 ┆y flag prefix character supporte┆ 0x04f200…09e600 64 20 69 73 20 27 21 27 0a 69 6e 64 69 63 61 74 69 6e 67 20 61 6e 20 61 72 74 69 63 6c 65 20 74 ┆d is '!' indicating an article t┆ 0x04f200…09e600 68 61 74 20 72 65 66 65 72 65 6e 63 65 73 20 73 6f 6d 65 20 70 6f 73 74 69 6e 67 20 62 79 20 74 ┆hat references some posting by t┆ 0x04f200…09e600 68 65 20 69 6e 76 6f 6b 69 6e 67 20 75 73 65 72 2e 0a 0a 20 20 20 54 68 65 20 61 75 74 68 6f 72 ┆he invoking user. The author┆ 0x04f200…09e600 28 29 20 66 75 6e 63 74 69 6f 6e 20 74 72 69 65 73 20 74 6f 20 65 78 74 72 61 63 74 20 61 20 68 ┆() function tries to extract a h┆ 0x04f200…09e600 75 6d 61 6e 20 6e 61 6d 65 20 66 6f 72 20 61 6e 20 61 72 74 69 63 6c 65 20 61 75 74 68 6f 72 0a ┆uman name for an article author ┆ 0x04f200…09e600 6f 75 74 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 27 73 20 52 65 70 6c 79 2d 54 6f 20 61 6e 64 ┆out of the header's Reply-To and┆ 0x04f200…09e600 20 46 72 6f 6d 20 6c 69 6e 65 73 2e 0a 0a 42 55 47 53 0a 20 20 20 54 68 65 20 61 75 74 68 6f 72 ┆ From lines. BUGS The author┆ 0x04f200…09e600 28 29 20 63 6f 64 65 20 63 6f 6d 70 65 6e 73 61 74 65 73 20 66 6f 72 20 62 72 6f 6b 65 6e 20 67 ┆() code compensates for broken g┆ 0x04f200…09e600 61 74 65 77 61 79 73 20 62 79 20 72 65 70 6c 61 63 69 6e 67 20 27 2e 27 20 63 68 61 72 73 0a 66 ┆ateways by replacing '.' chars f┆ 0x04f200…09e600 6f 6c 6c 6f 77 65 64 20 62 79 20 6c 65 74 74 65 72 73 20 77 69 74 68 20 27 20 27 2c 20 61 6e 64 ┆ollowed by letters with ' ', and┆ 0x04f200…09e600 20 64 65 6c 65 74 65 73 20 61 6c 6c 20 22 20 63 68 61 72 61 63 74 65 72 73 2e 20 54 68 69 73 20 ┆ deletes all " characters. This ┆ 0x04f200…09e600 69 73 20 61 20 6b 6c 75 67 65 2e 0a 0a 53 45 45 20 41 4c 53 4f 0a 20 20 20 67 65 74 66 69 6c 65 ┆is a kluge. SEE ALSO getfile┆ 0x04f200…09e600 73 2e 63 09 09 2d 2d 20 61 63 63 65 73 73 20 74 6f 20 6e 65 77 73 20 66 69 6c 65 20 68 69 65 72 ┆s.c -- access to news file hier┆ 0x04f200…09e600 61 72 63 68 79 0a 20 20 20 6e 6e 74 70 2e 63 09 09 2d 2d 20 6e 6e 74 70 20 73 65 72 76 65 72 20 ┆archy nntp.c -- nntp server ┆ 0x04f200…09e600 73 75 70 70 6f 72 74 20 28 6d 69 6d 69 63 73 20 68 69 73 74 6f 72 79 20 66 61 63 69 6c 69 74 69 ┆support (mimics history faciliti┆ 0x04f200…09e600 65 73 29 0a 0a 41 55 54 48 4f 52 0a 20 20 20 45 72 69 63 20 53 2e 20 52 61 79 6d 6f 6e 64 0a 20 ┆es) AUTHOR Eric S. Raymond ┆ 0x04f200…09e600 20 20 54 68 69 73 20 73 6f 66 74 77 61 72 65 20 69 73 20 43 6f 70 79 72 69 67 68 74 20 28 43 29 ┆ This software is Copyright (C)┆ 0x04f200…09e600 20 31 39 38 39 20 62 79 20 45 72 69 63 20 53 2e 20 52 61 79 6d 6f 6e 64 20 66 6f 72 20 74 68 65 ┆ 1989 by Eric S. Raymond for the┆ 0x04f200…09e600 20 73 6f 6c 65 20 70 75 72 70 6f 73 65 0a 6f 66 20 70 72 6f 74 65 63 74 69 6e 67 20 66 72 65 65 ┆ sole purpose of protecting free┆ 0x04f200…09e600 20 72 65 64 69 73 74 72 69 62 75 74 69 6f 6e 3b 20 73 65 65 20 74 68 65 20 4c 49 43 45 4e 53 45 ┆ redistribution; see the LICENSE┆ 0x04f200…09e600 20 66 69 6c 65 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆ file for details. ************┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆********************************┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a ┆******************************/ ┆ 0x04f200…09e600 2f 2a 4c 49 4e 54 4c 49 42 52 41 52 59 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 6e 65 77 73 2e 68 ┆/*LINTLIBRARY*/ #include "news.h┆ 0x04f200…09e600 22 0a 23 69 6e 63 6c 75 64 65 20 22 76 69 6f 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 68 65 61 ┆" #include "vio.h" #include "hea┆ 0x04f200…09e600 64 65 72 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 61 63 74 69 76 65 2e 68 22 0a 23 69 6e 63 6c ┆der.h" #include "active.h" #incl┆ 0x04f200…09e600 75 64 65 20 22 6e 65 77 73 72 63 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 68 69 73 74 6f 72 79 ┆ude "newsrc.h" #include "history┆ 0x04f200…09e600 2e 68 22 0a 0a 69 6e 74 20 67 65 74 61 72 74 28 70 6c 2c 20 68 64 2c 20 74 78 74 29 0a 2f 2a 20 ┆.h" int getart(pl, hd, txt) /* ┆ 0x04f200…09e600 67 65 74 20 75 73 20 61 63 63 65 73 73 20 74 6f 20 6d 65 73 73 61 67 65 20 74 65 78 74 20 66 6f ┆get us access to message text fo┆ 0x04f200…09e600 72 20 67 69 76 65 6e 20 61 72 74 69 63 6c 65 20 2a 2f 0a 70 6c 61 63 65 5f 74 09 2a 70 6c 3b 0a ┆r given article */ place_t *pl; ┆ 0x04f200…09e600 68 64 72 5f 74 09 2a 68 64 3b 0a 63 68 61 72 09 2a 74 78 74 3b 0a 7b 0a 20 20 20 20 69 6e 74 09 ┆hdr_t *hd; char *txt; { int ┆ 0x04f200…09e600 09 09 6c 63 3b 0a 20 20 20 20 46 49 4c 45 09 09 2a 6e 65 78 74 66 70 3b 0a 23 69 66 64 65 66 20 ┆ lc; FILE *nextfp; #ifdef ┆ 0x04f200…09e600 43 52 41 43 4b 4d 41 49 4c 0a 20 20 20 20 73 74 61 74 69 63 20 67 72 6f 75 70 5f 74 09 2a 6f 6c ┆CRACKMAIL static group_t *ol┆ 0x04f200…09e600 64 67 72 6f 75 70 20 3d 20 28 67 72 6f 75 70 5f 74 20 2a 29 30 3b 0a 23 65 6e 64 69 66 20 2f 2a ┆dgroup = (group_t *)0; #endif /*┆ 0x04f200…09e600 20 43 48 45 43 4b 4d 41 49 4c 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 67 65 6e 65 72 61 74 65 20 74 ┆ CHECKMAIL */ /* generate t┆ 0x04f200…09e600 68 65 20 61 63 74 75 61 6c 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 6d 65 73 73 61 67 65 20 66 69 ┆he actual name of the message fi┆ 0x04f200…09e600 6c 65 20 74 6f 20 62 65 20 6c 6f 6f 6b 65 64 20 61 74 20 2a 2f 0a 23 69 66 64 65 66 20 43 52 41 ┆le to be looked at */ #ifdef CRA┆ 0x04f200…09e600 43 4b 4d 41 49 4c 0a 20 20 20 20 69 66 20 28 70 6c 2d 3e 6d 5f 67 72 6f 75 70 2d 3e 72 63 5f 66 ┆CKMAIL if (pl->m_group->rc_f┆ 0x04f200…09e600 6c 61 67 73 20 26 20 52 43 5f 4d 41 49 4c 42 4f 58 29 0a 20 20 20 20 7b 0a 09 69 66 20 28 70 6c ┆lags & RC_MAILBOX) { if (pl┆ 0x04f200…09e600 2d 3e 6d 5f 67 72 6f 75 70 20 3d 3d 20 6f 6c 64 67 72 6f 75 70 29 0a 09 20 20 20 20 6c 63 20 3d ┆->m_group == oldgroup) lc =┆ 0x04f200…09e600 20 46 41 4c 53 45 3b 0a 09 65 6c 73 65 0a 09 7b 0a 09 20 20 20 20 2f 2a 20 72 75 6e 20 63 72 61 ┆ FALSE; else { /* run cra┆ 0x04f200…09e600 63 6b 6d 61 69 6c 28 29 20 68 65 72 65 20 69 66 20 74 68 65 72 65 27 73 20 6e 6f 20 6e 65 77 73 ┆ckmail() here if there's no news┆ 0x04f200…09e600 67 72 6f 75 70 20 69 6e 64 65 78 20 69 6e 20 63 6f 72 65 20 2a 2f 0a 0a 09 20 20 20 20 28 76 6f ┆group index in core */ (vo┆ 0x04f200…09e600 69 64 29 20 73 74 72 63 70 79 28 74 78 74 2c 20 70 6c 2d 3e 6d 5f 67 72 6f 75 70 2d 3e 6e 67 5f ┆id) strcpy(txt, pl->m_group->ng_┆ 0x04f200…09e600 62 6f 78 2d 3e 6d 62 5f 66 69 6c 65 29 3b 0a 09 20 20 20 20 6c 63 20 3d 20 54 52 55 45 3b 0a 09 ┆box->mb_file); lc = TRUE; ┆ 0x04f200…09e600 7d 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 43 52 41 43 4b ┆} } else #endif /* CRACK┆ 0x04f200…09e600 4d 41 49 4c 20 2a 2f 0a 09 69 66 20 28 28 6c 63 20 3d 20 61 72 74 6e 61 6d 65 28 70 6c 2c 20 74 ┆MAIL */ if ((lc = artname(pl, t┆ 0x04f200…09e600 78 74 29 29 20 3d 3d 20 46 41 49 4c 20 7c 7c 20 21 65 78 69 73 74 73 28 74 78 74 29 29 0a 09 20 ┆xt)) == FAIL || !exists(txt)) ┆ 0x04f200…09e600 20 20 20 6c 63 20 3d 20 46 41 49 4c 3b 0a 09 65 6c 73 65 0a 09 20 20 20 20 6c 63 20 3d 20 54 52 ┆ lc = FAIL; else lc = TR┆ 0x04f200…09e600 55 45 3b 0a 0a 20 20 20 20 2f 2a 20 4f 2e 4b 2e 2c 20 67 65 74 20 61 20 68 61 6e 64 6c 65 20 6f ┆UE; /* O.K., get a handle o┆ 0x04f200…09e600 6e 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 69 66 20 28 6c 63 20 3d 3d 20 46 41 49 4c ┆n the file */ if (lc == FAIL┆ 0x04f200…09e600 29 0a 09 72 65 74 75 72 6e 28 41 5f 4d 49 53 53 49 4e 47 29 3b 0a 20 20 20 20 65 6c 73 65 20 69 ┆) return(A_MISSING); else i┆ 0x04f200…09e600 66 20 28 6c 63 20 3d 3d 20 54 52 55 45 29 09 2f 2a 20 66 69 6c 65 6e 61 6d 65 20 68 61 73 20 63 ┆f (lc == TRUE) /* filename has c┆ 0x04f200…09e600 68 61 6e 67 65 64 20 2a 2f 0a 20 20 20 20 7b 0a 09 69 66 20 28 28 6e 65 78 74 66 70 20 3d 20 6d ┆hanged */ { if ((nextfp = m┆ 0x04f200…09e600 73 67 6f 70 65 6e 28 74 78 74 29 29 20 21 3d 20 28 46 49 4c 45 20 2a 29 4e 55 4c 4c 29 0a 09 7b ┆sgopen(txt)) != (FILE *)NULL) {┆ 0x04f200…09e600 0a 23 69 66 64 65 66 20 43 52 41 43 4b 4d 41 49 4c 0a 09 20 20 20 20 6f 6c 64 67 72 6f 75 70 20 ┆ #ifdef CRACKMAIL oldgroup ┆ 0x04f200…09e600 3d 20 70 6c 2d 3e 6d 5f 67 72 6f 75 70 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 43 48 45 43 4b 4d 41 ┆= pl->m_group; #endif /* CHECKMA┆ 0x04f200…09e600 49 4c 20 2a 2f 0a 09 20 20 20 20 69 66 20 28 68 64 2d 3e 68 5f 66 70 29 0a 09 09 28 76 6f 69 64 ┆IL */ if (hd->h_fp) (void┆ 0x04f200…09e600 29 20 6d 73 67 63 6c 6f 73 65 28 68 64 2d 3e 68 5f 66 70 29 3b 0a 09 7d 0a 09 65 6c 73 65 0a 09 ┆) msgclose(hd->h_fp); } else ┆ 0x04f200…09e600 7b 0a 09 20 20 20 20 6e 65 78 74 66 70 20 3d 20 68 64 2d 3e 68 5f 66 70 3b 0a 09 20 20 20 20 72 ┆{ nextfp = hd->h_fp; r┆ 0x04f200…09e600 65 74 75 72 6e 28 41 5f 4e 4f 4f 50 45 4e 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 ┆eturn(A_NOOPEN); } } #ifde┆ 0x04f200…09e600 66 20 43 52 41 43 4b 4d 41 49 4c 0a 20 20 20 20 2f 2a 20 67 6f 20 74 6f 20 74 68 65 20 61 72 74 ┆f CRACKMAIL /* go to the art┆ 0x04f200…09e600 69 63 6c 65 20 73 74 61 72 74 20 2a 2f 0a 20 20 20 20 28 76 6f 69 64 29 20 66 73 65 65 6b 28 6e ┆icle start */ (void) fseek(n┆ 0x04f200…09e600 65 78 74 66 70 2c 20 70 6c 2d 3e 6d 5f 67 72 6f 75 70 2d 3e 72 63 5f 62 6f 78 2d 3e 6d 62 5f 73 ┆extfp, pl->m_group->rc_box->mb_s┆ 0x04f200…09e600 74 61 72 74 5b 70 6c 2d 3e 6d 5f 6e 75 6d 62 65 72 5d 2c 53 45 45 4b 5f 53 45 54 29 3b 0a 23 65 ┆tart[pl->m_number],SEEK_SET); #e┆ 0x04f200…09e600 6e 64 69 66 20 2f 2a 20 43 52 41 43 4b 4d 41 49 4c 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 77 68 65 ┆ndif /* CRACKMAIL */ /* whe┆ 0x04f200…09e600 74 68 65 72 20 6f 72 20 6e 6f 74 20 77 65 20 6f 70 65 6e 65 64 20 61 20 6e 65 77 20 66 69 6c 65 ┆ther or not we opened a new file┆ 0x04f200…09e600 2c 20 74 72 79 20 74 6f 20 72 65 61 64 20 61 6e 20 61 72 74 69 63 6c 65 20 68 65 61 64 65 72 20 ┆, try to read an article header ┆ 0x04f200…09e600 2a 2f 0a 20 20 20 20 68 66 72 65 65 28 68 64 29 3b 0a 20 20 20 20 69 66 20 28 68 72 65 61 64 28 ┆*/ hfree(hd); if (hread(┆ 0x04f200…09e600 68 64 2c 20 30 4c 2c 20 6e 65 78 74 66 70 29 20 3d 3d 20 30 29 0a 20 20 20 20 7b 0a 09 28 76 6f ┆hd, 0L, nextfp) == 0) { (vo┆ 0x04f200…09e600 69 64 29 20 6d 73 67 63 6c 6f 73 65 28 68 64 2d 3e 68 5f 66 70 29 3b 0a 09 72 65 74 75 72 6e 28 ┆id) msgclose(hd->h_fp); return(┆ 0x04f200…09e600 41 5f 47 41 52 42 4c 45 44 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 65 6e 73 75 72 65 ┆A_GARBLED); } /* ensure┆ 0x04f200…09e600 20 74 68 61 74 20 74 68 65 20 68 65 61 64 65 72 27 73 20 6c 69 6e 65 20 63 6f 75 6e 74 20 69 73 ┆ that the header's line count is┆ 0x04f200…09e600 20 4f 4b 20 2a 2f 0a 20 20 20 20 6c 63 20 3d 20 6c 69 6e 65 63 6f 75 6e 74 28 68 64 2d 3e 68 5f ┆ OK */ lc = linecount(hd->h_┆ 0x04f200…09e600 66 70 2c 20 68 64 2d 3e 68 5f 65 6e 64 6f 66 66 29 3b 0a 20 20 20 20 69 66 20 28 68 64 2d 3e 68 ┆fp, hd->h_endoff); if (hd->h┆ 0x04f200…09e600 5f 69 6e 74 6e 75 6d 6c 69 6e 65 73 20 26 26 20 28 6c 63 20 21 3d 20 68 64 2d 3e 68 5f 69 6e 74 ┆_intnumlines && (lc != hd->h_int┆ 0x04f200…09e600 6e 75 6d 6c 69 6e 65 73 29 29 0a 09 72 65 74 75 72 6e 28 41 5f 4c 49 4e 45 43 4f 55 4e 54 29 3b ┆numlines)) return(A_LINECOUNT);┆ 0x04f200…09e600 0a 20 20 20 20 68 64 2d 3e 68 5f 69 6e 74 6e 75 6d 6c 69 6e 65 73 20 3d 20 6c 63 3b 0a 20 20 20 ┆ hd->h_intnumlines = lc; ┆ 0x04f200…09e600 20 72 65 74 75 72 6e 28 41 5f 46 45 54 43 48 4f 4b 29 3b 0a 7d 0a 0a 69 6e 74 20 61 72 74 65 72 ┆ return(A_FETCHOK); } int arter┆ 0x04f200…09e600 72 28 73 74 61 74 75 73 2c 20 70 6c 2c 20 68 64 2c 20 62 75 66 29 0a 2f 2a 20 66 6f 72 6d 61 74 ┆r(status, pl, hd, buf) /* format┆ 0x04f200…09e600 20 61 20 64 65 66 61 75 6c 74 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 63 6f 72 72 65 73 70 ┆ a default error message corresp┆ 0x04f200…09e600 6f 6e 64 69 6e 67 20 74 6f 20 61 20 67 69 76 65 6e 20 61 72 74 69 63 6c 65 20 2a 2f 0a 69 6e 74 ┆onding to a given article */ int┆ 0x04f200…09e600 09 73 74 61 74 75 73 3b 09 2f 2a 20 65 72 72 6f 72 20 73 74 61 74 75 73 20 2a 2f 0a 70 6c 61 63 ┆ status; /* error status */ plac┆ 0x04f200…09e600 65 5f 74 09 2a 70 6c 3b 0a 68 64 72 5f 74 09 2a 68 64 3b 0a 63 68 61 72 09 2a 62 75 66 3b 0a 7b ┆e_t *pl; hdr_t *hd; char *buf; {┆ 0x04f200…09e600 0a 20 20 20 20 73 77 69 74 63 68 28 73 74 61 74 75 73 29 0a 20 20 20 20 7b 0a 20 20 20 20 63 61 ┆ switch(status) { ca┆ 0x04f200…09e600 73 65 20 41 5f 4d 49 53 53 49 4e 47 3a 0a 09 28 76 6f 69 64 29 20 73 70 72 69 6e 74 66 28 62 75 ┆se A_MISSING: (void) sprintf(bu┆ 0x04f200…09e600 66 2c 20 22 41 72 74 69 63 6c 65 20 25 6c 64 20 6f 66 20 67 72 6f 75 70 20 25 73 20 69 73 20 6d ┆f, "Article %ld of group %s is m┆ 0x04f200…09e600 69 73 73 69 6e 67 2e 22 2c 0a 09 09 09 70 6c 2d 3e 6d 5f 6e 75 6d 62 65 72 2c 20 70 6c 2d 3e 6d ┆issing.", pl->m_number, pl->m┆ 0x04f200…09e600 5f 67 72 6f 75 70 2d 3e 6e 67 5f 6e 61 6d 65 29 3b 0a 09 62 72 65 61 6b 3b 0a 0a 20 20 20 63 61 ┆_group->ng_name); break; ca┆ 0x04f200…09e600 73 65 20 41 5f 4e 4f 4f 50 45 4e 3a 0a 09 28 76 6f 69 64 29 20 73 70 72 69 6e 74 66 28 62 75 66 ┆se A_NOOPEN: (void) sprintf(buf┆ 0x04f200…09e600 2c 20 22 43 61 6e 27 74 20 6f 70 65 6e 20 25 73 2f 25 64 2c 20 65 72 72 6e 6f 20 3d 20 25 64 2e ┆, "Can't open %s/%d, errno = %d.┆ 0x04f200…09e600 22 2c 0a 09 09 09 70 6c 2d 3e 6d 5f 6e 75 6d 62 65 72 2c 20 70 6c 2d 3e 6d 5f 67 72 6f 75 70 2d ┆", pl->m_number, pl->m_group-┆ 0x04f200…09e600 3e 6e 67 5f 6e 61 6d 65 2c 0a 09 09 09 65 72 72 6e 6f 29 3b 0a 09 62 72 65 61 6b 3b 0a 0a 20 20 ┆>ng_name, errno); break; ┆ 0x04f200…09e600 20 20 63 61 73 65 20 41 5f 47 41 52 42 4c 45 44 3a 0a 09 28 76 6f 69 64 29 20 73 70 72 69 6e 74 ┆ case A_GARBLED: (void) sprint┆ 0x04f200…09e600 66 28 62 75 66 2c 20 22 41 72 74 69 63 6c 65 20 25 6c 64 20 6f 66 20 67 72 6f 75 70 20 25 73 20 ┆f(buf, "Article %ld of group %s ┆ 0x04f200…09e600 69 73 20 67 61 72 62 6c 65 64 22 2c 0a 09 09 09 70 6c 2d 3e 6d 5f 6e 75 6d 62 65 72 2c 20 70 6c ┆is garbled", pl->m_number, pl┆ 0x04f200…09e600 2d 3e 6d 5f 67 72 6f 75 70 2d 3e 6e 67 5f 6e 61 6d 65 29 3b 0a 09 62 72 65 61 6b 3b 0a 0a 20 20 ┆->m_group->ng_name); break; ┆ 0x04f200…09e600 20 20 63 61 73 65 20 41 5f 4c 49 4e 45 43 4f 55 4e 54 3a 0a 09 28 76 6f 69 64 29 20 73 70 72 69 ┆ case A_LINECOUNT: (void) spri┆ 0x04f200…09e600 6e 74 66 28 62 66 72 2c 0a 09 09 09 22 41 72 74 69 63 6c 65 20 25 6c 64 20 6f 66 20 67 72 6f 75 ┆ntf(bfr, "Article %ld of grou┆ 0x04f200…09e600 70 20 25 73 20 68 61 73 20 61 20 62 61 64 20 6c 69 6e 65 20 63 6f 75 6e 74 20 28 25 64 29 22 2c ┆p %s has a bad line count (%d)",┆ 0x04f200…09e600 0a 09 09 09 70 6c 2d 3e 6d 5f 6e 75 6d 62 65 72 2c 20 70 6c 2d 3e 6d 5f 67 72 6f 75 70 2d 3e 6e ┆ pl->m_number, pl->m_group->n┆ 0x04f200…09e600 67 5f 6e 61 6d 65 2c 0a 09 09 09 68 64 2d 3e 68 5f 69 6e 74 6e 75 6d 6c 69 6e 65 73 29 3b 0a 09 ┆g_name, hd->h_intnumlines); ┆ 0x04f200…09e600 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 65 74 75 72 6e 28 73 74 61 74 75 73 29 ┆break; } return(status)┆ 0x04f200…09e600 3b 09 2f 2a 20 73 6f 20 77 65 20 63 61 6e 20 70 61 73 73 20 69 74 20 72 69 67 68 74 20 74 68 72 ┆; /* so we can pass it right thr┆ 0x04f200…09e600 6f 75 67 68 20 2a 2f 0a 7d 0a 0a 76 6f 69 64 20 61 75 74 68 6f 72 28 68 70 2c 20 62 75 66 29 0a ┆ough */ } void author(hp, buf) ┆ 0x04f200…09e600 2f 2a 20 72 65 74 75 72 6e 20 61 20 62 65 73 74 20 61 70 70 72 6f 78 69 6d 61 74 69 6f 6e 20 6f ┆/* return a best approximation o┆ 0x04f200…09e600 66 20 74 68 65 20 61 72 74 69 63 6c 65 20 61 75 74 68 6f 72 27 73 20 6e 61 6d 65 20 2a 2f 0a 68 ┆f the article author's name */ h┆ 0x04f200…09e600 64 72 5f 74 09 2a 68 70 3b 0a 63 68 61 72 09 2a 62 75 66 3b 0a 7b 0a 20 20 20 20 63 68 61 72 09 ┆dr_t *hp; char *buf; { char ┆ 0x04f200…09e600 2a 63 70 2c 20 2a 73 70 3b 0a 0a 20 20 20 20 2f 2a 20 75 73 65 20 52 65 70 6c 79 2d 54 6f 20 69 ┆*cp, *sp; /* use Reply-To i┆ 0x04f200…09e600 66 20 77 65 20 66 69 6e 64 20 6f 6e 65 2c 20 6f 74 68 65 72 77 69 73 65 20 74 68 65 20 46 72 6f ┆f we find one, otherwise the Fro┆ 0x04f200…09e600 6d 20 6c 69 6e 65 20 2a 2f 0a 20 20 20 20 69 66 20 28 68 6c 6e 62 6c 61 6e 6b 28 68 70 2d 3e 68 ┆m line */ if (hlnblank(hp->h┆ 0x04f200…09e600 5f 72 65 70 6c 79 74 6f 29 0a 09 09 26 26 20 28 63 70 20 3d 20 73 74 72 63 68 72 28 68 70 2d 3e ┆_replyto) && (cp = strchr(hp->┆ 0x04f200…09e600 68 5f 72 65 70 6c 79 74 6f 2c 20 27 28 27 29 29 20 21 3d 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c ┆h_replyto, '(')) != (char *)NULL┆ 0x04f200…09e600 0a 09 09 26 26 20 63 70 5b 31 5d 20 21 3d 20 27 29 27 29 0a 09 73 70 20 3d 20 68 70 2d 3e 68 5f ┆ && cp[1] != ')') sp = hp->h_┆ 0x04f200…09e600 72 65 70 6c 79 74 6f 3b 0a 20 20 20 20 65 6c 73 65 0a 09 73 70 20 3d 20 68 70 2d 3e 68 5f 66 72 ┆replyto; else sp = hp->h_fr┆ 0x04f200…09e600 6f 6d 3b 0a 0a 20 20 20 20 2f 2a 20 69 66 20 74 68 65 72 65 27 73 20 6e 6f 20 6e 6f 6e 2d 65 6d ┆om; /* if there's no non-em┆ 0x04f200…09e600 70 74 79 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20 6c 69 6e 65 2c 20 75 73 65 20 74 68 65 ┆pty comment on the line, use the┆ 0x04f200…09e600 20 77 68 6f 6c 65 20 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20 69 66 20 28 28 63 70 20 3d 20 73 74 ┆ whole thing */ if ((cp = st┆ 0x04f200…09e600 72 63 68 72 28 73 70 2c 20 27 28 27 29 29 20 3d 3d 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 20 7c ┆rchr(sp, '(')) == (char *)NULL |┆ 0x04f200…09e600 7c 20 63 70 5b 31 5d 20 3d 3d 20 27 29 27 29 0a 20 20 20 20 7b 0a 09 28 76 6f 69 64 29 20 73 74 ┆| cp[1] == ')') { (void) st┆ 0x04f200…09e600 72 63 70 79 28 62 75 66 2c 20 73 70 29 3b 0a 09 69 66 20 28 28 63 70 20 3d 20 73 74 72 63 68 72 ┆rcpy(buf, sp); if ((cp = strchr┆ 0x04f200…09e600 28 62 75 66 2c 20 27 5c 6e 27 29 29 20 21 3d 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 0a 09 20 ┆(buf, '\n')) != (char *)NULL) ┆ 0x04f200…09e600 20 20 20 2a 63 70 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 09 2f 2a ┆ *cp = '\0'; } else /*┆ 0x04f200…09e600 20 66 6f 75 6e 64 20 61 20 63 6f 6d 6d 65 6e 74 20 73 74 61 72 74 20 2a 2f 0a 20 20 20 20 7b 0a ┆ found a comment start */ { ┆ 0x04f200…09e600 09 28 76 6f 69 64 29 20 73 74 72 63 70 79 28 62 75 66 2c 20 63 70 20 2b 20 31 29 3b 0a 09 69 66 ┆ (void) strcpy(buf, cp + 1); if┆ 0x04f200…09e600 20 28 28 63 70 20 3d 20 73 74 72 63 68 72 28 62 75 66 2c 20 27 29 27 29 29 20 21 3d 20 28 63 68 ┆ ((cp = strchr(buf, ')')) != (ch┆ 0x04f200…09e600 61 72 20 2a 29 4e 55 4c 4c 29 0a 09 20 20 20 20 2a 63 70 20 3d 20 27 5c 30 27 3b 0a 0a 09 2f 2a ┆ar *)NULL) *cp = '\0'; /*┆ 0x04f200…09e600 20 74 72 79 20 74 6f 20 63 6f 72 72 65 63 74 20 66 6f 72 20 62 72 61 69 6e 64 61 6d 61 67 65 20 ┆ try to correct for braindamage ┆ 0x04f200…09e600 62 79 20 76 61 72 69 6f 75 73 20 67 61 74 65 77 61 79 73 20 2a 2f 0a 09 66 6f 72 20 28 63 70 20 ┆by various gateways */ for (cp ┆ 0x04f200…09e600 3d 20 62 75 66 3b 20 2a 63 70 3b 20 63 70 2b 2b 29 0a 09 20 20 20 20 69 66 20 28 63 70 5b 30 5d ┆= buf; *cp; cp++) if (cp[0]┆ 0x04f200…09e600 20 3d 3d 20 27 22 27 29 0a 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 20 20 20 20 65 6c 73 65 20 69 ┆ == '"') continue; else i┆ 0x04f200…09e600 66 20 28 63 70 5b 30 5d 20 3d 3d 20 27 2e 27 20 26 26 20 69 73 61 6c 70 68 61 28 63 70 5b 31 5d ┆f (cp[0] == '.' && isalpha(cp[1]┆ 0x04f200…09e600 29 29 0a 09 09 2a 63 70 20 3d 20 27 20 27 3b 0a 20 20 20 20 7d 0a 7d 0a 0a 69 6e 74 20 69 6e 64 ┆)) *cp = ' '; } } int ind┆ 0x04f200…09e600 65 78 6c 69 6e 65 28 6e 67 72 70 2c 20 6e 75 6d 2c 20 62 75 66 29 0a 2f 2a 20 67 65 6e 65 72 61 ┆exline(ngrp, num, buf) /* genera┆ 0x04f200…09e600 74 65 20 61 20 73 75 62 6a 65 63 74 20 6c 69 6e 65 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 ┆te a subject line for the given ┆ 0x04f200…09e600 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a 67 72 6f 75 70 5f 74 09 2a 6e 67 72 70 3b 0a 6e 61 72 74 5f ┆location */ group_t *ngrp; nart_┆ 0x04f200…09e600 74 09 6e 75 6d 3b 0a 63 68 61 72 09 2a 62 75 66 3b 0a 7b 0a 20 20 20 20 73 74 61 74 69 63 20 68 ┆t num; char *buf; { static h┆ 0x04f200…09e600 64 72 5f 74 09 73 75 62 6a 68 64 72 3b 0a 20 20 20 20 70 6c 61 63 65 5f 74 09 09 6c 6f 63 3b 0a ┆dr_t subjhdr; place_t loc; ┆ 0x04f200…09e600 20 20 20 20 69 6e 74 09 09 09 73 74 61 74 75 73 3b 0a 0a 20 20 20 20 6c 6f 63 2e 6d 5f 67 72 6f ┆ int status; loc.m_gro┆ 0x04f200…09e600 75 70 20 3d 20 6e 67 72 70 3b 0a 20 20 20 20 6c 6f 63 2e 6d 5f 6e 75 6d 62 65 72 20 3d 20 6e 75 ┆up = ngrp; loc.m_number = nu┆ 0x04f200…09e600 6d 3b 0a 20 20 20 20 69 66 20 28 28 73 74 61 74 75 73 20 3d 20 67 65 74 61 72 74 28 26 6c 6f 63 ┆m; if ((status = getart(&loc┆ 0x04f200…09e600 2c 20 26 73 75 62 6a 68 64 72 2c 20 62 75 66 29 29 20 3c 20 30 29 0a 20 20 20 20 7b 0a 09 62 75 ┆, &subjhdr, buf)) < 0) { bu┆ 0x04f200…09e600 66 5b 30 5d 20 3d 20 49 5f 4e 4f 41 52 54 3b 0a 09 28 76 6f 69 64 29 20 61 72 74 65 72 72 28 73 ┆f[0] = I_NOART; (void) arterr(s┆ 0x04f200…09e600 74 61 74 75 73 2c 20 26 6c 6f 63 2c 20 26 73 75 62 6a 68 64 72 2c 20 62 75 66 20 2b 20 31 29 3b ┆tatus, &loc, &subjhdr, buf + 1);┆ 0x04f200…09e600 0a 09 72 65 74 75 72 6e 28 46 41 49 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 0a 20 ┆ return(FAIL); } else ┆ 0x04f200…09e600 20 20 20 7b 0a 23 69 66 64 65 66 20 52 4e 45 53 43 41 50 45 53 0a 09 73 74 61 74 69 63 20 63 68 ┆ { #ifdef RNESCAPES static ch┆ 0x04f200…09e600 61 72 09 2a 66 6d 74 20 3d 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66 20 2f ┆ar *fmt = (char *)NULL; #endif /┆ 0x04f200…09e600 2a 20 52 4e 45 53 43 41 50 45 53 20 2a 2f 0a 09 73 74 61 74 69 63 20 63 68 61 72 09 2a 6d 61 74 ┆* RNESCAPES */ static char *mat┆ 0x04f200…09e600 63 68 20 3d 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 3b 0a 0a 09 2f 2a 20 31 2d 63 68 61 72 20 70 ┆ch = (char *)NULL; /* 1-char p┆ 0x04f200…09e600 72 65 66 69 78 20 74 65 6c 6c 73 20 69 66 20 61 72 74 69 63 6c 65 20 69 73 20 6c 69 6b 65 6c 79 ┆refix tells if article is likely┆ 0x04f200…09e600 20 74 6f 20 62 65 20 6f 66 20 69 6e 74 65 72 65 73 74 20 2a 2f 0a 09 69 66 20 28 6d 61 74 63 68 ┆ to be of interest */ if (match┆ 0x04f200…09e600 20 3d 3d 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 0a 09 20 20 20 20 53 70 72 69 6e 74 32 28 6d ┆ == (char *)NULL) Sprint2(m┆ 0x04f200…09e600 61 74 63 68 2c 20 22 25 73 40 25 73 22 2c 20 75 73 65 72 6e 61 6d 65 2c 20 73 69 74 65 2e 74 72 ┆atch, "%s@%s", username, site.tr┆ 0x04f200…09e600 75 65 6e 61 6d 65 29 3b 0a 09 62 75 66 5b 30 5d 20 3d 20 73 74 72 69 6e 64 65 78 28 73 75 62 6a ┆uename); buf[0] = strindex(subj┆ 0x04f200…09e600 68 64 72 2e 68 5f 72 65 66 65 72 65 6e 63 65 73 2c 6d 61 74 63 68 29 20 3e 20 2d 31 20 3f 20 49 ┆hdr.h_references,match) > -1 ? I┆ 0x04f200…09e600 5f 4c 4f 43 41 4c 20 3a 20 49 5f 42 4c 41 4e 4b 3b 0a 0a 23 69 66 64 65 66 20 52 4e 45 53 43 41 ┆_LOCAL : I_BLANK; #ifdef RNESCA┆ 0x04f200…09e600 50 45 53 0a 09 69 66 20 28 66 6d 74 20 3d 3d 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 0a 09 20 ┆PES if (fmt == (char *)NULL) ┆ 0x04f200…09e600 20 20 20 66 6d 74 20 3d 20 67 65 74 65 6e 76 28 22 53 55 42 4a 4c 49 4e 45 22 29 3b 0a 0a 09 69 ┆ fmt = getenv("SUBJLINE"); i┆ 0x04f200…09e600 66 20 28 66 6d 74 20 21 3d 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 0a 09 7b 0a 09 20 20 20 20 ┆f (fmt != (char *)NULL) { ┆ 0x04f200…09e600 73 65 65 68 65 61 64 65 72 28 26 73 75 62 6a 68 64 72 29 3b 0a 09 20 20 20 20 73 74 72 65 78 70 ┆seeheader(&subjhdr); strexp┆ 0x04f200…09e600 61 6e 64 28 66 6d 74 2c 20 62 75 66 20 2b 20 31 29 3b 0a 09 20 20 20 20 73 65 65 68 65 61 64 65 ┆and(fmt, buf + 1); seeheade┆ 0x04f200…09e600 72 28 26 68 65 61 64 65 72 29 3b 0a 09 7d 0a 09 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 52 ┆r(&header); } else #endif /* R┆ 0x04f200…09e600 4e 45 53 43 41 50 45 53 20 2a 2f 0a 09 7b 0a 09 20 20 20 20 63 68 61 72 09 66 72 6f 6d 62 66 72 ┆NESCAPES */ { char frombfr┆ 0x04f200…09e600 5b 42 55 46 4c 45 4e 5d 3b 0a 0a 09 20 20 20 20 2f 2a 20 77 65 20 64 6f 20 74 68 65 20 65 71 75 ┆[BUFLEN]; /* we do the equ┆ 0x04f200…09e600 69 76 61 6c 65 6e 74 20 6f 66 20 25 61 20 25 65 20 25 2d 31 39 2c 31 39 5b 53 75 62 6a 65 63 74 ┆ivalent of %a %e %-19,19[Subject┆ 0x04f200…09e600 5d 20 68 65 72 65 20 2a 2f 0a 09 20 20 20 20 61 75 74 68 6f 72 28 26 73 75 62 6a 68 64 72 2c 20 ┆] here */ author(&subjhdr, ┆ 0x04f200…09e600 66 72 6f 6d 62 66 72 29 3b 0a 09 20 20 20 20 28 76 6f 69 64 29 20 73 70 72 69 6e 74 66 28 62 75 ┆frombfr); (void) sprintf(bu┆ 0x04f200…09e600 66 20 2b 20 31 2c 20 22 25 6c 64 20 25 2d 31 39 2e 31 39 73 20 25 73 22 2c 0a 09 09 09 20 20 20 ┆f + 1, "%ld %-19.19s %s", ┆ 0x04f200…09e600 28 6c 6f 6e 67 29 6e 75 6d 2c 20 66 72 6f 6d 62 66 72 2c 20 73 75 62 6a 68 64 72 2e 68 5f 73 75 ┆(long)num, frombfr, subjhdr.h_su┆ 0x04f200…09e600 62 6a 65 63 74 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 65 74 75 72 6e 28 53 55 43 ┆bject); } } return(SUC┆ 0x04f200…09e600 43 45 45 44 29 3b 0a 7d 0a 0a 2f 2a 20 67 65 74 61 72 74 2e 63 20 65 6e 64 73 20 68 65 72 65 20 ┆CEED); } /* getart.c ends here ┆ 0x04f200…09e600 2a 2f 0a 43 41 4c 20 3a 20 49 5f 42 4c 41 4e 4b 3b 0a 0a 23 69 66 64 65 66 20 52 4e 45 53 43 41 ┆*/ CAL : I_BLANK; #ifdef RNESCA┆ 0x04f200…09e600 50 45 53 0a 09 69 66 20 28 66 6d 74 20 3d 3d 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 0a 09 20 ┆PES if (fmt == (char *)NULL) ┆ 0x04f200…09e600 20 20 20 66 6d 74 20 3d 20 67 65 74 65 6e 76 28 22 53 55 42 4a 4c 49 4e 45 22 29 3b 0a 0a 09 69 ┆ fmt = getenv("SUBJLINE"); i┆ 0x04f200…09e600 66 20 28 66 6d 74 20 21 3d 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 0a 09 7b 0a 09 20 20 20 20 ┆f (fmt != (char *)NULL) { ┆ 0x04f200…09e600 73 65 65 68 65 61 64 65 72 28 26 73 75 62 6a 68 64 72 29 3b 0a 09 20 20 20 20 73 74 72 65 78 70 ┆seeheader(&subjhdr); strexp┆ 0x04f200…09e600 61 6e 64 28 66 6d 74 2c 20 62 75 66 20 2b 20 31 29 3b 0a 09 20 20 20 20 73 65 65 68 65 61 64 65 ┆and(fmt, buf + 1); seeheade┆ 0x04f200…09e600 72 28 26 68 65 61 64 65 72 29 3b 0a 09 7d 0a 09 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 52 ┆r(&header); } else #endif /* R┆ 0x04f200…09e600 4e 45 53 43 41 50 45 53 20 2a 2f 0a 09 7b 0a 09 20 73 72 63 2f 44 2e 6e 65 77 73 2f 68 65 61 64 ┆NESCAPES */ { src/D.news/head┆ 0x04f200…09e600 65 72 2e 63 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆er.c ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆ ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 20 20 20 34 34 34 20 00 20 20 20 ┆ 444 ┆ 0x04f200…09e600 31 34 35 20 00 20 20 20 20 20 31 20 00 20 20 20 20 20 20 35 31 30 31 33 20 20 34 34 36 31 33 30 ┆145 1 51013 446130┆ 0x04f200…09e600 32 32 35 34 20 20 20 37 34 31 37 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆2254 7417 ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆ ┆ […0x9…] 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆ /**************┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆********************************┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 0a ┆****************************** ┆ 0x04f200…09e600 4e 41 4d 45 0a 20 20 20 68 65 61 64 65 72 2e 63 20 2d 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 ┆NAME header.c - functions to ┆ 0x04f200…09e600 72 65 61 64 20 61 6e 64 20 77 72 69 74 65 20 6e 65 74 6e 65 77 73 27 73 20 52 46 43 2d 31 30 33 ┆read and write netnews's RFC-103┆ 0x04f200…09e600 36 20 68 65 61 64 65 72 73 0a 0a 53 59 4e 4f 50 53 49 53 0a 20 20 20 23 69 6e 63 6c 75 64 65 20 ┆6 headers SYNOPSIS #include ┆ 0x04f200…09e600 22 68 65 61 64 65 72 2e 68 22 0a 0a 20 20 20 76 6f 69 64 20 68 66 72 65 65 28 68 70 29 09 09 09 ┆"header.h" void hfree(hp) ┆ 0x04f200…09e600 2d 2d 20 66 72 65 65 20 73 74 6f 72 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20 ┆-- free store associated with a ┆ 0x04f200…09e600 68 65 61 64 65 72 0a 20 20 20 68 64 72 5f 74 20 2a 68 70 3b 0a 0a 20 20 20 69 6e 74 20 68 72 65 ┆header hdr_t *hp; int hre┆ 0x04f200…09e600 61 64 28 68 70 2c 20 6d 61 78 73 69 7a 65 2c 20 66 70 29 09 09 2d 2d 20 72 65 61 64 20 61 20 68 ┆ad(hp, maxsize, fp) -- read a h┆ 0x04f200…09e600 65 61 64 65 72 20 69 6e 74 6f 20 63 6f 72 65 0a 20 20 20 68 64 72 5f 74 20 2a 68 70 3b 20 69 6e ┆eader into core hdr_t *hp; in┆ 0x04f200…09e600 74 20 6d 61 78 73 69 7a 65 3b 20 46 49 4c 45 20 2a 66 70 3b 0a 0a 20 20 20 76 6f 69 64 20 68 77 ┆t maxsize; FILE *fp; void hw┆ 0x04f200…09e600 72 69 74 65 28 68 70 2c 20 66 70 2c 20 77 72 29 09 09 2d 2d 20 77 72 69 74 65 20 61 20 68 65 61 ┆rite(hp, fp, wr) -- write a hea┆ 0x04f200…09e600 64 65 72 20 74 6f 20 61 20 66 69 6c 65 2c 20 42 20 66 6f 72 6d 61 74 0a 20 20 20 68 64 72 5f 74 ┆der to a file, B format hdr_t┆ 0x04f200…09e600 20 2a 68 70 3b 20 46 49 4c 45 20 2a 66 70 3b 20 69 6e 74 20 77 72 3b 0a 0a 20 20 20 63 68 61 72 ┆ *hp; FILE *fp; int wr; char┆ 0x04f200…09e600 20 2a 68 6c 67 65 74 28 68 6e 61 6d 65 29 09 09 09 2d 2d 20 72 65 74 75 72 6e 20 63 6f 6e 74 65 ┆ *hlget(hname) -- return conte┆ 0x04f200…09e600 6e 74 73 20 6f 66 20 61 20 6e 61 6d 65 64 20 68 65 61 64 65 72 0a 20 20 20 63 68 61 72 20 2a 68 ┆nts of a named header char *h┆ 0x04f200…09e600 6e 61 6d 65 3b 0a 0a 20 20 20 76 6f 69 64 20 68 61 70 70 65 6e 64 28 68 70 2c 20 63 70 29 09 09 ┆name; void happend(hp, cp) ┆ 0x04f200…09e600 2d 2d 20 63 6f 6e 63 61 74 20 63 70 20 74 6f 20 74 68 65 20 68 65 61 64 65 72 0a 20 20 20 68 64 ┆-- concat cp to the header hd┆ 0x04f200…09e600 72 5f 74 20 2a 68 70 3b 20 63 68 61 72 20 2a 63 70 3b 0a 0a 20 20 20 63 68 61 72 20 2a 74 61 69 ┆r_t *hp; char *cp; char *tai┆ 0x04f200…09e600 6c 70 61 74 68 28 68 70 29 09 09 09 2d 2d 20 65 78 74 72 61 63 74 20 61 20 73 68 6f 72 74 20 6e ┆lpath(hp) -- extract a short n┆ 0x04f200…09e600 61 6d 65 20 6f 66 20 74 68 65 20 73 65 6e 64 65 72 0a 20 20 20 68 64 72 5f 74 20 2a 68 70 3b 0a ┆ame of the sender hdr_t *hp; ┆ 0x04f200…09e600 0a 44 45 53 43 52 49 50 54 49 4f 4e 0a 20 20 20 54 68 65 20 68 72 65 61 64 28 29 20 66 75 6e 63 ┆ DESCRIPTION The hread() func┆ 0x04f200…09e600 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 6e 20 69 6e 74 65 67 65 72 20 63 6f 75 6e 74 20 6f 66 ┆tion returns an integer count of┆ 0x04f200…09e600 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e 20 54 68 69 73 0a 63 6f 75 6e 74 ┆ bytes in the header. This count┆ 0x04f200…09e600 20 72 65 66 6c 65 63 74 73 20 74 68 65 20 73 69 7a 65 20 2a 62 65 66 6f 72 65 2a 20 63 6f 6e 74 ┆ reflects the size *before* cont┆ 0x04f200…09e600 72 6f 6c 2d 63 68 61 72 61 63 74 65 72 20 69 6e 74 65 72 70 72 65 74 61 74 69 6f 6e 20 61 6e 64 ┆rol-character interpretation and┆ 0x04f200…09e600 20 6c 6f 6e 67 2d 0a 6c 69 6e 65 20 74 72 75 6e 63 61 74 69 6f 6e 20 72 61 74 68 65 72 20 74 68 ┆ long- line truncation rather th┆ 0x04f200…09e600 61 6e 20 74 68 65 20 73 69 7a 65 20 69 6e 20 63 6f 72 65 3b 20 69 74 20 69 73 20 69 6e 74 65 6e ┆an the size in core; it is inten┆ 0x04f200…09e600 64 65 64 20 66 6f 72 20 74 68 65 20 75 73 65 20 6f 66 0a 75 6e 62 61 74 63 68 69 6e 67 20 63 6f ┆ded for the use of unbatching co┆ 0x04f200…09e600 64 65 2e 0a 20 20 20 49 66 20 74 68 65 20 28 6c 6f 6e 67 29 20 73 65 63 6f 6e 64 20 61 72 67 75 ┆de. If the (long) second argu┆ 0x04f200…09e600 6d 65 6e 74 20 6f 66 20 68 72 65 61 64 28 29 20 69 73 20 6e 6f 6e 7a 65 72 6f 2c 20 74 68 65 20 ┆ment of hread() is nonzero, the ┆ 0x04f200…09e600 72 65 61 64 20 77 69 6c 6c 20 61 62 6f 72 74 0a 69 66 20 69 74 20 67 6f 65 73 20 6f 76 65 72 20 ┆read will abort if it goes over ┆ 0x04f200…09e600 74 68 61 74 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63 74 65 72 73 20 77 69 74 68 6f 75 ┆that number of characters withou┆ 0x04f200…09e600 74 20 72 65 63 6f 67 6e 69 7a 69 6e 67 20 61 20 66 75 6c 6c 20 68 65 61 64 65 72 2e 0a 0a 20 20 ┆t recognizing a full header. ┆ 0x04f200…09e600 20 54 68 65 20 68 77 72 69 74 65 28 29 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65 73 20 6e 65 ┆ The hwrite() function writes ne┆ 0x04f200…09e600 77 73 20 68 65 61 64 65 72 73 20 74 6f 20 61 6e 20 6f 75 74 70 75 74 20 73 74 72 65 61 6d 2e 0a ┆ws headers to an output stream. ┆ 0x04f200…09e600 20 20 20 49 66 20 74 68 65 20 28 62 6f 6f 6c 65 61 6e 29 20 74 68 69 72 64 20 61 72 67 75 6d 65 ┆ If the (boolean) third argume┆ 0x04f200…09e600 6e 74 20 6f 66 20 68 77 72 69 74 65 28 29 20 69 73 20 74 72 75 65 2c 20 74 68 65 20 52 65 63 65 ┆nt of hwrite() is true, the Rece┆ 0x04f200…09e600 69 70 74 2d 44 61 74 65 0a 68 65 61 64 65 72 20 77 69 6c 6c 20 62 65 20 77 72 69 74 74 65 6e 20 ┆ipt-Date header will be written ┆ 0x04f200…09e600 6f 75 74 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20 6f 74 68 65 72 73 2e 0a 20 20 20 41 20 ┆out along with the others. A ┆ 0x04f200…09e600 68 65 61 64 65 72 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 6e 6f 6e 2d 62 6c 61 6e 6b ┆header that contains a non-blank┆ 0x04f200…09e600 20 54 6f 3a 20 66 69 65 6c 64 20 69 73 20 70 72 65 73 75 6d 65 64 20 74 6f 20 68 61 76 65 20 62 ┆ To: field is presumed to have b┆ 0x04f200…09e600 65 65 6e 0a 63 6f 6e 73 74 72 75 63 74 65 64 20 66 6f 72 20 75 73 65 20 69 6e 20 61 20 6d 61 69 ┆een constructed for use in a mai┆ 0x04f200…09e600 6c 20 72 65 70 6c 79 2e 20 54 68 65 20 70 61 74 68 20 68 65 61 64 65 72 2c 20 69 66 20 70 72 65 ┆l reply. The path header, if pre┆ 0x04f200…09e600 73 65 6e 74 2c 20 77 69 6c 6c 20 62 65 0a 70 72 69 6e 74 65 64 20 77 69 74 68 20 61 20 22 4e 65 ┆sent, will be printed with a "Ne┆ 0x04f200…09e600 77 73 2d 50 61 74 68 3a 22 20 6c 61 62 65 6c 2c 20 61 6e 64 20 74 68 65 20 72 65 66 65 72 65 6e ┆ws-Path:" label, and the referen┆ 0x04f200…09e600 63 65 73 20 68 65 61 64 65 72 20 77 69 6c 6c 20 62 65 20 70 72 69 6e 74 65 64 0a 77 69 74 68 20 ┆ces header will be printed with ┆ 0x04f200…09e600 61 6e 20 22 49 6e 2d 52 65 70 6c 79 2d 54 6f 3a 22 20 6c 61 62 65 6c 2e 0a 20 20 20 22 54 6f 3a ┆an "In-Reply-To:" label. "To:┆ 0x04f200…09e600 22 2c 20 22 43 63 3a 22 20 61 6e 64 20 22 42 63 63 3a 22 20 61 72 65 20 61 6c 6c 20 63 6f 6e 63 ┆", "Cc:" and "Bcc:" are all conc┆ 0x04f200…09e600 61 74 65 6e 61 74 65 64 20 74 6f 20 74 68 65 20 54 6f 3a 20 68 65 61 64 65 72 20 6f 6e 20 69 6e ┆atenated to the To: header on in┆ 0x04f200…09e600 70 75 74 2e 0a 20 20 20 22 53 74 61 74 75 73 3a 20 22 20 68 65 61 64 65 72 73 20 28 73 75 63 68 ┆put. "Status: " headers (such┆ 0x04f200…09e600 20 61 73 20 61 72 65 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 42 53 44 20 4d 61 69 6c 20 61 6e ┆ as are generated by BSD Mail an┆ 0x04f200…09e600 64 20 41 54 26 54 20 6d 61 69 6c 78 29 20 61 72 65 0a 69 67 6e 6f 72 65 64 2e 20 53 6f 20 61 72 ┆d AT&T mailx) are ignored. So ar┆ 0x04f200…09e600 65 20 74 68 65 20 52 65 6c 61 79 2d 56 65 72 73 69 6f 6e 2c 20 50 6f 73 74 69 6e 67 2d 56 65 72 ┆e the Relay-Version, Posting-Ver┆ 0x04f200…09e600 73 69 6f 6e 2c 20 61 6e 64 20 58 72 65 66 20 68 65 61 64 65 72 73 20 6f 66 20 6f 6c 64 65 72 0a ┆sion, and Xref headers of older ┆ 0x04f200…09e600 6e 65 77 73 20 76 65 72 73 69 6f 6e 73 20 28 74 68 6f 75 67 68 20 58 72 65 66 20 63 61 6e 20 62 ┆news versions (though Xref can b┆ 0x04f200…09e600 65 20 72 65 2d 65 6e 61 62 6c 65 64 20 77 69 74 68 20 74 68 65 20 44 4f 58 52 45 46 53 20 6f 70 ┆e re-enabled with the DOXREFS op┆ 0x04f200…09e600 74 69 6f 6e 29 2e 0a 0a 20 20 20 54 68 65 20 69 6e 74 65 72 61 63 74 69 6f 6e 20 62 65 74 77 65 ┆tion). The interaction betwe┆ 0x04f200…09e600 65 6e 20 74 68 65 20 69 6e 74 65 67 65 72 20 61 6e 64 20 73 74 72 69 6e 67 20 66 6f 72 6d 73 20 ┆en the integer and string forms ┆ 0x04f200…09e600 6f 66 20 74 68 65 20 70 6f 73 74 2d 64 61 74 65 20 61 6e 64 0a 65 78 70 69 72 65 2d 64 61 74 65 ┆of the post-date and expire-date┆ 0x04f200…09e600 20 66 69 65 6c 64 73 20 6f 62 65 79 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 75 6c 65 ┆ fields obeys the following rule┆ 0x04f200…09e600 73 3a 0a 0a 20 20 20 31 29 20 57 68 65 6e 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 73 74 72 ┆s: 1) When either of the str┆ 0x04f200…09e600 69 6e 67 20 66 69 65 6c 64 73 20 69 73 20 70 69 63 6b 65 64 20 75 70 20 62 79 20 61 6e 20 68 72 ┆ing fields is picked up by an hr┆ 0x04f200…09e600 65 61 64 28 29 20 74 68 65 0a 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 69 6d 65 5f 74 20 64 ┆ead() the corresponding time_t d┆ 0x04f200…09e600 65 72 69 76 65 64 20 66 69 65 6c 64 20 69 73 20 73 65 74 2e 0a 20 20 20 32 29 20 54 68 65 73 65 ┆erived field is set. 2) These┆ 0x04f200…09e600 20 66 69 65 6c 64 73 20 61 72 65 20 61 6c 77 61 79 73 20 70 72 69 6e 74 65 64 20 66 72 6f 6d 20 ┆ fields are always printed from ┆ 0x04f200…09e600 74 68 65 69 72 20 74 69 6d 65 5f 74 20 66 6f 72 6d 73 2e 0a 20 20 20 33 29 20 49 66 20 74 68 65 ┆their time_t forms. 3) If the┆ 0x04f200…09e600 20 64 61 74 65 20 66 69 65 6c 64 20 69 73 20 6e 6f 74 20 69 6e 20 61 20 66 6f 72 6d 61 74 20 74 ┆ date field is not in a format t┆ 0x04f200…09e600 68 61 74 20 67 65 74 64 61 74 65 28 29 20 72 65 63 6f 67 6e 69 7a 65 73 2c 20 74 68 65 0a 69 6e ┆hat getdate() recognizes, the in┆ 0x04f200…09e600 74 65 67 65 72 20 66 6f 72 6d 20 77 69 6c 6c 20 62 65 20 46 41 49 4c 2c 20 70 72 6f 62 61 62 6c ┆teger form will be FAIL, probabl┆ 0x04f200…09e600 79 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 32 33 3a 35 39 20 44 65 63 20 33 31 20 ┆y corresponding to 23:59 Dec 31 ┆ 0x04f200…09e600 31 39 36 39 2e 0a 54 68 65 20 68 77 72 69 74 65 28 29 20 63 6f 64 65 20 72 65 63 6f 67 6e 69 7a ┆1969. The hwrite() code recogniz┆ 0x04f200…09e600 65 73 20 74 68 69 73 20 73 69 74 75 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 44 61 74 65 20 66 ┆es this situation for the Date f┆ 0x04f200…09e600 69 65 6c 64 2c 20 70 72 69 6e 74 73 0a 6f 75 74 20 74 69 6d 65 20 6e 6f 77 2c 20 61 6e 64 20 77 ┆ield, prints out time now, and w┆ 0x04f200…09e600 72 69 74 65 73 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 62 61 64 20 64 61 74 65 20 61 73 20 74 ┆rites the original bad date as t┆ 0x04f200…09e600 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 68 65 61 64 65 72 0a 63 61 6c 6c 65 64 20 27 58 ┆he content of a header called 'X┆ 0x04f200…09e600 2d 55 6e 70 61 72 73 61 62 6c 65 2d 44 61 74 65 27 2e 20 54 68 69 73 20 69 73 20 61 20 6b 6c 75 ┆-Unparsable-Date'. This is a klu┆ 0x04f200…09e600 67 65 20 62 75 74 20 61 74 20 6c 65 61 73 74 20 65 6e 61 62 6c 65 73 20 65 72 72 6f 72 73 20 66 ┆ge but at least enables errors f┆ 0x04f200…09e600 72 6f 6d 0a 74 68 69 6e 67 73 20 6c 69 6b 65 20 74 68 65 20 62 72 6f 6b 65 6e 20 42 49 54 4e 45 ┆rom things like the broken BITNE┆ 0x04f200…09e600 54 20 6d 61 69 6c 65 72 20 66 6f 72 6d 61 74 73 20 74 6f 20 67 65 74 20 64 65 74 65 63 74 65 64 ┆T mailer formats to get detected┆ 0x04f200…09e600 2e 0a 0a 20 20 20 54 68 75 73 2c 20 74 68 65 20 73 74 72 69 6e 67 20 66 6f 72 6d 73 20 61 72 65 ┆. Thus, the string forms are┆ 0x04f200…09e600 20 75 73 65 66 75 6c 20 62 61 73 69 63 61 6c 6c 79 20 6f 6e 6c 79 20 66 6f 72 20 63 68 65 63 6b ┆ useful basically only for check┆ 0x04f200…09e600 69 6e 67 20 74 68 61 74 20 61 0a 76 61 6c 69 64 20 76 61 6c 75 65 20 68 61 73 20 62 65 65 6e 20 ┆ing that a valid value has been ┆ 0x04f200…09e600 72 65 61 64 2c 20 61 6e 64 20 69 74 20 73 75 66 66 69 63 65 73 20 74 6f 20 73 65 74 20 74 68 65 ┆read, and it suffices to set the┆ 0x04f200…09e600 20 74 69 6d 65 5f 74 20 66 69 65 6c 64 73 0a 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20 61 20 ┆ time_t fields before writing a ┆ 0x04f200…09e600 68 65 61 64 65 72 2e 0a 0a 20 20 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 68 5f 65 6e 64 6f ┆header. Note that the h_endo┆ 0x04f200…09e600 66 66 20 66 69 65 6c 64 20 69 73 20 73 65 74 20 74 6f 20 28 6f 66 66 5f 74 29 30 20 62 79 20 68 ┆ff field is set to (off_t)0 by h┆ 0x04f200…09e600 72 65 61 64 28 29 2c 20 6e 6f 74 20 74 6f 20 74 68 65 0a 61 72 74 69 63 6c 65 27 73 20 61 63 74 ┆read(), not to the article's act┆ 0x04f200…09e600 75 61 6c 20 6c 65 6e 67 74 68 2e 20 43 6f 64 65 20 74 68 61 74 20 75 73 65 73 20 68 65 61 64 65 ┆ual length. Code that uses heade┆ 0x04f200…09e600 72 73 20 73 68 6f 75 6c 64 20 61 73 73 75 6d 65 20 74 68 61 74 20 61 6e 20 28 6f 66 66 5f 74 29 ┆rs should assume that an (off_t)┆ 0x04f200…09e600 30 0a 69 6e 20 74 68 61 74 20 66 69 65 6c 64 20 6d 65 61 6e 73 20 74 68 65 20 6d 65 73 73 61 67 ┆0 in that field means the messag┆ 0x04f200…09e600 65 20 74 65 78 74 20 72 75 6e 73 20 74 6f 20 45 4f 46 2e 0a 0a 20 20 20 53 65 65 20 63 6f 6d 6d ┆e text runs to EOF. See comm┆ 0x04f200…09e600 65 6e 74 73 20 69 6e 20 74 68 65 20 63 6f 64 65 20 66 6f 72 20 6d 6f 72 65 20 64 65 74 61 69 6c ┆ents in the code for more detail┆ 0x04f200…09e600 73 2e 0a 0a 4e 4f 54 45 53 0a 20 20 20 54 68 65 20 68 72 65 61 64 28 29 20 66 75 6e 63 74 69 6f ┆s. NOTES The hread() functio┆ 0x04f200…09e600 6e 20 2a 64 6f 65 73 2a 20 6d 75 6e 67 20 72 65 61 64 2d 69 6e 20 68 65 61 64 65 72 73 2e 20 20 ┆n *does* mung read-in headers. ┆ 0x04f200…09e600 49 74 20 64 69 73 63 61 72 64 73 20 74 68 65 0a 6f 6c 64 20 52 65 6c 61 79 2d 56 65 72 73 69 6f ┆It discards the old Relay-Versio┆ 0x04f200…09e600 6e 2c 20 50 6f 73 74 69 6e 67 2d 56 65 72 73 69 6f 6e 2c 20 61 6e 64 20 28 69 66 20 44 4f 58 52 ┆n, Posting-Version, and (if DOXR┆ 0x04f200…09e600 45 46 53 20 69 73 20 6f 66 66 29 20 58 72 65 66 20 68 65 61 64 65 72 73 2e 0a 49 74 20 6e 6f 20 ┆EFS is off) Xref headers. It no ┆ 0x04f200…09e600 6c 6f 6e 67 65 72 20 66 6f 72 63 65 73 20 6d 65 73 73 61 67 65 2d 69 64 27 73 20 74 6f 20 6c 6f ┆longer forces message-id's to lo┆ 0x04f200…09e600 77 65 72 20 63 61 73 65 2e 0a 20 20 20 0a 20 20 20 54 68 65 20 68 77 72 69 74 65 28 29 20 63 6f ┆wer case. The hwrite() co┆ 0x04f200…09e600 64 65 20 70 72 65 70 65 6e 64 73 20 79 6f 75 72 20 6c 6f 63 61 6c 20 73 69 74 65 6e 61 6d 65 20 ┆de prepends your local sitename ┆ 0x04f200…09e600 74 6f 20 74 68 65 20 50 61 74 68 20 69 66 20 69 74 27 73 20 6e 6f 74 0a 61 6c 72 65 61 64 79 20 ┆to the Path if it's not already ┆ 0x04f200…09e600 74 68 65 72 65 2e 20 46 6f 72 20 74 68 69 73 20 74 6f 20 77 6f 72 6b 20 70 72 6f 70 65 72 6c 79 ┆there. For this to work properly┆ 0x04f200…09e600 2c 20 73 69 74 65 6e 61 6d 65 73 28 29 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 63 61 6c ┆, sitenames() must have been cal┆ 0x04f200…09e600 6c 65 64 2e 0a 0a 20 20 20 49 66 20 74 68 65 20 41 4c 4c 4f 43 5f 48 44 52 53 20 64 65 66 69 6e ┆led. If the ALLOC_HDRS defin┆ 0x04f200…09e600 65 20 69 73 20 73 65 74 20 69 6e 20 68 65 61 64 65 72 2e 68 2c 20 74 68 65 20 69 6d 70 6c 65 6d ┆e is set in header.h, the implem┆ 0x04f200…09e600 65 6e 74 61 74 69 6f 6e 20 69 73 0a 63 68 61 6e 67 65 64 20 74 6f 20 75 73 65 20 6d 61 6c 6c 6f ┆entation is changed to use mallo┆ 0x04f200…09e600 63 28 29 65 64 20 6c 69 6e 65 73 20 66 6f 72 20 68 65 61 64 65 72 20 74 65 78 74 20 72 61 74 68 ┆c()ed lines for header text rath┆ 0x04f200…09e600 65 72 20 74 68 61 6e 20 61 20 62 75 6e 63 68 20 6f 66 0a 66 69 78 65 64 2d 6c 65 6e 67 74 68 20 ┆er than a bunch of fixed-length ┆ 0x04f200…09e600 62 75 66 66 65 72 73 2e 20 42 65 20 77 61 72 6e 65 64 20 74 68 61 74 20 74 68 6f 75 67 68 20 6f ┆buffers. Be warned that though o┆ 0x04f200…09e600 74 68 65 72 20 6e 65 77 73 20 6d 6f 64 75 6c 65 73 20 67 65 6e 65 72 61 6c 6c 79 20 75 73 65 0a ┆ther news modules generally use ┆ 0x04f200…09e600 61 6e 20 69 6e 74 65 72 66 61 63 65 20 74 68 61 74 20 68 69 64 65 73 20 74 68 65 20 64 69 66 66 ┆an interface that hides the diff┆ 0x04f200…09e600 65 72 65 6e 63 65 2c 20 74 68 65 20 41 4c 4c 4f 43 5f 48 44 52 53 20 76 65 72 73 69 6f 6e 20 68 ┆erence, the ALLOC_HDRS version h┆ 0x04f200…09e600 61 73 20 6e 6f 74 20 62 65 65 6e 0a 74 65 73 74 65 64 20 69 6e 20 73 6f 6d 65 20 74 69 6d 65 20 ┆as not been tested in some time ┆ 0x04f200…09e600 61 6e 64 20 6d 61 79 20 68 61 76 65 20 62 75 67 73 2e 0a 0a 20 20 20 53 75 70 70 6f 72 74 20 66 ┆and may have bugs. Support f┆ 0x04f200…09e600 6f 72 20 41 20 61 6e 64 20 32 2e 39 20 6e 65 77 73 20 68 65 61 64 65 72 73 20 28 6e 6f 6e 20 52 ┆or A and 2.9 news headers (non R┆ 0x04f200…09e600 46 43 2d 31 30 33 36 29 20 68 61 73 20 62 65 65 6e 20 72 65 6d 6f 76 65 64 2e 0a 0a 52 45 56 49 ┆FC-1036) has been removed. REVI┆ 0x04f200…09e600 53 45 44 20 42 59 0a 20 20 20 45 72 69 63 20 53 2e 20 52 61 79 6d 6f 6e 64 0a 20 20 20 54 68 69 ┆SED BY Eric S. Raymond Thi┆ 0x04f200…09e600 73 20 73 6f 66 74 77 61 72 65 20 69 73 20 43 6f 70 79 72 69 67 68 74 20 28 43 29 20 31 39 38 39 ┆s software is Copyright (C) 1989┆ 0x04f200…09e600 20 62 79 20 45 72 69 63 20 53 2e 20 52 61 79 6d 6f 6e 64 20 66 6f 72 20 74 68 65 20 73 6f 6c 65 ┆ by Eric S. Raymond for the sole┆ 0x04f200…09e600 20 70 75 72 70 6f 73 65 0a 6f 66 20 70 72 6f 74 65 63 74 69 6e 67 20 66 72 65 65 20 72 65 64 69 ┆ purpose of protecting free redi┆ 0x04f200…09e600 73 74 72 69 62 75 74 69 6f 6e 3b 20 73 65 65 20 74 68 65 20 4c 49 43 45 4e 53 45 20 66 69 6c 65 ┆stribution; see the LICENSE file┆ 0x04f200…09e600 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆ for details. *****************┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆********************************┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a ┆****************************/ /*┆ 0x04f200…09e600 4c 49 4e 54 4c 49 42 52 41 52 59 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 6e 65 77 73 2e 68 22 0a ┆LINTLIBRARY*/ #include "news.h" ┆ 0x04f200…09e600 23 69 6e 63 6c 75 64 65 20 22 68 65 61 64 65 72 2e 68 22 0a 0a 68 64 72 5f 74 20 68 65 61 64 65 ┆#include "header.h" hdr_t heade┆ 0x04f200…09e600 72 3b 09 2f 2a 20 67 65 6e 65 72 61 6c 2d 75 73 65 20 68 65 61 64 65 72 20 73 74 72 75 63 74 75 ┆r; /* general-use header structu┆ 0x04f200…09e600 72 65 20 2a 2f 0a 0a 70 72 69 76 61 74 65 20 69 6e 74 20 68 64 72 73 69 7a 65 3b 09 2f 2a 20 74 ┆re */ private int hdrsize; /* t┆ 0x04f200…09e600 72 61 63 6b 20 74 68 65 20 62 79 74 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 68 65 61 64 ┆rack the byte length of the head┆ 0x04f200…09e600 65 72 20 62 65 69 6e 67 20 72 65 61 64 20 2a 2f 0a 70 72 69 76 61 74 65 20 69 6e 74 20 68 64 72 ┆er being read */ private int hdr┆ 0x04f200…09e600 6c 69 6e 65 6e 6f 3b 09 2f 2a 20 74 72 61 63 6b 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 69 6e ┆lineno; /* track the current lin┆ 0x04f200…09e600 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 20 62 65 69 6e 67 20 72 65 61 64 20 2a 2f 0a 0a 76 ┆e of the header being read */ v┆ 0x04f200…09e600 6f 69 64 20 68 66 72 65 65 28 68 70 29 0a 2f 2a 20 46 72 65 65 20 74 68 65 20 61 6c 6c 6f 63 61 ┆oid hfree(hp) /* Free the alloca┆ 0x04f200…09e600 74 65 64 20 73 74 6f 72 61 67 65 20 69 6e 20 61 20 68 65 61 64 65 72 20 62 6c 6f 63 6b 2e 20 2a ┆ted storage in a header block. *┆ 0x04f200…09e600 2f 0a 68 64 72 5f 74 09 2a 68 70 3b 0a 7b 0a 20 20 20 20 69 66 20 28 68 6c 6e 62 6c 61 6e 6b 28 ┆/ hdr_t *hp; { if (hlnblank(┆ 0x04f200…09e600 68 70 2d 3e 68 5f 74 6f 29 29 09 09 68 6c 66 72 65 65 28 68 70 2d 3e 68 5f 74 6f 29 3b 0a 20 20 ┆hp->h_to)) hlfree(hp->h_to); ┆ 0x04f200…09e600 20 20 69 66 20 28 68 6c 6e 62 6c 61 6e 6b 28 68 70 2d 3e 68 5f 70 61 74 68 29 29 09 09 68 6c 66 ┆ if (hlnblank(hp->h_path)) hlf┆ 0x04f200…09e600 72 65 65 28 68 70 2d 3e 68 5f 70 61 74 68 29 3b 0a 20 20 20 20 69 66 20 28 68 6c 6e 62 6c 61 6e ┆ree(hp->h_path); if (hlnblan┆ 0x04f200…09e600 6b 28 68 70 2d 3e 68 5f 66 72 6f 6d 29 29 09 09 68 6c 66 72 65 65 28 68 70 2d 3e 68 5f 66 72 6f ┆k(hp->h_from)) hlfree(hp->h_fro┆ 0x04f200…09e600 6d 29 3b 0a 20 20 20 20 69 66 20 28 68 6c 6e 62 6c 61 6e 6b 28 68 70 2d 3e 68 5f 6e 65 77 73 67 ┆m); if (hlnblank(hp->h_newsg┆ 0x04f200…09e600 72 6f 75 70 73 29 29 09 68 6c 66 72 65 65 28 68 70 2d 3e 68 5f 6e 65 77 73 67 72 6f 75 70 73 29 ┆roups)) hlfree(hp->h_newsgroups)┆ 0x04f200…09e600 3b 0a 20 20 20 20 69 66 20 28 68 6c 6e 62 6c 61 6e 6b 28 68 70 2d 3e 68 5f 73 75 62 6a 65 63 74 ┆; if (hlnblank(hp->h_subject┆ 0x04f200…09e600 29 29 09 09 68 6c 66 72 65 65 28 68 70 2d 3e 68 5f 73 75 62 6a 65 63 74 29 3b 0a 20 20 20 20 69 ┆)) hlfree(hp->h_subject); i┆ 0x04f200…09e600 66 20 28 68 6c 6e 62 6c 61 6e 6b 28 68 70 2d 3e 68 5f 69 64 65 6e 74 29 29 09 09 68 6c 66 72 65 ┆f (hlnblank(hp->h_ident)) hlfre┆ 0x04f200…09e600 65 28 68 70 2d 3e 68 5f 69 64 65 6e 74 29 3b 0a 20 20 20 20 69 66 20 28 68 6c 6e 62 6c 61 6e 6b ┆e(hp->h_ident); if (hlnblank┆ 0x04f200…09e600 28 68 70 2d 3e 68 5f 70 6f 73 74 64 61 74 65 29 29 09 09 68 6c 66 72 65 65 28 68 70 2d 3e 68 5f ┆(hp->h_postdate)) hlfree(hp->h_┆ 0x04f200…09e600 70 6f 73 74 64 61 74 65 29 3b 0a 20 20 20 20 69 66 20 28 68 6c 6e 62 6c 61 6e 6b 28 68 70 2d 3e ┆postdate); if (hlnblank(hp->┆ 0x04f200…09e600 68 5f 65 78 70 64 61 74 65 29 29 09 09 68 6c 66 72 65 65 28 68 70 2d 3e 68 5f 65 78 70 64 61 74 ┆h_expdate)) hlfree(hp->h_expdat┆ 0x04f200…09e600 65 29 3b 0a 20 20 20 20 69 66 20 28 68 6c 6e 62 6c 61 6e 6b 28 68 70 2d 3e 68 5f 72 65 66 65 72 ┆e); if (hlnblank(hp->h_refer┆ 0x04f200…09e600 65 6e 63 65 73 29 29 09 68 6c 66 72 65 65 28 68 70 2d 3e 68 5f 72 65 66 65 72 65 6e 63 65 73 29 ┆ences)) hlfree(hp->h_references)┆ 0x04f200…09e600 3b 0a 20 20 20 20 69 66 20 28 68 6c 6e 62 6c 61 6e 6b 28 68 70 2d 3e 68 5f 63 74 6c 6d 73 67 29 ┆; if (hlnblank(hp->h_ctlmsg)┆ 0x04f200…09e600 29 09 09 68 6c 66 72 65 65 28 68 70 2d 3e 68 5f 63 74 6c 6d 73 67 29 3b 0a 20 20 20 20 69 66 20 ┆) hlfree(hp->h_ctlmsg); if ┆ 0x04f200…09e600 28 68 6c 6e 62 6c 61 6e 6b 28 68 70 2d 3e 68 5f 73 65 6e 64 65 72 29 29 09 09 68 6c 66 72 65 65 ┆(hlnblank(hp->h_sender)) hlfree┆ 0x04f200…09e600 28 68 70 2d 3e 68 5f 73 65 6e 64 65 72 29 3b 0a 20 20 20 20 69 66 20 28 68 6c 6e 62 6c 61 6e 6b ┆(hp->h_sender); if (hlnblank┆ 0x04f200…09e600 28 68 70 2d 3e 68 5f 72 65 70 6c 79 74 6f 29 29 09 09 68 6c 66 72 65 65 28 68 70 2d 3e 68 5f 72 ┆(hp->h_replyto)) hlfree(hp->h_r┆ 0x04f200…09e600 65 70 6c 79 74 6f 29 3b 0a 20 20 20 20 69 66 20 28 68 6c 6e 62 6c 61 6e 6b 28 68 70 2d 3e 68 5f ┆eplyto); if (hlnblank(hp->h_┆ 0x04f200…09e600 66 6f 6c 6c 6f 77 74 6f 29 29 09 09 68 6c 66 72 65 65 28 68 70 2d 3e 68 5f 66 6f 6c 6c 6f 77 74 ┆followto)) hlfree(hp->h_followt┆ 0x04f200…09e600 6f 29 3b 0a 20 20 20 20 69 66 20 28 68 6c 6e 62 6c 61 6e 6b 28 68 70 2d 3e 68 5f 64 69 73 74 72 ┆o); if (hlnblank(hp->h_distr┆ 0x04f200…09e600 69 62 75 74 69 6f 6e 29 29 09 68 6c 66 72 65 65 28 68 70 2d 3e 68 5f 64 69 73 74 72 69 62 75 74 ┆ibution)) hlfree(hp->h_distribut┆ 0x04f200…09e600 69 6f 6e 29 3b 0a 20 20 20 20 69 66 20 28 68 6c 6e 62 6c 61 6e 6b 28 68 70 2d 3e 68 5f 6f 72 67 ┆ion); if (hlnblank(hp->h_org┆ 0x04f200…09e600 61 6e 69 7a 61 74 69 6f 6e 29 29 09 68 6c 66 72 65 65 28 68 70 2d 3e 68 5f 6f 72 67 61 6e 69 7a ┆anization)) hlfree(hp->h_organiz┆ 0x04f200…09e600 61 74 69 6f 6e 29 3b 0a 20 20 20 20 69 66 20 28 68 6c 6e 62 6c 61 6e 6b 28 68 70 2d 3e 68 5f 6b ┆ation); if (hlnblank(hp->h_k┆ 0x04f200…09e600 65 79 77 6f 72 64 73 29 29 09 09 68 6c 66 72 65 65 28 68 70 2d 3e 68 5f 6b 65 79 77 6f 72 64 73 ┆eywords)) hlfree(hp->h_keywords┆ 0x04f200…09e600 29 3b 0a 20 20 20 20 69 66 20 28 68 6c 6e 62 6c 61 6e 6b 28 68 70 2d 3e 68 5f 73 75 6d 6d 61 72 ┆); if (hlnblank(hp->h_summar┆ 0x04f200…09e600 79 29 29 09 09 68 6c 66 72 65 65 28 68 70 2d 3e 68 5f 73 75 6d 6d 61 72 79 29 3b 0a 20 20 20 20 ┆y)) hlfree(hp->h_summary); ┆ 0x04f200…09e600 69 66 20 28 68 6c 6e 62 6c 61 6e 6b 28 68 70 2d 3e 68 5f 61 70 70 72 6f 76 65 64 29 29 09 09 68 ┆if (hlnblank(hp->h_approved)) h┆ 0x04f200…09e600 6c 66 72 65 65 28 68 70 2d 3e 68 5f 61 70 70 72 6f 76 65 64 29 3b 0a 20 20 20 20 69 66 20 28 68 ┆lfree(hp->h_approved); if (h┆ 0x04f200…09e600 6c 6e 62 6c 61 6e 6b 28 68 70 2d 3e 68 5f 73 75 70 65 72 73 65 64 65 73 29 29 09 68 6c 66 72 65 ┆lnblank(hp->h_supersedes)) hlfre┆ 0x04f200…09e600 65 28 68 70 2d 3e 68 5f 73 75 70 65 72 73 65 64 65 73 29 3b 0a 20 20 20 20 69 66 20 28 68 6c 6e ┆e(hp->h_supersedes); if (hln┆ 0x04f200…09e600 62 6c 61 6e 6b 28 68 70 2d 3e 68 5f 63 6f 6e 74 65 6e 74 74 79 70 65 29 29 09 68 6c 66 72 65 65 ┆blank(hp->h_contenttype)) hlfree┆ 0x04f200…09e600 28 68 70 2d 3e 68 5f 63 6f 6e 74 65 6e 74 74 79 70 65 29 3b 0a 23 69 66 64 65 66 20 5a 41 50 4e ┆(hp->h_contenttype); #ifdef ZAPN┆ 0x04f200…09e600 4f 54 45 53 0a 20 20 20 20 69 66 20 28 68 6c 6e 62 6c 61 6e 6b 28 68 70 2d 3e 68 5f 6e 66 66 72 ┆OTES if (hlnblank(hp->h_nffr┆ 0x04f200…09e600 6f 6d 29 29 09 09 68 6c 66 72 65 65 28 68 70 2d 3e 68 5f 6e 66 66 72 6f 6d 29 3b 0a 20 20 20 20 ┆om)) hlfree(hp->h_nffrom); ┆ 0x04f200…09e600 69 66 20 28 68 6c 6e 62 6c 61 6e 6b 28 68 70 2d 3e 68 5f 6e 66 69 64 29 29 09 09 68 6c 66 72 65 ┆if (hlnblank(hp->h_nfid)) hlfre┆ 0x04f200…09e600 65 28 68 70 2d 3e 68 5f 6e 66 69 64 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 5a 41 50 4e 4f 54 45 ┆e(hp->h_nfid); #endif /* ZAPNOTE┆ 0x04f200…09e600 53 20 2a 2f 0a 23 69 66 64 65 66 20 44 4f 58 52 45 46 53 0a 20 20 20 20 69 66 20 28 68 6c 6e 62 ┆S */ #ifdef DOXREFS if (hlnb┆ 0x04f200…09e600 6c 61 6e 6b 28 68 70 2d 3e 68 5f 78 72 65 66 29 29 09 09 68 6c 66 72 65 65 28 68 70 2d 3e 68 5f ┆lank(hp->h_xref)) hlfree(hp->h_┆ 0x04f200…09e600 78 72 65 66 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 44 4f 58 52 45 46 53 20 2a 2f 0a 20 20 20 20 ┆xref); #endif /* DOXREFS */ ┆ 0x04f200…09e600 69 66 20 28 68 6c 6e 62 6c 61 6e 6b 28 68 70 2d 3e 68 5f 62 61 63 6b 72 65 66 73 29 29 09 68 6c ┆if (hlnblank(hp->h_backrefs)) hl┆ 0x04f200…09e600 66 72 65 65 28 68 70 2d 3e 68 5f 62 61 63 6b 72 65 66 73 29 3b 0a 20 20 20 20 69 66 20 28 68 70 ┆free(hp->h_backrefs); if (hp┆ 0x04f200…09e600 2d 3e 68 5f 6f 74 68 65 72 29 0a 20 20 20 20 7b 0a 09 28 76 6f 69 64 29 20 66 72 65 65 28 68 70 ┆->h_other) { (void) free(hp┆ 0x04f200…09e600 2d 3e 68 5f 6f 74 68 65 72 29 3b 0a 09 68 70 2d 3e 68 5f 6f 74 68 65 72 20 3d 20 28 63 68 61 72 ┆->h_other); hp->h_other = (char┆ 0x04f200…09e600 20 2a 29 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 68 70 2d 3e 68 5f 65 78 70 74 69 6d 65 ┆ *)NULL; } hp->h_exptime┆ 0x04f200…09e600 20 3d 20 68 70 2d 3e 68 5f 72 65 63 74 69 6d 65 20 3d 20 68 70 2d 3e 68 5f 70 6f 73 74 74 69 6d ┆ = hp->h_rectime = hp->h_posttim┆ 0x04f200…09e600 65 20 3d 20 28 74 69 6d 65 5f 74 29 20 30 3b 0a 20 20 20 20 68 70 2d 3e 68 5f 69 6e 74 6e 75 6d ┆e = (time_t) 0; hp->h_intnum┆ 0x04f200…09e600 6c 69 6e 65 73 20 3d 20 68 70 2d 3e 68 5f 69 6e 74 70 72 69 6f 72 69 74 79 20 3d 20 30 3b 0a 20 ┆lines = hp->h_intpriority = 0; ┆ 0x04f200…09e600 20 20 20 68 70 2d 3e 68 5f 66 70 20 3d 20 28 46 49 4c 45 20 2a 29 4e 55 4c 4c 3b 0a 20 20 20 20 ┆ hp->h_fp = (FILE *)NULL; ┆ 0x04f200…09e600 68 70 2d 3e 68 5f 73 74 61 72 74 6f 66 66 20 3d 20 68 70 2d 3e 68 5f 65 6e 64 6f 66 66 20 3d 20 ┆hp->h_startoff = hp->h_endoff = ┆ 0x04f200…09e600 68 70 2d 3e 68 5f 74 65 78 74 6f 66 66 20 3d 20 28 6f 66 66 5f 74 29 30 3b 0a 7d 0a 0a 76 6f 69 ┆hp->h_textoff = (off_t)0; } voi┆ 0x04f200…09e600 64 20 68 61 70 70 65 6e 64 28 68 70 2c 20 63 70 29 0a 2f 2a 20 61 64 64 20 74 68 65 20 67 69 76 ┆d happend(hp, cp) /* add the giv┆ 0x04f200…09e600 65 6e 20 6c 69 6e 65 20 74 6f 20 74 68 65 20 70 61 73 73 2d 74 68 72 6f 75 67 68 20 70 61 72 74 ┆en line to the pass-through part┆ 0x04f200…09e600 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 68 65 61 64 65 72 20 2a 2f 0a 68 64 72 5f 74 09 2a 68 ┆ of the given header */ hdr_t *h┆ 0x04f200…09e600 70 3b 0a 63 68 61 72 09 2a 63 70 3b 0a 7b 0a 20 20 20 20 63 68 61 72 20 20 20 20 2a 75 6e 72 65 ┆p; char *cp; { char *unre┆ 0x04f200…09e600 63 3b 0a 20 20 20 20 69 6e 74 20 20 20 20 20 6f 6c 64 73 69 7a 65 20 3d 20 68 70 2d 3e 68 5f 6f ┆c; int oldsize = hp->h_o┆ 0x04f200…09e600 74 68 65 72 20 3f 20 73 74 72 6c 65 6e 28 68 70 2d 3e 68 5f 6f 74 68 65 72 29 20 3a 20 30 3b 0a ┆ther ? strlen(hp->h_other) : 0; ┆ 0x04f200…09e600 20 20 20 20 69 6e 74 20 20 20 20 20 6e 65 77 73 69 7a 65 20 3d 20 6f 6c 64 73 69 7a 65 20 2b 20 ┆ int newsize = oldsize + ┆ 0x04f200…09e600 73 74 72 6c 65 6e 28 63 70 29 20 2b 20 32 3b 0a 0a 20 20 20 20 69 66 20 28 28 75 6e 72 65 63 20 ┆strlen(cp) + 2; if ((unrec ┆ 0x04f200…09e600 3d 20 6d 61 6c 6c 6f 63 28 28 75 6e 73 69 67 6e 65 64 29 6e 65 77 73 69 7a 65 29 29 20 21 3d 20 ┆= malloc((unsigned)newsize)) != ┆ 0x04f200…09e600 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 0a 20 20 20 20 7b 0a 09 69 66 20 28 6f 6c 64 73 69 7a 65 ┆(char *)NULL) { if (oldsize┆ 0x04f200…09e600 20 3d 3d 20 30 29 0a 09 20 20 20 20 75 6e 72 65 63 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 09 65 6c ┆ == 0) unrec[0] = '\0'; el┆ 0x04f200…09e600 73 65 0a 09 7b 0a 09 20 20 20 20 28 76 6f 69 64 29 20 73 74 72 63 70 79 28 75 6e 72 65 63 2c 20 ┆se { (void) strcpy(unrec, ┆ 0x04f200…09e600 68 70 2d 3e 68 5f 6f 74 68 65 72 29 3b 0a 09 20 20 20 20 28 76 6f 69 64 29 20 66 72 65 65 28 68 ┆hp->h_other); (void) free(h┆ 0x04f200…09e600 70 2d 3e 68 5f 6f 74 68 65 72 29 3b 0a 09 7d 0a 09 28 76 6f 69 64 29 20 73 74 72 63 61 74 28 75 ┆p->h_other); } (void) strcat(u┆ 0x04f200…09e600 6e 72 65 63 2c 20 63 70 29 3b 0a 09 28 76 6f 69 64 29 20 73 74 72 63 61 74 28 75 6e 72 65 63 2c ┆nrec, cp); (void) strcat(unrec,┆ 0x04f200…09e600 20 22 5c 6e 22 29 3b 0a 09 68 70 2d 3e 68 5f 6f 74 68 65 72 20 3d 20 75 6e 72 65 63 3b 0a 20 20 ┆ "\n"); hp->h_other = unrec; ┆ 0x04f200…09e600 20 20 7d 0a 7d 0a 0a 2f 2a 20 6f 72 64 69 6e 61 6c 20 76 61 6c 75 65 73 20 66 6f 72 20 68 65 61 ┆ } } /* ordinal values for hea┆ 0x04f200…09e600 64 65 72 20 66 69 65 6c 64 73 2c 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 79 70 65 28 29 20 2a ┆der fields, returned by type() *┆ 0x04f200…09e600 2f 0a 23 64 65 66 69 6e 65 20 49 47 4e 4f 52 45 09 09 30 0a 23 64 65 66 69 6e 65 20 54 4f 09 09 ┆/ #define IGNORE 0 #define TO ┆ 0x04f200…09e600 31 0a 23 64 65 66 69 6e 65 20 43 43 09 09 32 0a 23 64 65 66 69 6e 65 20 50 41 54 48 09 09 33 0a ┆1 #define CC 2 #define PATH 3 ┆ 0x04f200…09e600 23 64 65 66 69 6e 65 20 46 52 4f 4d 20 09 09 34 0a 23 64 65 66 69 6e 65 20 4e 45 57 53 47 52 4f ┆#define FROM 4 #define NEWSGRO┆ 0x04f200…09e600 55 50 20 09 35 0a 23 64 65 66 69 6e 65 20 53 55 42 4a 45 43 54 20 09 36 0a 23 64 65 66 69 6e 65 ┆UP 5 #define SUBJECT 6 #define┆ 0x04f200…09e600 20 4d 45 53 53 41 47 45 49 44 09 37 0a 23 64 65 66 69 6e 65 20 50 4f 53 54 44 41 54 45 09 38 0a ┆ MESSAGEID 7 #define POSTDATE 8 ┆ 0x04f200…09e600 23 64 65 66 69 6e 65 20 52 45 43 45 49 56 45 44 09 39 0a 23 64 65 66 69 6e 65 20 45 58 50 49 52 ┆#define RECEIVED 9 #define EXPIR┆ 0x04f200…09e600 45 44 41 54 45 09 31 30 0a 23 64 65 66 69 6e 65 20 52 45 46 45 52 45 4e 43 45 53 09 31 31 0a 23 ┆EDATE 10 #define REFERENCES 11 #┆ 0x04f200…09e600 64 65 66 69 6e 65 20 43 4f 4e 54 52 4f 4c 09 09 31 32 0a 23 64 65 66 69 6e 65 20 53 45 4e 44 45 ┆define CONTROL 12 #define SENDE┆ 0x04f200…09e600 52 09 09 31 33 0a 23 64 65 66 69 6e 65 20 52 45 50 4c 59 54 4f 09 09 31 34 0a 23 64 65 66 69 6e ┆R 13 #define REPLYTO 14 #defin┆ 0x04f200…09e600 65 20 46 4f 4c 4c 4f 57 54 4f 09 31 35 0a 23 64 65 66 69 6e 65 20 44 49 53 54 52 49 42 55 54 49 ┆e FOLLOWTO 15 #define DISTRIBUTI┆ 0x04f200…09e600 4f 4e 09 31 36 0a 23 75 6e 64 65 66 20 4f 52 47 41 4e 49 5a 41 54 49 4f 4e 0a 23 64 65 66 69 6e ┆ON 16 #undef ORGANIZATION #defin┆ 0x04f200…09e600 65 20 4f 52 47 41 4e 49 5a 41 54 49 4f 4e 09 31 37 0a 23 64 65 66 69 6e 65 20 4e 55 4d 4c 49 4e ┆e ORGANIZATION 17 #define NUMLIN┆ 0x04f200…09e600 45 53 09 31 38 0a 23 64 65 66 69 6e 65 20 4b 45 59 57 4f 52 44 53 09 31 39 0a 23 64 65 66 69 6e ┆ES 18 #define KEYWORDS 19 #defin┆ 0x04f200…09e600 65 20 53 55 4d 4d 41 52 59 09 09 32 30 0a 23 64 65 66 69 6e 65 20 50 52 49 4f 52 49 54 59 09 32 ┆e SUMMARY 20 #define PRIORITY 2┆ 0x04f200…09e600 31 0a 23 64 65 66 69 6e 65 20 41 50 50 52 4f 56 45 44 09 32 32 0a 23 64 65 66 69 6e 65 20 53 55 ┆1 #define APPROVED 22 #define SU┆ 0x04f200…09e600 50 45 52 53 45 44 45 53 09 32 33 0a 23 64 65 66 69 6e 65 20 43 4f 4e 54 45 4e 54 54 59 50 45 09 ┆PERSEDES 23 #define CONTENTTYPE ┆ 0x04f200…09e600 32 34 0a 23 64 65 66 69 6e 65 20 4e 46 49 44 09 09 32 35 0a 23 64 65 66 69 6e 65 20 4e 46 46 52 ┆24 #define NFID 25 #define NFFR┆ 0x04f200…09e600 4f 4d 09 09 32 36 0a 23 64 65 66 69 6e 65 20 58 52 45 46 09 09 32 37 0a 23 64 65 66 69 6e 65 20 ┆OM 26 #define XREF 27 #define ┆ 0x04f200…09e600 42 41 43 4b 52 45 46 53 09 32 38 0a 23 64 65 66 69 6e 65 20 4f 54 48 45 52 09 09 39 39 0a 0a 74 ┆BACKREFS 28 #define OTHER 99 t┆ 0x04f200…09e600 79 70 65 64 65 66 20 73 74 72 75 63 74 20 7b 63 68 61 72 20 2a 68 6e 61 6d 65 3b 20 69 6e 74 20 ┆ypedef struct {char *hname; int ┆ 0x04f200…09e600 68 76 61 6c 3b 20 63 68 61 72 20 2a 6f 66 66 73 65 74 3b 7d 20 73 79 6d 62 6f 6c 3b 0a 73 74 61 ┆hval; char *offset;} symbol; sta┆ 0x04f200…09e600 74 69 63 20 73 79 6d 62 6f 6c 20 68 65 61 64 65 72 73 5b 5d 20 3d 0a 7b 0a 09 7b 22 41 70 70 72 ┆tic symbol headers[] = { {"Appr┆ 0x04f200…09e600 6f 76 65 64 3a 22 2c 09 09 41 50 50 52 4f 56 45 44 2c 09 68 65 61 64 65 72 2e 68 5f 61 70 70 72 ┆oved:", APPROVED, header.h_appr┆ 0x04f200…09e600 6f 76 65 64 7d 2c 0a 09 7b 22 42 61 63 6b 2d 52 65 66 65 72 65 6e 63 65 73 3a 22 2c 09 42 41 43 ┆oved}, {"Back-References:", BAC┆ 0x04f200…09e600 4b 52 45 46 53 2c 09 68 65 61 64 65 72 2e 68 5f 62 61 63 6b 72 65 66 73 7d 2c 0a 09 7b 22 42 63 ┆KREFS, header.h_backrefs}, {"Bc┆ 0x04f200…09e600 63 3a 22 2c 09 09 54 4f 2c 09 09 28 63 68 61 72 20 2a 29 4e 55 4c 4c 7d 2c 0a 09 7b 22 43 63 3a ┆c:", TO, (char *)NULL}, {"Cc:┆ 0x04f200…09e600 22 2c 09 09 09 54 4f 2c 09 09 28 63 68 61 72 20 2a 29 4e 55 4c 4c 7d 2c 0a 09 7b 22 43 6f 6e 74 ┆", TO, (char *)NULL}, {"Cont┆ 0x04f200…09e600 65 6e 74 2d 54 79 70 65 3a 22 2c 09 43 4f 4e 54 45 4e 54 54 59 50 45 2c 09 68 65 61 64 65 72 2e ┆ent-Type:", CONTENTTYPE, header.┆ 0x04f200…09e600 68 5f 63 6f 6e 74 65 6e 74 74 79 70 65 7d 2c 0a 09 7b 22 43 6f 6e 74 72 6f 6c 3a 22 2c 09 09 43 ┆h_contenttype}, {"Control:", C┆ 0x04f200…09e600 4f 4e 54 52 4f 4c 2c 09 68 65 61 64 65 72 2e 68 5f 63 74 6c 6d 73 67 7d 2c 0a 09 7b 22 44 61 74 ┆ONTROL, header.h_ctlmsg}, {"Dat┆ 0x04f200…09e600 65 2d 52 65 63 65 69 76 65 64 3a 22 2c 09 52 45 43 45 49 56 45 44 2c 09 28 63 68 61 72 20 2a 29 ┆e-Received:", RECEIVED, (char *)┆ 0x04f200…09e600 4e 55 4c 4c 7d 2c 0a 09 7b 22 44 61 74 65 3a 22 2c 09 09 50 4f 53 54 44 41 54 45 2c 09 68 65 61 ┆NULL}, {"Date:", POSTDATE, hea┆ 0x04f200…09e600 64 65 72 2e 68 5f 70 6f 73 74 64 61 74 65 7d 2c 0a 09 7b 22 44 69 73 74 72 69 62 75 74 69 6f 6e ┆der.h_postdate}, {"Distribution┆ 0x04f200…09e600 3a 22 2c 09 44 49 53 54 52 49 42 55 54 49 4f 4e 2c 09 68 65 61 64 65 72 2e 68 5f 64 69 73 74 72 ┆:", DISTRIBUTION, header.h_distr┆ 0x04f200…09e600 69 62 75 74 69 6f 6e 7d 2c 0a 09 7b 22 45 78 70 69 72 65 73 3a 22 2c 09 09 45 58 50 49 52 45 44 ┆ibution}, {"Expires:", EXPIRED┆ 0x04f200…09e600 41 54 45 2c 09 28 63 68 61 72 20 2a 29 4e 55 4c 4c 7d 2c 0a 09 7b 22 46 6f 6c 6c 6f 77 75 70 2d ┆ATE, (char *)NULL}, {"Followup-┆ 0x04f200…09e600 54 6f 3a 22 2c 09 46 4f 4c 4c 4f 57 54 4f 2c 09 68 65 61 64 65 72 2e 68 5f 66 6f 6c 6c 6f 77 74 ┆To:", FOLLOWTO, header.h_followt┆ 0x04f200…09e600 6f 7d 2c 0a 09 7b 22 46 72 6f 6d 3a 22 2c 09 09 46 52 4f 4d 2c 09 09 68 65 61 64 65 72 2e 68 5f ┆o}, {"From:", FROM, header.h_┆ 0x04f200…09e600 66 72 6f 6d 7d 2c 0a 09 7b 22 4b 65 79 77 6f 72 64 73 3a 22 2c 09 09 4b 45 59 57 4f 52 44 53 2c ┆from}, {"Keywords:", KEYWORDS,┆ 0x04f200…09e600 09 68 65 61 64 65 72 2e 68 5f 6b 65 79 77 6f 72 64 73 7d 2c 0a 09 7b 22 4c 69 6e 65 73 3a 22 2c ┆ header.h_keywords}, {"Lines:",┆ 0x04f200…09e600 09 09 4e 55 4d 4c 49 4e 45 53 2c 09 28 63 68 61 72 20 2a 29 4e 55 4c 4c 7d 2c 0a 09 7b 22 4d 65 ┆ NUMLINES, (char *)NULL}, {"Me┆ 0x04f200…09e600 73 73 61 67 65 2d 49 44 3a 22 2c 09 09 4d 45 53 53 41 47 45 49 44 2c 09 68 65 61 64 65 72 2e 68 ┆ssage-ID:", MESSAGEID, header.h┆ 0x04f200…09e600 5f 69 64 65 6e 74 7d 2c 0a 09 7b 22 4e 65 77 73 2d 50 61 74 68 3a 22 2c 09 09 50 41 54 48 2c 09 ┆_ident}, {"News-Path:", PATH, ┆ 0x04f200…09e600 09 68 65 61 64 65 72 2e 68 5f 70 61 74 68 7d 2c 0a 09 7b 22 4e 65 77 73 67 72 6f 75 70 73 3a 22 ┆ header.h_path}, {"Newsgroups:"┆ 0x04f200…09e600 2c 09 09 4e 45 57 53 47 52 4f 55 50 2c 09 68 65 61 64 65 72 2e 68 5f 6e 65 77 73 67 72 6f 75 70 ┆, NEWSGROUP, header.h_newsgroup┆ 0x04f200…09e600 73 7d 2c 0a 09 7b 22 4e 66 2d 46 72 6f 6d 3a 22 2c 09 09 4e 46 46 52 4f 4d 2c 09 09 68 65 61 64 ┆s}, {"Nf-From:", NFFROM, head┆ 0x04f200…09e600 65 72 2e 68 5f 6e 66 66 72 6f 6d 7d 2c 0a 09 7b 22 4e 66 2d 49 44 3a 22 2c 09 09 4e 46 49 44 2c ┆er.h_nffrom}, {"Nf-ID:", NFID,┆ 0x04f200…09e600 09 09 68 65 61 64 65 72 2e 68 5f 6e 66 69 64 7d 2c 0a 09 7b 22 4f 72 67 61 6e 69 7a 61 74 69 6f ┆ header.h_nfid}, {"Organizatio┆ 0x04f200…09e600 6e 3a 22 2c 09 4f 52 47 41 4e 49 5a 41 54 49 4f 4e 2c 09 68 65 61 64 65 72 2e 68 5f 6f 72 67 61 ┆n:", ORGANIZATION, header.h_orga┆ 0x04f200…09e600 6e 69 7a 61 74 69 6f 6e 7d 2c 0a 09 7b 22 50 61 74 68 3a 22 2c 09 09 50 41 54 48 2c 09 09 68 65 ┆nization}, {"Path:", PATH, he┆ 0x04f200…09e600 61 64 65 72 2e 68 5f 70 61 74 68 7d 2c 0a 09 7b 22 50 6f 73 74 65 64 3a 22 2c 09 09 50 4f 53 54 ┆ader.h_path}, {"Posted:", POST┆ 0x04f200…09e600 44 41 54 45 2c 09 68 65 61 64 65 72 2e 68 5f 70 6f 73 74 64 61 74 65 7d 2c 0a 09 7b 22 50 6f 73 ┆DATE, header.h_postdate}, {"Pos┆ 0x04f200…09e600 74 69 6e 67 2d 56 65 72 73 69 6f 6e 3a 22 2c 09 49 47 4e 4f 52 45 2c 09 09 28 63 68 61 72 20 2a ┆ting-Version:", IGNORE, (char *┆ 0x04f200…09e600 29 4e 55 4c 4c 7d 2c 0a 09 7b 22 50 72 69 6f 72 69 74 79 3a 22 2c 09 09 50 52 49 4f 52 49 54 59 ┆)NULL}, {"Priority:", PRIORITY┆ 0x04f200…09e600 2c 09 28 63 68 61 72 20 2a 29 4e 55 4c 4c 7d 2c 0a 09 7b 22 52 65 63 65 69 76 65 64 3a 22 2c 09 ┆, (char *)NULL}, {"Received:", ┆ 0x04f200…09e600 09 52 45 43 45 49 56 45 44 2c 09 28 63 68 61 72 20 2a 29 4e 55 4c 4c 7d 2c 0a 09 7b 22 52 65 66 ┆ RECEIVED, (char *)NULL}, {"Ref┆ 0x04f200…09e600 65 72 65 6e 63 65 73 3a 22 2c 09 09 52 45 46 45 52 45 4e 43 45 53 2c 09 68 65 61 64 65 72 2e 68 ┆erences:", REFERENCES, header.h┆ 0x04f200…09e600 5f 72 65 66 65 72 65 6e 63 65 73 7d 2c 0a 09 7b 22 52 65 6c 61 79 2d 56 65 72 73 69 6f 6e 3a 22 ┆_references}, {"Relay-Version:"┆ 0x04f200…09e600 2c 09 49 47 4e 4f 52 45 2c 09 09 28 63 68 61 72 20 2a 29 4e 55 4c 4c 7d 2c 0a 09 7b 22 52 65 70 ┆, IGNORE, (char *)NULL}, {"Rep┆ 0x04f200…09e600 6c 79 2d 54 6f 3a 22 2c 09 09 52 45 50 4c 59 54 4f 2c 09 68 65 61 64 65 72 2e 68 5f 72 65 70 6c ┆ly-To:", REPLYTO, header.h_repl┆ 0x04f200…09e600 79 74 6f 7d 2c 0a 09 7b 22 53 65 6e 64 65 72 3a 22 2c 09 09 53 45 4e 44 45 52 2c 09 09 68 65 61 ┆yto}, {"Sender:", SENDER, hea┆ 0x04f200…09e600 64 65 72 2e 68 5f 73 65 6e 64 65 72 7d 2c 0a 09 7b 22 53 74 61 74 75 73 3a 22 2c 09 09 49 47 4e ┆der.h_sender}, {"Status:", IGN┆ 0x04f200…09e600 4f 52 45 2c 09 09 28 63 68 61 72 20 2a 29 4e 55 4c 4c 7d 2c 0a 09 7b 22 53 75 62 6a 65 63 74 3a ┆ORE, (char *)NULL}, {"Subject:┆ 0x04f200…09e600 22 2c 09 09 53 55 42 4a 45 43 54 2c 09 68 65 61 64 65 72 2e 68 5f 73 75 62 6a 65 63 74 7d 2c 0a ┆", SUBJECT, header.h_subject}, ┆ 0x04f200…09e600 09 7b 22 53 75 6d 6d 61 72 79 3a 22 2c 09 09 53 55 4d 4d 41 52 59 2c 09 68 65 61 64 65 72 2e 68 ┆ {"Summary:", SUMMARY, header.h┆ 0x04f200…09e600 5f 73 75 6d 6d 61 72 79 7d 2c 0a 09 7b 22 53 75 70 65 72 73 65 64 65 73 3a 22 2c 09 09 53 55 50 ┆_summary}, {"Supersedes:", SUP┆ 0x04f200…09e600 45 52 53 45 44 45 53 2c 09 68 65 61 64 65 72 2e 68 5f 73 75 70 65 72 73 65 64 65 73 7d 2c 0a 09 ┆ERSEDES, header.h_supersedes}, ┆ 0x04f200…09e600 7b 22 54 69 74 6c 65 3a 22 2c 09 09 53 55 42 4a 45 43 54 2c 09 68 65 61 64 65 72 2e 68 5f 73 75 ┆{"Title:", SUBJECT, header.h_su┆ 0x04f200…09e600 62 6a 65 63 74 7d 2c 0a 09 7b 22 54 6f 3a 22 2c 09 09 09 54 4f 2c 09 09 68 65 61 64 65 72 2e 68 ┆bject}, {"To:", TO, header.h┆ 0x04f200…09e600 5f 74 6f 7d 2c 0a 23 69 66 64 65 66 20 44 4f 58 52 45 46 53 0a 09 7b 22 58 72 65 66 3a 22 2c 09 ┆_to}, #ifdef DOXREFS {"Xref:", ┆ 0x04f200…09e600 09 58 52 45 46 2c 09 09 68 65 61 64 65 72 2e 68 5f 78 72 65 66 7d 2c 0a 23 65 6c 73 65 0a 09 7b ┆ XREF, header.h_xref}, #else {┆ 0x04f200…09e600 22 58 72 65 66 3a 22 2c 09 09 49 47 4e 4f 52 45 2c 09 09 28 63 68 61 72 20 2a 29 4e 55 4c 4c 7d ┆"Xref:", IGNORE, (char *)NULL}┆ 0x04f200…09e600 2c 0a 23 65 6e 64 69 66 20 2f 2a 20 44 4f 58 52 45 46 53 20 2a 2f 0a 09 7b 28 63 68 61 72 20 2a ┆, #endif /* DOXREFS */ {(char *┆ 0x04f200…09e600 29 4e 55 4c 4c 2c 09 09 4f 54 48 45 52 2c 09 09 28 63 68 61 72 20 2a 29 4e 55 4c 4c 7d 0a 7d 3b ┆)NULL, OTHER, (char *)NULL} };┆ 0x04f200…09e600 0a 0a 70 72 69 76 61 74 65 20 69 6e 74 20 6e 68 65 61 64 65 72 73 20 3d 20 28 73 69 7a 65 6f 66 ┆ private int nheaders = (sizeof┆ 0x04f200…09e600 20 68 65 61 64 65 72 73 20 2f 20 73 69 7a 65 6f 66 20 2a 68 65 61 64 65 72 73 29 20 2d 20 31 20 ┆ headers / sizeof *headers) - 1 ┆ 0x04f200…09e600 3b 0a 0a 63 68 61 72 20 2a 68 6c 67 65 74 28 70 74 72 29 0a 2f 2a 20 72 65 74 75 72 6e 20 74 68 ┆; char *hlget(ptr) /* return th┆ 0x04f200…09e600 65 20 76 61 6c 75 65 20 6f 66 20 61 20 6e 61 6d 65 64 20 68 65 61 64 65 72 20 2a 2f 0a 72 65 67 ┆e value of a named header */ reg┆ 0x04f200…09e600 69 73 74 65 72 20 63 68 61 72 09 2a 70 74 72 3b 0a 7b 0a 20 20 20 20 2f 2a 20 62 75 67 3a 20 74 ┆ister char *ptr; { /* bug: t┆ 0x04f200…09e600 68 69 73 20 72 65 74 75 72 6e 73 20 66 61 69 6c 75 72 65 20 69 6e 61 70 70 72 6f 70 72 69 61 74 ┆his returns failure inappropriat┆ 0x04f200…09e600 65 6c 79 20 6f 6e 20 69 6e 74 65 67 65 72 2d 76 61 6c 75 65 64 20 68 65 61 64 65 72 73 20 2a 2f ┆ely on integer-valued headers */┆ 0x04f200…09e600 0a 20 20 20 20 72 65 67 69 73 74 65 72 20 73 79 6d 62 6f 6c 20 2a 68 74 2c 20 2a 68 74 31 2c 20 ┆ register symbol *ht, *ht1, ┆ 0x04f200…09e600 2a 68 74 32 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 68 74 31 20 69 73 20 61 74 20 74 ┆*ht2; /* * ht1 is at t┆ 0x04f200…09e600 68 65 20 62 65 67 69 6e 69 6e 67 20 6f 66 20 74 68 65 20 73 65 61 72 63 68 20 61 72 65 61 0a 20 ┆he begining of the search area ┆ 0x04f200…09e600 20 20 20 20 2a 20 68 74 32 20 69 73 20 6f 6e 65 20 70 61 73 74 20 74 68 65 20 65 6e 64 2e 0a 20 ┆ * ht2 is one past the end. ┆ 0x04f200…09e600 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 20 28 68 74 31 20 3d 20 68 65 61 64 65 72 73 2c 20 68 ┆ */ for (ht1 = headers, h┆ 0x04f200…09e600 74 32 20 3d 20 68 65 61 64 65 72 73 20 2b 20 6e 68 65 61 64 65 72 73 3b 20 68 74 31 20 3c 20 68 ┆t2 = headers + nheaders; ht1 < h┆ 0x04f200…09e600 74 32 3b 29 20 7b 0a 09 20 20 20 20 72 65 67 69 73 74 65 72 09 69 3b 0a 0a 09 20 20 20 20 68 74 ┆t2;) { register i; ht┆ 0x04f200…09e600 20 3d 20 68 74 31 20 2b 20 28 28 68 74 32 20 2d 20 68 74 31 29 20 2f 20 32 29 3b 0a 09 20 20 20 ┆ = ht1 + ((ht2 - ht1) / 2); ┆ 0x04f200…09e600 20 69 66 20 28 28 69 20 3d 20 2a 70 74 72 20 2d 20 2a 68 74 2d 3e 68 6e 61 6d 65 29 20 3d 3d 20 ┆ if ((i = *ptr - *ht->hname) == ┆ 0x04f200…09e600 30 20 26 26 0a 09 09 28 69 20 3d 20 73 74 72 6e 63 6d 70 28 70 74 72 2c 20 68 74 2d 3e 68 6e 61 ┆0 && (i = strncmp(ptr, ht->hna┆ 0x04f200…09e600 6d 65 2c 20 73 74 72 6c 65 6e 28 68 74 2d 3e 68 6e 61 6d 65 29 29 29 20 3d 3d 20 30 29 0a 09 09 ┆me, strlen(ht->hname))) == 0) ┆ 0x04f200…09e600 20 20 20 20 72 65 74 75 72 6e 28 68 74 2d 3e 6f 66 66 73 65 74 29 3b 0a 09 20 20 20 20 69 66 20 ┆ return(ht->offset); if ┆ 0x04f200…09e600 28 69 20 3c 20 30 29 0a 09 09 20 20 20 20 68 74 32 20 3d 20 68 74 3b 0a 09 20 20 20 20 65 6c 73 ┆(i < 0) ht2 = ht; els┆ 0x04f200…09e600 65 0a 09 09 20 20 20 20 68 74 31 20 3d 20 68 74 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 ┆e ht1 = ht+1; } re┆ 0x04f200…09e600 74 75 72 6e 28 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 23 69 66 64 65 66 20 6e 6f 74 64 ┆turn((char *) NULL); #ifdef notd┆ 0x04f200…09e600 65 66 0a 20 20 20 20 72 65 67 69 73 74 65 72 20 73 79 6d 62 6f 6c 20 2a 68 74 3b 0a 0a 20 20 20 ┆ef register symbol *ht; ┆ 0x04f200…09e600 20 66 6f 72 20 28 68 74 20 3d 20 68 65 61 64 65 72 73 3b 20 68 74 2d 3e 68 6e 61 6d 65 3b 20 68 ┆ for (ht = headers; ht->hname; h┆ 0x04f200…09e600 74 2b 2b 29 0a 09 69 66 20 28 73 74 72 6e 63 6d 70 28 68 74 2d 3e 68 6e 61 6d 65 2c 20 70 74 72 ┆t++) if (strncmp(ht->hname, ptr┆ 0x04f200…09e600 2c 20 73 74 72 6c 65 6e 28 68 74 2d 3e 68 6e 61 6d 65 29 29 20 3d 3d 20 30 29 0a 09 20 20 20 20 ┆, strlen(ht->hname)) == 0) ┆ 0x04f200…09e600 72 65 74 75 72 6e 28 68 74 2d 3e 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 28 28 ┆return(ht->offset); return((┆ 0x04f200…09e600 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 70 72 69 76 61 74 65 20 ┆char *)NULL); #endif } private ┆ 0x04f200…09e600 69 6e 74 20 74 79 70 65 28 70 74 72 29 0a 72 65 67 69 73 74 65 72 20 63 68 61 72 09 2a 70 74 72 ┆int type(ptr) register char *ptr┆ 0x04f200…09e600 3b 0a 7b 0a 20 20 20 20 72 65 67 69 73 74 65 72 20 73 79 6d 62 6f 6c 20 2a 68 74 2c 20 2a 68 74 ┆; { register symbol *ht, *ht┆ 0x04f200…09e600 31 2c 20 2a 68 74 32 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 68 74 31 20 69 73 20 61 ┆1, *ht2; /* * ht1 is a┆ 0x04f200…09e600 74 20 74 68 65 20 62 65 67 69 6e 69 6e 67 20 6f 66 20 74 68 65 20 73 65 61 72 63 68 20 61 72 65 ┆t the begining of the search are┆ 0x04f200…09e600 61 0a 20 20 20 20 20 2a 20 68 74 32 20 69 73 20 6f 6e 65 20 70 61 73 74 20 74 68 65 20 65 6e 64 ┆a * ht2 is one past the end┆ 0x04f200…09e600 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 20 28 68 74 31 20 3d 20 68 65 61 64 65 72 73 ┆. */ for (ht1 = headers┆ 0x04f200…09e600 2c 20 68 74 32 20 3d 20 68 65 61 64 65 72 73 20 2b 20 6e 68 65 61 64 65 72 73 3b 20 68 74 31 20 ┆, ht2 = headers + nheaders; ht1 ┆ 0x04f200…09e600 3c 20 68 74 32 3b 29 20 7b 0a 09 20 20 20 20 72 65 67 69 73 74 65 72 09 69 3b 0a 0a 09 20 20 20 ┆< ht2;) { register i; ┆ 0x04f200…09e600 20 68 74 20 3d 20 68 74 31 20 2b 20 28 28 68 74 32 20 2d 20 68 74 31 29 20 2f 20 32 29 3b 0a 09 ┆ ht = ht1 + ((ht2 - ht1) / 2); ┆ 0x04f200…09e600 20 20 20 20 69 66 20 28 28 69 20 3d 20 2a 70 74 72 20 2d 20 2a 68 74 2d 3e 68 6e 61 6d 65 29 20 ┆ if ((i = *ptr - *ht->hname) ┆ 0x04f200…09e600 3d 3d 20 30 20 26 26 0a 09 09 28 69 20 3d 20 73 74 72 6e 63 6d 70 28 70 74 72 2c 20 68 74 2d 3e ┆== 0 && (i = strncmp(ptr, ht->┆ 0x04f200…09e600 68 6e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 68 74 2d 3e 68 6e 61 6d 65 29 29 29 20 3d 3d 20 30 29 ┆hname, strlen(ht->hname))) == 0)┆ 0x04f200…09e600 0a 09 09 20 20 20 20 72 65 74 75 72 6e 28 68 74 2d 3e 68 76 61 6c 29 3b 0a 09 20 20 20 20 69 66 ┆ return(ht->hval); if┆ 0x04f200…09e600 20 28 69 20 3c 20 30 29 0a 09 09 20 20 20 20 68 74 32 20 3d 20 68 74 3b 0a 09 20 20 20 20 65 6c ┆ (i < 0) ht2 = ht; el┆ 0x04f200…09e600 73 65 0a 09 09 20 20 20 20 68 74 31 20 3d 20 68 74 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 ┆se ht1 = ht+1; } r┆ 0x04f200…09e600 65 74 75 72 6e 28 4f 54 48 45 52 29 3b 0a 23 69 66 64 65 66 20 6e 6f 74 64 65 66 0a 20 20 20 20 ┆eturn(OTHER); #ifdef notdef ┆ 0x04f200…09e600 66 6f 72 20 28 68 74 20 3d 20 68 65 61 64 65 72 73 3b 20 68 74 2d 3e 68 6e 61 6d 65 3b 20 68 74 ┆for (ht = headers; ht->hname; ht┆ 0x04f200…09e600 2b 2b 29 0a 09 69 66 20 28 73 74 72 6e 63 6d 70 28 68 74 2d 3e 68 6e 61 6d 65 2c 20 70 74 72 2c ┆++) if (strncmp(ht->hname, ptr,┆ 0x04f200…09e600 20 73 74 72 6c 65 6e 28 68 74 2d 3e 68 6e 61 6d 65 29 29 20 3d 3d 20 30 29 0a 09 20 20 20 20 72 ┆ strlen(ht->hname)) == 0) r┆ 0x04f200…09e600 65 74 75 72 6e 28 68 74 2d 3e 68 76 61 6c 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 28 4f 54 48 45 ┆eturn(ht->hval); return(OTHE┆ 0x04f200…09e600 52 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 70 72 69 76 61 74 65 20 74 69 6d 65 5f 74 20 63 67 74 ┆R); #endif } private time_t cgt┆ 0x04f200…09e600 64 61 74 65 28 64 61 74 65 29 0a 63 68 61 72 20 2a 64 61 74 65 3b 0a 7b 0a 20 20 20 20 63 68 61 ┆date(date) char *date; { cha┆ 0x04f200…09e600 72 20 20 20 20 6a 75 6e 6b 5b 34 30 5d 2c 20 6d 6f 6e 74 68 5b 34 30 5d 2c 20 64 61 79 5b 33 30 ┆r junk[40], month[40], day[30┆ 0x04f200…09e600 5d 2c 20 74 6f 64 5b 36 30 5d 2c 20 79 65 61 72 5b 35 30 5d 3b 0a 20 20 20 20 73 74 61 74 69 63 ┆], tod[60], year[50]; static┆ 0x04f200…09e600 20 20 74 69 6d 65 5f 74 20 6c 61 73 74 74 69 6d 65 20 3d 20 28 74 69 6d 65 5f 74 29 30 3b 0a 20 ┆ time_t lasttime = (time_t)0; ┆ 0x04f200…09e600 20 20 20 73 74 61 74 69 63 20 63 68 61 72 20 6c 61 73 74 64 61 74 65 5b 42 55 46 4c 45 4e 5d 20 ┆ static char lastdate[BUFLEN] ┆ 0x04f200…09e600 3d 20 22 22 3b 0a 0a 20 20 20 20 69 66 20 28 6c 61 73 74 64 61 74 65 5b 30 5d 20 26 26 20 73 74 ┆= ""; if (lastdate[0] && st┆ 0x04f200…09e600 72 63 6d 70 28 64 61 74 65 2c 20 6c 61 73 74 64 61 74 65 29 20 3d 3d 20 30 29 0a 09 72 65 74 75 ┆rcmp(date, lastdate) == 0) retu┆ 0x04f200…09e600 72 6e 20 6c 61 73 74 74 69 6d 65 3b 0a 23 69 66 6e 64 65 66 20 6c 69 6e 74 0a 20 20 20 20 6c 61 ┆rn lasttime; #ifndef lint la┆ 0x04f200…09e600 73 74 74 69 6d 65 20 3d 20 67 65 74 64 61 74 65 28 64 61 74 65 2c 20 28 73 74 72 75 63 74 20 74 ┆sttime = getdate(date, (struct t┆ 0x04f200…09e600 69 6d 65 62 20 2a 29 20 30 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 6c 61 73 74 74 69 6d 65 20 3d ┆imeb *) 0); #else lasttime =┆ 0x04f200…09e600 20 30 3b 09 09 2f 2a 20 61 76 6f 69 64 20 27 73 74 72 75 63 74 20 74 69 6d 65 62 20 75 6e 64 65 ┆ 0; /* avoid 'struct timeb unde┆ 0x04f200…09e600 66 69 6e 65 64 27 20 66 72 6f 6d 20 6c 69 6e 74 20 2a 2f 0a 23 65 6e 64 69 66 09 09 09 09 2f 2a ┆fined' from lint */ #endif /*┆ 0x04f200…09e600 20 6c 69 6e 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 6c 61 73 74 74 69 6d 65 3c 30 20 26 26 73 73 ┆ lint */ if (lasttime<0 &&ss┆ 0x04f200…09e600 63 61 6e 66 28 64 61 74 65 2c 22 25 73 20 25 73 20 25 73 20 25 73 20 25 73 22 2c 6a 75 6e 6b 2c ┆canf(date,"%s %s %s %s %s",junk,┆ 0x04f200…09e600 6d 6f 6e 74 68 2c 64 61 79 2c 74 6f 64 2c 79 65 61 72 29 3d 3d 35 29 0a 20 20 20 20 7b 0a 09 28 ┆month,day,tod,year)==5) { (┆ 0x04f200…09e600 76 6f 69 64 29 20 73 70 72 69 6e 74 66 28 62 66 72 2c 20 22 25 73 20 25 73 2c 20 25 73 20 25 73 ┆void) sprintf(bfr, "%s %s, %s %s┆ 0x04f200…09e600 22 2c 20 6d 6f 6e 74 68 2c 20 64 61 79 2c 20 79 65 61 72 2c 20 74 6f 64 29 3b 0a 23 69 66 6e 64 ┆", month, day, year, tod); #ifnd┆ 0x04f200…09e600 65 66 20 6c 69 6e 74 0a 09 6c 61 73 74 74 69 6d 65 20 3d 20 67 65 74 64 61 74 65 28 62 66 72 2c ┆ef lint lasttime = getdate(bfr,┆ 0x04f200…09e600 20 28 73 74 72 75 63 74 20 74 69 6d 65 62 20 2a 29 20 30 29 3b 0a 23 65 6c 73 65 0a 09 6c 61 73 ┆ (struct timeb *) 0); #else las┆ 0x04f200…09e600 74 74 69 6d 65 20 3d 20 30 4c 3b 09 09 2f 2a 20 61 76 6f 69 64 20 27 73 74 72 75 63 74 20 74 69 ┆ttime = 0L; /* avoid 'struct ti┆ 0x04f200…09e600 6d 65 62 20 75 6e 64 65 66 69 6e 65 64 27 20 66 72 6f 6d 20 6c 69 6e 74 20 2a 2f 0a 23 65 6e 64 ┆meb undefined' from lint */ #end┆ 0x04f200…09e600 69 66 09 09 09 09 2f 2a 20 6c 69 6e 74 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 28 76 6f 69 64 ┆if /* lint */ } (void┆ 0x04f200…09e600 29 20 73 74 72 6e 63 70 79 28 6c 61 73 74 64 61 74 65 2c 20 64 61 74 65 2c 20 42 55 46 4c 45 4e ┆) strncpy(lastdate, date, BUFLEN┆ 0x04f200…09e600 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 28 6c 61 73 74 74 69 6d 65 29 3b 0a 7d 0a 0a 70 72 69 76 ┆); return(lasttime); } priv┆ 0x04f200…09e600 61 74 65 20 69 6e 74 20 61 64 64 68 6c 69 6e 65 28 68 70 2c 20 63 70 29 0a 2f 2a 20 61 64 64 20 ┆ate int addhline(hp, cp) /* add ┆ 0x04f200…09e600 61 20 6e 65 77 20 6c 69 6e 65 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20 68 65 61 64 65 72 20 2a ┆a new line to the given header *┆ 0x04f200…09e600 2f 0a 72 65 67 69 73 74 65 72 20 68 64 72 5f 74 09 2a 68 70 3b 0a 63 68 61 72 09 09 2a 63 70 3b ┆/ register hdr_t *hp; char *cp;┆ 0x04f200…09e600 0a 7b 0a 20 20 20 20 63 68 61 72 20 20 20 20 2a 70 74 72 2c 20 2a 63 6f 6c 6f 6e 3b 0a 20 20 20 ┆ { char *ptr, *colon; ┆ 0x04f200…09e600 20 0a 20 20 20 20 69 66 20 28 21 69 73 61 6c 70 68 61 28 2a 63 70 29 20 7c 7c 20 28 63 6f 6c 6f ┆ if (!isalpha(*cp) || (colo┆ 0x04f200…09e600 6e 20 3d 20 73 74 72 63 68 72 28 63 70 2c 20 27 3a 27 29 29 20 3d 3d 20 28 63 68 61 72 20 2a 29 ┆n = strchr(cp, ':')) == (char *)┆ 0x04f200…09e600 4e 55 4c 4c 29 0a 09 72 65 74 75 72 6e 28 46 41 49 4c 29 3b 0a 20 20 20 20 65 6c 73 65 20 69 66 ┆NULL) return(FAIL); else if┆ 0x04f200…09e600 20 28 28 70 74 72 20 3d 20 73 74 72 63 68 72 28 63 70 2c 20 27 20 27 29 29 20 3d 3d 20 28 63 68 ┆ ((ptr = strchr(cp, ' ')) == (ch┆ 0x04f200…09e600 61 72 20 2a 29 4e 55 4c 4c 29 0a 09 70 74 72 20 3d 20 63 6f 6c 6f 6e 20 2b 20 31 3b 0a 20 20 20 ┆ar *)NULL) ptr = colon + 1; ┆ 0x04f200…09e600 20 65 6c 73 65 0a 09 77 68 69 6c 65 20 28 69 73 73 70 61 63 65 28 2a 2b 2b 70 74 72 29 29 0a 09 ┆ else while (isspace(*++ptr)) ┆ 0x04f200…09e600 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 69 66 20 74 68 65 72 65 27 73 ┆ continue; /* if there's┆ 0x04f200…09e600 20 6e 6f 74 68 69 6e 67 20 74 68 65 72 65 2c 20 73 6b 69 70 20 74 68 69 73 20 66 69 65 6c 64 20 ┆ nothing there, skip this field ┆ 0x04f200…09e600 2a 2f 0a 20 20 20 20 69 66 20 28 2a 70 74 72 20 3d 3d 20 27 5c 30 27 20 7c 7c 20 2a 70 74 72 20 ┆*/ if (*ptr == '\0' || *ptr ┆ 0x04f200…09e600 3d 3d 20 27 5c 6e 27 29 0a 09 72 65 74 75 72 6e 28 53 55 43 43 45 45 44 29 3b 0a 0a 20 20 20 20 ┆== '\n') return(SUCCEED); ┆ 0x04f200…09e600 28 76 6f 69 64 29 20 6e 73 74 72 69 70 28 70 74 72 29 3b 09 2f 2a 20 73 75 70 70 72 65 73 73 20 ┆(void) nstrip(ptr); /* suppress ┆ 0x04f200…09e600 61 6e 79 20 74 72 61 69 6c 69 6e 67 20 5c 6e 20 2a 2f 0a 0a 20 20 20 20 73 77 69 74 63 68 28 74 ┆any trailing \n */ switch(t┆ 0x04f200…09e600 79 70 65 28 63 70 29 29 0a 20 20 20 20 7b 0a 20 20 20 20 63 61 73 65 20 46 41 49 4c 3a 09 09 72 ┆ype(cp)) { case FAIL: r┆ 0x04f200…09e600 65 74 75 72 6e 28 46 41 49 4c 29 3b 0a 20 20 20 20 63 61 73 65 20 49 47 4e 4f 52 45 3a 09 62 72 ┆eturn(FAIL); case IGNORE: br┆ 0x04f200…09e600 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4f 3a 09 09 68 6c 66 72 65 65 28 68 70 2d 3e 68 5f ┆eak; case TO: hlfree(hp->h_┆ 0x04f200…09e600 74 6f 29 3b 09 2f 2a 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f 20 43 43 20 63 61 73 65 20 ┆to); /* fall through to CC case ┆ 0x04f200…09e600 2a 2f 0a 20 20 20 20 63 61 73 65 20 43 43 3a 09 09 7b 0a 23 69 66 64 65 66 20 41 4c 4c 4f 43 48 ┆*/ case CC: { #ifdef ALLOCH┆ 0x04f200…09e600 44 52 53 0a 09 09 09 20 20 20 68 6c 63 61 74 28 68 70 2d 3e 74 6f 2c 20 70 74 72 2c 20 22 20 22 ┆DRS hlcat(hp->to, ptr, " "┆ 0x04f200…09e600 29 3b 0a 23 65 6c 73 65 0a 09 09 09 20 20 20 28 76 6f 69 64 29 20 73 74 72 63 61 74 28 68 70 2d ┆); #else (void) strcat(hp-┆ 0x04f200…09e600 3e 68 5f 74 6f 2c 20 70 74 72 29 3b 0a 09 09 09 20 20 20 28 76 6f 69 64 29 20 73 74 72 63 61 74 ┆>h_to, ptr); (void) strcat┆ 0x04f200…09e600 28 68 70 2d 3e 68 5f 74 6f 2c 20 22 20 22 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 41 4c 4c 4f 43 ┆(hp->h_to, " "); #endif /* ALLOC┆ 0x04f200…09e600 48 44 52 53 20 2a 2f 0a 09 09 09 7d 0a 09 09 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 ┆HDRS */ } break; case ┆ 0x04f200…09e600 50 41 54 48 3a 09 09 69 66 20 28 68 6c 62 6c 61 6e 6b 28 68 70 2d 3e 68 5f 70 61 74 68 29 29 20 ┆PATH: if (hlblank(hp->h_path)) ┆ 0x04f200…09e600 68 6c 63 70 79 28 68 70 2d 3e 68 5f 70 61 74 68 2c 70 74 72 29 3b 20 62 72 65 61 6b 3b 0a 20 20 ┆hlcpy(hp->h_path,ptr); break; ┆ 0x04f200…09e600 20 20 63 61 73 65 20 46 52 4f 4d 3a 09 09 69 66 20 28 68 6c 62 6c 61 6e 6b 28 68 70 2d 3e 68 5f ┆ case FROM: if (hlblank(hp->h_┆ 0x04f200…09e600 66 72 6f 6d 29 29 20 68 6c 63 70 79 28 68 70 2d 3e 68 5f 66 72 6f 6d 2c 70 74 72 29 3b 20 62 72 ┆from)) hlcpy(hp->h_from,ptr); br┆ 0x04f200…09e600 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4e 45 57 53 47 52 4f 55 50 3a 20 09 69 66 20 28 68 6c ┆eak; case NEWSGROUP: if (hl┆ 0x04f200…09e600 62 6c 61 6e 6b 28 68 70 2d 3e 68 5f 6e 65 77 73 67 72 6f 75 70 73 29 29 20 68 6c 63 70 79 28 68 ┆blank(hp->h_newsgroups)) hlcpy(h┆ 0x04f200…09e600 70 2d 3e 68 5f 6e 65 77 73 67 72 6f 75 70 73 2c 70 74 72 29 3b 20 62 72 65 61 6b 3b 0a 20 20 20 ┆p->h_newsgroups,ptr); break; ┆ 0x04f200…09e600 20 63 61 73 65 20 53 55 42 4a 45 43 54 3a 20 09 69 66 20 28 68 6c 62 6c 61 6e 6b 28 68 70 2d 3e ┆ case SUBJECT: if (hlblank(hp->┆ 0x04f200…09e600 68 5f 73 75 62 6a 65 63 74 29 29 68 6c 63 70 79 28 68 70 2d 3e 68 5f 73 75 62 6a 65 63 74 2c 70 ┆h_subject))hlcpy(hp->h_subject,p┆ 0x04f200…09e600 74 72 29 3b 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4d 45 53 53 41 47 45 49 44 3a 09 69 ┆tr);break; case MESSAGEID: i┆ 0x04f200…09e600 66 20 28 68 6c 62 6c 61 6e 6b 28 68 70 2d 3e 68 5f 69 64 65 6e 74 29 29 68 6c 63 70 79 28 68 70 ┆f (hlblank(hp->h_ident))hlcpy(hp┆ 0x04f200…09e600 2d 3e 68 5f 69 64 65 6e 74 2c 70 74 72 29 3b 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 50 ┆->h_ident,ptr);break; case P┆ 0x04f200…09e600 4f 53 54 44 41 54 45 3a 20 0a 09 69 66 20 28 68 6c 62 6c 61 6e 6b 28 68 70 2d 3e 68 5f 70 6f 73 ┆OSTDATE: if (hlblank(hp->h_pos┆ 0x04f200…09e600 74 64 61 74 65 29 29 20 68 6c 63 70 79 28 68 70 2d 3e 68 5f 70 6f 73 74 64 61 74 65 2c 20 70 74 ┆tdate)) hlcpy(hp->h_postdate, pt┆ 0x04f200…09e600 72 29 3b 0a 09 68 70 2d 3e 68 5f 70 6f 73 74 74 69 6d 65 20 3d 20 63 67 74 64 61 74 65 28 68 70 ┆r); hp->h_posttime = cgtdate(hp┆ 0x04f200…09e600 2d 3e 68 5f 70 6f 73 74 64 61 74 65 29 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 ┆->h_postdate); break; case ┆ 0x04f200…09e600 52 45 43 45 49 56 45 44 3a 0a 09 69 66 20 28 21 69 73 6c 6f 77 65 72 28 70 74 72 5b 30 5d 29 29 ┆RECEIVED: if (!islower(ptr[0]))┆ 0x04f200…09e600 09 2f 2a 20 73 6b 69 70 20 6d 61 69 6c 65 72 20 52 65 63 65 69 76 65 64 20 68 65 61 64 65 72 73 ┆ /* skip mailer Received headers┆ 0x04f200…09e600 20 2a 2f 0a 09 20 20 20 20 68 70 2d 3e 68 5f 72 65 63 74 69 6d 65 20 3d 20 63 67 74 64 61 74 65 ┆ */ hp->h_rectime = cgtdate┆ 0x04f200…09e600 28 70 74 72 29 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 45 58 50 49 52 45 44 41 ┆(ptr); break; case EXPIREDA┆ 0x04f200…09e600 54 45 3a 0a 09 69 66 20 28 68 6c 62 6c 61 6e 6b 28 68 70 2d 3e 68 5f 65 78 70 64 61 74 65 29 29 ┆TE: if (hlblank(hp->h_expdate))┆ 0x04f200…09e600 20 68 6c 63 70 79 28 68 70 2d 3e 68 5f 65 78 70 64 61 74 65 2c 20 70 74 72 29 3b 0a 09 68 70 2d ┆ hlcpy(hp->h_expdate, ptr); hp-┆ 0x04f200…09e600 3e 68 5f 65 78 70 74 69 6d 65 20 3d 20 63 67 74 64 61 74 65 28 68 70 2d 3e 68 5f 65 78 70 64 61 ┆>h_exptime = cgtdate(hp->h_expda┆ 0x04f200…09e600 74 65 29 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 52 45 46 45 52 45 4e 43 45 53 ┆te); break; case REFERENCES┆ 0x04f200…09e600 3a 0a 09 69 66 20 28 68 6c 62 6c 61 6e 6b 28 68 70 2d 3e 68 5f 72 65 66 65 72 65 6e 63 65 73 29 ┆: if (hlblank(hp->h_references)┆ 0x04f200…09e600 29 20 68 6c 63 70 79 28 63 70 20 3d 20 68 70 2d 3e 68 5f 72 65 66 65 72 65 6e 63 65 73 2c 20 70 ┆) hlcpy(cp = hp->h_references, p┆ 0x04f200…09e600 74 72 29 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 43 4f 4e 54 52 4f 4c 3a 20 69 ┆tr); break; case CONTROL: i┆ 0x04f200…09e600 66 20 28 68 6c 62 6c 61 6e 6b 28 68 70 2d 3e 68 5f 63 74 6c 6d 73 67 29 29 20 68 6c 63 70 79 28 ┆f (hlblank(hp->h_ctlmsg)) hlcpy(┆ 0x04f200…09e600 68 70 2d 3e 68 5f 63 74 6c 6d 73 67 2c 70 74 72 29 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 ┆hp->h_ctlmsg,ptr); break; ca┆ 0x04f200…09e600 73 65 20 53 45 4e 44 45 52 3a 20 20 69 66 20 28 68 6c 62 6c 61 6e 6b 28 68 70 2d 3e 68 5f 73 65 ┆se SENDER: if (hlblank(hp->h_se┆ 0x04f200…09e600 6e 64 65 72 29 29 20 68 6c 63 70 79 28 68 70 2d 3e 68 5f 73 65 6e 64 65 72 2c 70 74 72 29 3b 20 ┆nder)) hlcpy(hp->h_sender,ptr); ┆ 0x04f200…09e600 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 52 45 50 4c 59 54 4f 3a 20 69 66 20 28 68 6c 62 ┆break; case REPLYTO: if (hlb┆ 0x04f200…09e600 6c 61 6e 6b 28 68 70 2d 3e 68 5f 72 65 70 6c 79 74 6f 29 29 68 6c 63 70 79 28 68 70 2d 3e 68 5f ┆lank(hp->h_replyto))hlcpy(hp->h_┆ 0x04f200…09e600 72 65 70 6c 79 74 6f 2c 70 74 72 29 3b 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 46 4f 4c ┆replyto,ptr);break; case FOL┆ 0x04f200…09e600 4c 4f 57 54 4f 3a 69 66 20 28 68 6c 62 6c 61 6e 6b 28 68 70 2d 3e 68 5f 66 6f 6c 6c 6f 77 74 6f ┆LOWTO:if (hlblank(hp->h_followto┆ 0x04f200…09e600 29 29 68 6c 63 70 79 28 68 70 2d 3e 68 5f 66 6f 6c 6c 6f 77 74 6f 2c 70 74 72 29 3b 62 72 65 61 ┆))hlcpy(hp->h_followto,ptr);brea┆ 0x04f200…09e600 6b 3b 0a 20 20 20 20 63 61 73 65 20 44 49 53 54 52 49 42 55 54 49 4f 4e 3a 0a 09 69 66 20 28 68 ┆k; case DISTRIBUTION: if (h┆ 0x04f200…09e600 6c 62 6c 61 6e 6b 28 68 70 2d 3e 68 5f 64 69 73 74 72 69 62 75 74 69 6f 6e 29 29 20 68 6c 63 70 ┆lblank(hp->h_distribution)) hlcp┆ 0x04f200…09e600 79 28 68 70 2d 3e 68 5f 64 69 73 74 72 69 62 75 74 69 6f 6e 2c 20 70 74 72 29 3b 62 72 65 61 6b ┆y(hp->h_distribution, ptr);break┆ 0x04f200…09e600 3b 0a 20 20 20 20 63 61 73 65 20 4f 52 47 41 4e 49 5a 41 54 49 4f 4e 3a 20 0a 09 69 66 20 28 68 ┆; case ORGANIZATION: if (h┆ 0x04f200…09e600 6c 62 6c 61 6e 6b 28 68 70 2d 3e 68 5f 6f 72 67 61 6e 69 7a 61 74 69 6f 6e 29 29 20 68 6c 63 70 ┆lblank(hp->h_organization)) hlcp┆ 0x04f200…09e600 79 28 68 70 2d 3e 68 5f 6f 72 67 61 6e 69 7a 61 74 69 6f 6e 2c 20 70 74 72 29 3b 62 72 65 61 6b ┆y(hp->h_organization, ptr);break┆ 0x04f200…09e600 3b 0a 20 20 20 20 63 61 73 65 20 4e 55 4d 4c 49 4e 45 53 3a 20 20 68 70 2d 3e 68 5f 69 6e 74 6e ┆; case NUMLINES: hp->h_intn┆ 0x04f200…09e600 75 6d 6c 69 6e 65 73 20 3d 20 61 74 6f 69 28 70 74 72 29 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 ┆umlines = atoi(ptr); break; ┆ 0x04f200…09e600 63 61 73 65 20 4b 45 59 57 4f 52 44 53 3a 0a 09 69 66 20 28 68 6c 62 6c 61 6e 6b 28 68 70 2d 3e ┆case KEYWORDS: if (hlblank(hp->┆ 0x04f200…09e600 68 5f 6b 65 79 77 6f 72 64 73 29 29 20 68 6c 63 70 79 28 68 70 2d 3e 68 5f 6b 65 79 77 6f 72 64 ┆h_keywords)) hlcpy(hp->h_keyword┆ 0x04f200…09e600 73 2c 20 70 74 72 29 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 55 4d 4d 41 52 59 ┆s, ptr); break; case SUMMARY┆ 0x04f200…09e600 3a 0a 09 69 66 20 28 68 6c 62 6c 61 6e 6b 28 68 70 2d 3e 68 5f 73 75 6d 6d 61 72 79 29 29 20 68 ┆: if (hlblank(hp->h_summary)) h┆ 0x04f200…09e600 6c 63 70 79 28 68 70 2d 3e 68 5f 73 75 6d 6d 61 72 79 2c 20 70 74 72 29 3b 20 62 72 65 61 6b 3b ┆lcpy(hp->h_summary, ptr); break;┆ 0x04f200…09e600 0a 20 20 20 20 63 61 73 65 20 50 52 49 4f 52 49 54 59 3a 20 20 68 70 2d 3e 68 5f 69 6e 74 70 72 ┆ case PRIORITY: hp->h_intpr┆ 0x04f200…09e600 69 6f 72 69 74 79 20 3d 20 61 74 6f 69 28 70 74 72 29 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 ┆iority = atoi(ptr); break; c┆ 0x04f200…09e600 61 73 65 20 41 50 50 52 4f 56 45 44 3a 0a 09 69 66 20 28 68 6c 62 6c 61 6e 6b 28 68 70 2d 3e 68 ┆ase APPROVED: if (hlblank(hp->h┆ 0x04f200…09e600 5f 61 70 70 72 6f 76 65 64 29 29 20 68 6c 63 70 79 28 68 70 2d 3e 68 5f 61 70 70 72 6f 76 65 64 ┆_approved)) hlcpy(hp->h_approved┆ 0x04f200…09e600 2c 20 70 74 72 29 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 55 50 45 52 53 45 44 ┆, ptr); break; case SUPERSED┆ 0x04f200…09e600 45 53 3a 0a 09 69 66 20 28 68 6c 62 6c 61 6e 6b 28 68 70 2d 3e 68 5f 73 75 70 65 72 73 65 64 65 ┆ES: if (hlblank(hp->h_supersede┆ 0x04f200…09e600 73 29 29 20 68 6c 63 70 79 28 63 70 20 3d 20 68 70 2d 3e 68 5f 73 75 70 65 72 73 65 64 65 73 2c ┆s)) hlcpy(cp = hp->h_supersedes,┆ 0x04f200…09e600 20 70 74 72 29 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 43 4f 4e 54 45 4e 54 54 ┆ ptr); break; case CONTENTT┆ 0x04f200…09e600 59 50 45 3a 0a 09 69 66 20 28 68 6c 62 6c 61 6e 6b 28 68 70 2d 3e 68 5f 63 6f 6e 74 65 6e 74 74 ┆YPE: if (hlblank(hp->h_contentt┆ 0x04f200…09e600 79 70 65 29 29 20 68 6c 63 70 79 28 68 70 2d 3e 68 5f 63 6f 6e 74 65 6e 74 74 79 70 65 2c 20 70 ┆ype)) hlcpy(hp->h_contenttype, p┆ 0x04f200…09e600 74 72 29 3b 20 62 72 65 61 6b 3b 0a 23 69 66 64 65 66 20 5a 41 50 4e 4f 54 45 53 0a 20 20 20 20 ┆tr); break; #ifdef ZAPNOTES ┆ 0x04f200…09e600 63 61 73 65 20 4e 46 49 44 3a 09 20 20 20 20 69 66 20 28 68 6c 62 6c 61 6e 6b 28 68 70 2d 3e 68 ┆case NFID: if (hlblank(hp->h┆ 0x04f200…09e600 5f 6e 66 69 64 29 29 20 68 6c 63 70 79 28 68 70 2d 3e 68 5f 61 70 70 72 6f 76 65 64 2c 20 70 74 ┆_nfid)) hlcpy(hp->h_approved, pt┆ 0x04f200…09e600 72 29 3b 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4e 46 46 52 4f 4d 3a 0a 09 69 66 20 28 ┆r);break; case NFFROM: if (┆ 0x04f200…09e600 68 6c 62 6c 61 6e 6b 28 68 70 2d 3e 68 5f 6e 66 66 72 6f 6d 29 29 20 68 6c 63 70 79 28 68 70 2d ┆hlblank(hp->h_nffrom)) hlcpy(hp-┆ 0x04f200…09e600 3e 68 5f 61 70 70 72 6f 76 65 64 2c 20 70 74 72 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 ┆>h_approved, ptr); break; #endif┆ 0x04f200…09e600 20 2f 2a 20 5a 41 50 4e 4f 54 45 53 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 42 41 43 4b 52 45 46 ┆ /* ZAPNOTES */ case BACKREF┆ 0x04f200…09e600 53 3a 0a 09 69 66 20 28 68 6c 62 6c 61 6e 6b 28 68 70 2d 3e 68 5f 62 61 63 6b 72 65 66 73 29 29 ┆S: if (hlblank(hp->h_backrefs))┆ 0x04f200…09e600 20 68 6c 63 70 79 28 63 70 20 3d 20 68 70 2d 3e 68 5f 62 61 63 6b 72 65 66 73 2c 20 70 74 72 29 ┆ hlcpy(cp = hp->h_backrefs, ptr)┆ 0x04f200…09e600 3b 0a 09 62 72 65 61 6b 3b 0a 23 69 66 64 65 66 20 44 4f 58 52 45 46 53 0a 20 20 20 20 63 61 73 ┆; break; #ifdef DOXREFS cas┆ 0x04f200…09e600 65 20 58 52 45 46 3a 0a 09 69 66 20 28 68 6c 62 6c 61 6e 6b 28 68 70 2d 3e 68 5f 78 72 65 66 29 ┆e XREF: if (hlblank(hp->h_xref)┆ 0x04f200…09e600 29 20 68 6c 63 70 79 28 68 70 2d 3e 68 5f 78 72 65 66 2c 20 70 74 72 29 3b 20 62 72 65 61 6b 3b ┆) hlcpy(hp->h_xref, ptr); break;┆ 0x04f200…09e600 0a 23 65 6e 64 69 66 20 2f 2a 20 44 4f 58 52 45 46 53 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 4f ┆ #endif /* DOXREFS */ case O┆ 0x04f200…09e600 54 48 45 52 3a 0a 09 68 61 70 70 65 6e 64 28 68 70 2c 20 63 70 29 3b 0a 09 62 72 65 61 6b 3b 0a ┆THER: happend(hp, cp); break; ┆ 0x04f200…09e600 20 20 20 20 7d 0a 20 20 20 20 68 64 72 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 ┆ } hdrlineno++; retur┆ 0x04f200…09e600 6e 28 53 55 43 43 45 45 44 29 3b 0a 7d 0a 0a 70 72 69 76 61 74 65 20 63 68 61 72 20 2a 68 66 67 ┆n(SUCCEED); } private char *hfg┆ 0x04f200…09e600 65 74 73 28 62 75 66 2c 20 6c 65 6e 2c 20 66 70 29 0a 2f 2a 0a 20 2a 20 68 66 67 65 74 73 28 29 ┆ets(buf, len, fp) /* * hfgets()┆ 0x04f200…09e600 20 69 73 20 6c 69 6b 65 20 66 67 65 74 73 28 29 2c 20 62 75 74 20 64 65 61 6c 73 20 77 69 74 68 ┆ is like fgets(), but deals with┆ 0x04f200…09e600 20 63 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 6c 69 6e 65 73 2e 0a 20 2a 20 49 74 20 61 6c 73 6f 20 ┆ continuation lines. * It also ┆ 0x04f200…09e600 65 6e 73 75 72 65 73 20 74 68 61 74 20 65 76 65 6e 20 69 66 20 61 20 6c 69 6e 65 20 74 68 61 74 ┆ensures that even if a line that┆ 0x04f200…09e600 20 69 73 20 74 6f 6f 20 6c 6f 6e 67 20 69 73 0a 20 2a 20 72 65 63 65 69 76 65 64 2c 20 74 68 65 ┆ is too long is * received, the┆ 0x04f200…09e600 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 65 20 6c 69 6e 65 20 69 73 20 74 68 72 6f 77 6e ┆ remainder of the line is thrown┆ 0x04f200…09e600 20 61 77 61 79 0a 20 2a 20 69 6e 73 74 65 61 64 20 6f 66 20 74 72 65 61 74 65 64 20 6c 69 6b 65 ┆ away * instead of treated like┆ 0x04f200…09e600 20 61 20 73 65 63 6f 6e 64 20 6c 69 6e 65 2e 20 41 6c 73 6f 2c 20 66 6f 72 20 65 61 63 68 20 63 ┆ a second line. Also, for each c┆ 0x04f200…09e600 68 61 72 61 63 74 65 72 0a 20 2a 20 72 65 61 64 20 69 74 20 69 6e 63 72 65 6d 65 6e 74 73 20 68 ┆haracter * read it increments h┆ 0x04f200…09e600 64 72 73 69 7a 65 2e 0a 20 2a 2f 0a 63 68 61 72 20 2a 62 75 66 3b 0a 69 6e 74 20 6c 65 6e 3b 0a ┆drsize. */ char *buf; int len; ┆ 0x04f200…09e600 46 49 4c 45 20 2a 66 70 3b 0a 7b 0a 20 20 20 20 72 65 67 69 73 74 65 72 20 69 6e 74 20 20 20 20 ┆FILE *fp; { register int ┆ 0x04f200…09e600 63 3b 0a 20 20 20 20 72 65 67 69 73 74 65 72 20 69 6e 74 20 20 20 20 6e 20 3d 20 30 3b 0a 20 20 ┆c; register int n = 0; ┆ 0x04f200…09e600 20 20 72 65 67 69 73 74 65 72 20 63 68 61 72 20 20 2a 63 70 3b 0a 0a 20 20 20 20 2f 2a 20 66 69 ┆ register char *cp; /* fi┆ 0x04f200…09e600 72 73 74 2c 20 66 69 6c 6c 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 62 75 66 66 65 72 20 77 69 ┆rst, fill the supplied buffer wi┆ 0x04f200…09e600 74 68 20 63 68 61 72 61 63 74 65 72 73 20 2a 2f 0a 20 20 20 20 63 70 20 3d 20 62 75 66 3b 0a 20 ┆th characters */ cp = buf; ┆ 0x04f200…09e600 20 20 20 77 68 69 6c 65 20 28 6e 20 3c 20 6c 65 6e 20 26 26 20 28 63 20 3d 20 67 65 74 63 28 66 ┆ while (n < len && (c = getc(f┆ 0x04f200…09e600 70 29 29 20 21 3d 20 45 4f 46 29 0a 20 20 20 20 7b 0a 09 68 64 72 73 69 7a 65 2b 2b 3b 0a 09 69 ┆p)) != EOF) { hdrsize++; i┆ 0x04f200…09e600 66 20 28 63 20 3d 3d 20 27 5c 6e 27 29 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 69 66 20 28 21 ┆f (c == '\n') break; if (!┆ 0x04f200…09e600 69 73 63 6e 74 72 6c 28 63 29 20 7c 7c 20 63 20 3d 3d 20 27 5c 62 27 20 7c 7c 20 63 20 3d 3d 20 ┆iscntrl(c) || c == '\b' || c == ┆ 0x04f200…09e600 27 5c 74 27 29 0a 09 7b 0a 09 20 20 20 20 2a 63 70 2b 2b 20 3d 20 63 3b 0a 09 20 20 20 20 6e 2b ┆'\t') { *cp++ = c; n+┆ 0x04f200…09e600 2b 3b 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 63 20 3d 3d 20 45 4f 46 20 26 26 20 ┆+; } } if (c == EOF && ┆ 0x04f200…09e600 63 70 20 3d 3d 20 62 75 66 29 0a 09 72 65 74 75 72 6e 28 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 ┆cp == buf) return((char *)NULL)┆ 0x04f200…09e600 3b 0a 20 20 20 20 2a 63 70 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 20 20 69 66 20 28 63 20 21 3d 20 ┆; *cp = '\0'; if (c != ┆ 0x04f200…09e600 27 5c 6e 27 29 0a 20 20 20 20 7b 0a 09 2f 2a 20 4c 69 6e 65 20 74 6f 6f 20 6c 6f 6e 67 20 2d 20 ┆'\n') { /* Line too long - ┆ 0x04f200…09e600 74 68 72 6f 77 20 61 77 61 79 20 74 68 65 20 72 65 73 74 20 2a 2f 0a 09 77 68 69 6c 65 20 28 28 ┆throw away the rest */ while ((┆ 0x04f200…09e600 63 20 3d 20 67 65 74 63 28 66 70 29 29 20 21 3d 20 27 5c 6e 27 20 26 26 20 63 20 21 3d 20 45 4f ┆c = getc(fp)) != '\n' && c != EO┆ 0x04f200…09e600 46 29 0a 09 20 20 20 20 68 64 72 73 69 7a 65 2b 2b 3b 0a 09 69 66 20 28 63 20 3d 3d 20 27 5c 6e ┆F) hdrsize++; if (c == '\n┆ 0x04f200…09e600 27 29 0a 09 20 20 20 20 68 64 72 73 69 7a 65 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 ┆') hdrsize++; } els┆ 0x04f200…09e600 65 20 69 66 20 28 63 70 20 3d 3d 20 62 75 66 29 0a 20 20 20 20 7b 0a 09 2f 2a 20 44 6f 6e 27 74 ┆e if (cp == buf) { /* Don't┆ 0x04f200…09e600 20 6c 6f 6f 6b 20 66 6f 72 20 63 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 6f 66 20 62 6c 61 6e 6b 20 ┆ look for continuation of blank ┆ 0x04f200…09e600 6c 69 6e 65 73 20 2a 2f 0a 09 2a 63 70 2b 2b 20 3d 20 27 5c 6e 27 3b 0a 09 2a 63 70 20 3d 20 27 ┆lines */ *cp++ = '\n'; *cp = '┆ 0x04f200…09e600 5c 30 27 3b 0a 09 72 65 74 75 72 6e 20 62 75 66 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 77 68 69 ┆\0'; return buf; } whi┆ 0x04f200…09e600 6c 65 20 28 28 63 20 3d 20 67 65 74 63 20 28 66 70 29 29 20 3d 3d 20 27 20 27 20 7c 7c 20 63 20 ┆le ((c = getc (fp)) == ' ' || c ┆ 0x04f200…09e600 3d 3d 20 27 5c 74 27 29 09 20 20 20 20 2f 2a 20 66 6f 72 20 65 61 63 68 20 63 6f 6e 74 20 6c 69 ┆== '\t') /* for each cont li┆ 0x04f200…09e600 6e 65 20 2a 2f 0a 20 20 20 20 7b 0a 09 68 64 72 73 69 7a 65 2b 2b 3b 0a 0a 09 2f 2a 20 43 6f 6e ┆ne */ { hdrsize++; /* Con┆ 0x04f200…09e600 74 69 6e 75 61 74 69 6f 6e 20 6c 69 6e 65 2e 20 2a 2f 0a 09 69 66 20 28 28 6e 20 2b 3d 20 32 29 ┆tinuation line. */ if ((n += 2)┆ 0x04f200…09e600 20 3c 20 6c 65 6e 29 0a 09 7b 0a 09 20 20 20 20 2a 63 70 2b 2b 20 3d 20 27 5c 6e 27 3b 0a 09 20 ┆ < len) { *cp++ = '\n'; ┆ 0x04f200…09e600 20 20 20 2a 63 70 2b 2b 20 3d 20 63 3b 0a 09 7d 0a 09 77 68 69 6c 65 20 28 28 63 20 3d 20 67 65 ┆ *cp++ = c; } while ((c = ge┆ 0x04f200…09e600 74 63 28 66 70 29 29 20 21 3d 20 27 5c 6e 27 20 26 26 20 63 20 21 3d 20 45 4f 46 29 0a 09 7b 0a ┆tc(fp)) != '\n' && c != EOF) { ┆ 0x04f200…09e600 09 20 20 20 20 68 64 72 73 69 7a 65 2b 2b 3b 0a 09 20 20 20 20 69 66 20 28 28 21 69 73 63 6e 74 ┆ hdrsize++; if ((!iscnt┆ 0x04f200…09e600 72 6c 20 28 63 29 20 7c 7c 20 63 20 3d 3d 20 27 5c 62 27 20 7c 7c 20 63 20 3d 3d 20 27 5c 74 27 ┆rl (c) || c == '\b' || c == '\t'┆ 0x04f200…09e600 29 20 26 26 20 6e 2b 2b 20 3c 20 6c 65 6e 29 0a 09 09 2a 63 70 2b 2b 20 3d 20 63 3b 0a 09 7d 0a ┆) && n++ < len) *cp++ = c; } ┆ 0x04f200…09e600 09 69 66 20 28 63 20 21 3d 20 45 4f 46 29 0a 09 20 20 20 20 68 64 72 73 69 7a 65 2b 2b 3b 0a 20 ┆ if (c != EOF) hdrsize++; ┆ 0x04f200…09e600 20 20 20 7d 0a 2f 2a 0a 20 20 20 69 66 20 28 63 20 21 3d 20 45 4f 46 29 0a 09 68 64 72 73 69 7a ┆ } /* if (c != EOF) hdrsiz┆ 0x04f200…09e600 65 2b 2b 3b 0a 2a 2f 0a 20 20 20 20 69 66 20 28 6e 20 3e 3d 20 6c 65 6e 20 2d 20 31 29 0a 09 63 ┆e++; */ if (n >= len - 1) c┆ 0x04f200…09e600 70 20 3d 20 62 75 66 20 2b 20 6c 65 6e 20 2d 20 32 3b 0a 20 20 20 20 2a 63 70 2b 2b 20 3d 20 27 ┆p = buf + len - 2; *cp++ = '┆ 0x04f200…09e600 5c 6e 27 3b 0a 20 20 20 20 2a 63 70 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 69 66 20 28 63 20 21 ┆\n'; *cp = '\0'; if (c !┆ 0x04f200…09e600 3d 20 45 4f 46 29 0a 20 20 20 20 7b 0a 09 28 76 6f 69 64 29 20 75 6e 67 65 74 63 28 63 2c 20 66 ┆= EOF) { (void) ungetc(c, f┆ 0x04f200…09e600 70 29 3b 09 2f 2a 20 70 75 73 68 20 62 61 63 6b 20 66 69 72 73 74 20 63 68 61 72 20 6f 66 20 6e ┆p); /* push back first char of n┆ 0x04f200…09e600 65 78 74 20 68 65 61 64 65 72 20 2a 2f 0a 2f 2a 09 68 64 72 73 69 7a 65 2d 2d 3b 09 2a 2f 0a 20 ┆ext header */ /* hdrsize--; */ ┆ 0x04f200…09e600 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 28 62 75 66 29 3b 0a 7d 0a 0a 69 6e 74 20 68 72 65 ┆ } return(buf); } int hre┆ 0x04f200…09e600 61 64 28 68 70 2c 20 6d 61 78 73 69 7a 65 2c 20 66 70 29 0a 2f 2a 0a 20 2a 20 52 65 61 64 20 68 ┆ad(hp, maxsize, fp) /* * Read h┆ 0x04f200…09e600 65 61 64 65 72 20 66 72 6f 6d 20 66 69 6c 65 20 66 70 20 69 6e 74 6f 20 2a 68 70 2e 0a 20 2a 20 ┆eader from file fp into *hp. * ┆ 0x04f200…09e600 52 65 74 75 72 6e 20 68 65 61 64 65 72 20 6c 65 6e 67 74 68 20 69 66 20 68 65 61 64 65 72 20 6f ┆Return header length if header o┆ 0x04f200…09e600 6b 61 79 2c 20 65 6c 73 65 20 30 2e 0a 20 2a 2f 0a 72 65 67 69 73 74 65 72 20 68 64 72 5f 74 20 ┆kay, else 0. */ register hdr_t ┆ 0x04f200…09e600 2a 68 70 3b 0a 6c 6f 6e 67 20 6d 61 78 73 69 7a 65 3b 0a 46 49 4c 45 20 2a 66 70 3b 0a 7b 0a 20 ┆*hp; long maxsize; FILE *fp; { ┆ 0x04f200…09e600 20 20 20 63 68 61 72 20 6c 62 75 66 5b 4c 42 55 46 4c 45 4e 5d 3b 09 09 2f 2a 20 73 69 7a 65 6f ┆ char lbuf[LBUFLEN]; /* sizeo┆ 0x04f200…09e600 66 28 6c 62 75 66 29 20 3d 20 6c 6f 6e 67 65 73 74 20 6c 69 6e 65 20 77 65 20 63 61 6e 20 68 61 ┆f(lbuf) = longest line we can ha┆ 0x04f200…09e600 6e 64 6c 65 20 2a 2f 0a 20 20 20 20 66 6f 72 77 61 72 64 20 73 74 61 74 69 63 20 69 6e 74 20 61 ┆ndle */ forward static int a┆ 0x04f200…09e600 64 64 68 6c 69 6e 65 28 29 3b 0a 20 20 20 20 0a 20 20 20 20 69 66 20 28 66 70 20 3d 3d 20 28 46 ┆ddhline(); if (fp == (F┆ 0x04f200…09e600 49 4c 45 20 2a 29 4e 55 4c 4c 29 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a 20 20 20 20 65 6c 73 65 ┆ILE *)NULL) return(0); else┆ 0x04f200…09e600 0a 09 68 70 2d 3e 68 5f 66 70 20 3d 20 66 70 3b 0a 0a 20 20 20 20 68 64 72 73 69 7a 65 20 3d 20 ┆ hp->h_fp = fp; hdrsize = ┆ 0x04f200…09e600 30 3b 0a 20 20 20 20 68 64 72 6c 69 6e 65 6e 6f 20 3d 20 31 3b 0a 20 20 20 20 68 70 2d 3e 68 5f ┆0; hdrlineno = 1; hp->h_┆ 0x04f200…09e600 73 74 61 72 74 6f 66 66 20 3d 20 66 74 65 6c 6c 28 66 70 29 3b 0a 20 20 20 20 77 68 69 6c 65 20 ┆startoff = ftell(fp); while ┆ 0x04f200…09e600 28 68 66 67 65 74 73 28 6c 62 75 66 2c 20 73 69 7a 65 6f 66 28 6c 62 75 66 29 20 2d 20 31 2c 20 ┆(hfgets(lbuf, sizeof(lbuf) - 1, ┆ 0x04f200…09e600 66 70 29 20 21 3d 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 0a 09 69 66 20 28 61 64 64 68 6c 69 ┆fp) != (char *)NULL) if (addhli┆ 0x04f200…09e600 6e 65 28 68 70 2c 20 6c 62 75 66 29 20 3d 3d 20 46 41 49 4c 29 0a 09 20 20 20 20 62 72 65 61 6b ┆ne(hp, lbuf) == FAIL) break┆ 0x04f200…09e600 3b 0a 20 20 20 20 20 20 20 20 65 6c 73 65 20 69 66 20 28 6d 61 78 73 69 7a 65 20 26 26 20 28 68 ┆; else if (maxsize && (h┆ 0x04f200…09e600 64 72 73 69 7a 65 20 3e 20 6d 61 78 73 69 7a 65 29 29 0a 09 20 20 20 20 72 65 74 75 72 6e 28 30 ┆drsize > maxsize)) return(0┆ 0x04f200…09e600 29 3b 0a 20 20 20 20 68 70 2d 3e 68 5f 74 65 78 74 6f 66 66 20 3d 20 66 74 65 6c 6c 28 66 70 29 ┆); hp->h_textoff = ftell(fp)┆ 0x04f200…09e600 3b 0a 0a 20 20 20 20 2f 2a 20 77 65 20 64 6f 6e 27 74 20 63 68 65 63 6b 20 66 6f 72 20 61 6c 6c ┆; /* we don't check for all┆ 0x04f200…09e600 20 74 68 65 20 52 46 43 2d 31 30 33 36 20 72 65 71 75 69 72 65 64 20 68 65 61 64 65 72 73 20 68 ┆ the RFC-1036 required headers h┆ 0x04f200…09e600 65 72 65 20 2a 2f 0a 20 20 20 20 69 66 20 28 68 6c 62 6c 61 6e 6b 28 68 70 2d 3e 68 5f 66 72 6f ┆ere */ if (hlblank(hp->h_fro┆ 0x04f200…09e600 6d 29 20 7c 7c 20 68 6c 62 6c 61 6e 6b 28 68 70 2d 3e 68 5f 70 61 74 68 29 20 7c 7c 20 68 70 2d ┆m) || hlblank(hp->h_path) || hp-┆ 0x04f200…09e600 3e 68 5f 70 6f 73 74 74 69 6d 65 20 3d 3d 20 30 29 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a 0a 20 ┆>h_posttime == 0) return(0); ┆ 0x04f200…09e600 20 20 20 72 65 74 75 72 6e 28 68 64 72 73 69 7a 65 29 3b 0a 7d 0a 0a 76 6f 69 64 20 68 77 72 69 ┆ return(hdrsize); } void hwri┆ 0x04f200…09e600 74 65 28 68 70 2c 20 66 70 2c 20 77 72 29 0a 2f 2a 0a 20 2a 20 57 72 69 74 65 20 68 65 61 64 65 ┆te(hp, fp, wr) /* * Write heade┆ 0x04f200…09e600 72 20 61 74 20 27 68 70 27 20 6f 6e 20 73 74 72 65 61 6d 20 27 66 70 27 20 69 6e 20 42 20 66 6f ┆r at 'hp' on stream 'fp' in B fo┆ 0x04f200…09e600 72 6d 61 74 2e 20 20 49 6e 63 6c 75 64 65 20 72 65 63 65 69 76 65 64 20 64 61 74 65 0a 20 2a 20 ┆rmat. Include received date * ┆ 0x04f200…09e600 69 66 20 77 72 20 69 73 20 54 52 55 45 2e 0a 20 2a 2f 0a 72 65 67 69 73 74 65 72 20 68 64 72 5f ┆if wr is TRUE. */ register hdr_┆ 0x04f200…09e600 74 20 2a 68 70 3b 0a 72 65 67 69 73 74 65 72 20 46 49 4c 45 20 2a 66 70 3b 0a 62 6f 6f 6c 09 77 ┆t *hp; register FILE *fp; bool w┆ 0x04f200…09e600 72 3b 0a 7b 0a 20 20 20 20 69 66 20 28 68 6c 6e 62 6c 61 6e 6b 28 68 70 2d 3e 68 5f 70 61 74 68 ┆r; { if (hlnblank(hp->h_path┆ 0x04f200…09e600 29 29 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 69 66 20 28 68 6c 6e 62 6c 61 6e 6b 28 68 70 ┆)) { if (hlnblank(hp┆ 0x04f200…09e600 2d 3e 68 5f 74 6f 29 29 0a 09 20 20 20 20 28 76 6f 69 64 29 20 66 70 75 74 73 28 22 4e 65 77 73 ┆->h_to)) (void) fputs("News┆ 0x04f200…09e600 2d 22 2c 20 66 70 29 3b 0a 0a 09 69 66 20 28 70 72 65 66 69 78 28 68 70 2d 3e 68 5f 70 61 74 68 ┆-", fp); if (prefix(hp->h_path┆ 0x04f200…09e600 2c 20 73 69 74 65 2e 70 61 74 68 6e 61 6d 65 29 20 26 26 0a 09 09 09 73 74 72 63 68 72 28 4e 45 ┆, site.pathname) && strchr(NE┆ 0x04f200…09e600 54 43 48 52 53 2c 20 68 70 2d 3e 68 5f 70 61 74 68 5b 73 74 72 6c 65 6e 28 73 69 74 65 2e 70 61 ┆TCHRS, hp->h_path[strlen(site.pa┆ 0x04f200…09e600 74 68 6e 61 6d 65 29 5d 29 29 0a 09 20 20 20 20 28 76 6f 69 64 29 20 66 70 72 69 6e 74 66 28 66 ┆thname)])) (void) fprintf(f┆ 0x04f200…09e600 70 2c 20 22 50 61 74 68 3a 20 25 73 5c 6e 22 2c 20 68 70 2d 3e 68 5f 70 61 74 68 29 3b 0a 09 65 ┆p, "Path: %s\n", hp->h_path); e┆ 0x04f200…09e600 6c 73 65 0a 09 20 20 20 20 28 76 6f 69 64 29 20 66 70 72 69 6e 74 66 28 66 70 2c 20 22 50 61 74 ┆lse (void) fprintf(fp, "Pat┆ 0x04f200…09e600 68 3a 20 25 73 21 25 73 5c 6e 22 2c 20 73 69 74 65 2e 70 61 74 68 6e 61 6d 65 2c 20 68 70 2d 3e ┆h: %s!%s\n", site.pathname, hp->┆ 0x04f200…09e600 68 5f 70 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 68 6c 6e 62 6c 61 6e 6b 28 ┆h_path); } if (hlnblank(┆ 0x04f200…09e600 68 70 2d 3e 68 5f 66 72 6f 6d 29 29 0a 09 28 76 6f 69 64 29 20 66 70 72 69 6e 74 66 28 66 70 2c ┆hp->h_from)) (void) fprintf(fp,┆ 0x04f200…09e600 20 22 46 72 6f 6d 3a 20 25 73 5c 6e 22 2c 20 68 70 2d 3e 68 5f 66 72 6f 6d 29 3b 0a 20 20 20 20 ┆ "From: %s\n", hp->h_from); ┆ 0x04f200…09e600 69 66 20 28 68 6c 6e 62 6c 61 6e 6b 28 68 70 2d 3e 68 5f 74 6f 29 29 0a 09 28 76 6f 69 64 29 20 ┆if (hlnblank(hp->h_to)) (void) ┆ 0x04f200…09e600 66 70 72 69 6e 74 66 28 66 70 2c 20 22 54 6f 3a 20 25 73 5c 6e 22 2c 20 68 70 2d 3e 68 5f 74 6f ┆fprintf(fp, "To: %s\n", hp->h_to┆ 0x04f200…09e600 29 3b 0a 20 20 20 20 69 66 20 28 68 6c 6e 62 6c 61 6e 6b 28 68 70 2d 3e 68 5f 6e 65 77 73 67 72 ┆); if (hlnblank(hp->h_newsgr┆ 0x04f200…09e600 6f 75 70 73 29 29 0a 20 20 20 20 20 20 20 20 28 76 6f 69 64 29 20 66 70 72 69 6e 74 66 28 66 70 ┆oups)) (void) fprintf(fp┆ 0x04f200…09e600 2c 20 22 4e 65 77 73 67 72 6f 75 70 73 3a 20 25 73 5c 6e 22 2c 20 68 70 2d 3e 68 5f 6e 65 77 73 ┆, "Newsgroups: %s\n", hp->h_news┆ 0x04f200…09e600 67 72 6f 75 70 73 29 3b 0a 20 20 20 20 69 66 20 28 68 6c 6e 62 6c 61 6e 6b 28 68 70 2d 3e 68 5f ┆groups); if (hlnblank(hp->h_┆ 0x04f200…09e600 73 75 62 6a 65 63 74 29 29 0a 20 20 20 20 09 28 76 6f 69 64 29 20 66 70 72 69 6e 74 66 28 66 70 ┆subject)) (void) fprintf(fp┆ 0x04f200…09e600 2c 20 22 53 75 62 6a 65 63 74 3a 20 25 73 5c 6e 22 2c 20 68 70 2d 3e 68 5f 73 75 62 6a 65 63 74 ┆, "Subject: %s\n", hp->h_subject┆ 0x04f200…09e600 29 3b 0a 20 20 20 20 69 66 20 28 68 6c 6e 62 6c 61 6e 6b 28 68 70 2d 3e 68 5f 69 64 65 6e 74 29 ┆); if (hlnblank(hp->h_ident)┆ 0x04f200…09e600 29 0a 09 28 76 6f 69 64 29 20 66 70 72 69 6e 74 66 28 66 70 2c 20 22 4d 65 73 73 61 67 65 2d 49 ┆) (void) fprintf(fp, "Message-I┆ 0x04f200…09e600 44 3a 20 25 73 5c 6e 22 2c 20 68 70 2d 3e 68 5f 69 64 65 6e 74 29 3b 0a 20 20 20 20 69 66 20 28 ┆D: %s\n", hp->h_ident); if (┆ 0x04f200…09e600 68 70 2d 3e 68 5f 70 6f 73 74 74 69 6d 65 29 0a 09 69 66 20 28 68 70 2d 3e 68 5f 70 6f 73 74 74 ┆hp->h_posttime) if (hp->h_postt┆ 0x04f200…09e600 69 6d 65 20 3e 20 30 29 0a 09 20 20 20 20 28 76 6f 69 64 29 20 66 70 72 69 6e 74 66 28 66 70 2c ┆ime > 0) (void) fprintf(fp,┆ 0x04f200…09e600 20 22 44 61 74 65 3a 20 25 73 5c 6e 22 2c 20 61 72 70 61 64 61 74 65 28 26 68 70 2d 3e 68 5f 70 ┆ "Date: %s\n", arpadate(&hp->h_p┆ 0x04f200…09e600 6f 73 74 74 69 6d 65 29 29 3b 0a 09 65 6c 73 65 0a 09 7b 0a 09 20 20 20 20 74 69 6d 65 5f 74 09 ┆osttime)); else { time_t ┆ 0x04f200…09e600 6e 6f 77 20 3d 20 74 69 6d 65 28 28 74 69 6d 65 5f 74 20 2a 29 4e 55 4c 4c 29 3b 0a 0a 09 20 20 ┆now = time((time_t *)NULL); ┆ 0x04f200…09e600 20 20 28 76 6f 69 64 29 20 66 70 72 69 6e 74 66 28 66 70 2c 20 22 44 61 74 65 3a 20 25 73 5c 6e ┆ (void) fprintf(fp, "Date: %s\n┆ 0x04f200…09e600 22 2c 20 61 72 70 61 64 61 74 65 28 26 6e 6f 77 29 29 3b 0a 09 20 20 20 20 28 76 6f 69 64 29 20 ┆", arpadate(&now)); (void) ┆ 0x04f200…09e600 66 70 72 69 6e 74 66 28 66 70 2c 20 22 58 2d 55 6e 70 61 72 73 61 62 6c 65 2d 44 61 74 65 3a 20 ┆fprintf(fp, "X-Unparsable-Date: ┆ 0x04f200…09e600 25 73 5c 6e 22 2c 20 68 70 2d 3e 68 5f 70 6f 73 74 64 61 74 65 29 3b 0a 09 7d 0a 20 20 20 20 69 ┆%s\n", hp->h_postdate); } i┆ 0x04f200…09e600 66 20 28 77 72 20 26 26 20 68 70 2d 3e 68 5f 72 65 63 74 69 6d 65 29 0a 09 28 76 6f 69 64 29 20 ┆f (wr && hp->h_rectime) (void) ┆ 0x04f200…09e600 66 70 72 69 6e 74 66 28 66 70 2c 20 22 44 61 74 65 2d 52 65 63 65 69 76 65 64 3a 20 25 73 5c 6e ┆fprintf(fp, "Date-Received: %s\n┆ 0x04f200…09e600 22 2c 20 61 72 70 61 64 61 74 65 28 26 68 70 2d 3e 68 5f 72 65 63 74 69 6d 65 29 29 3b 0a 20 20 ┆", arpadate(&hp->h_rectime)); ┆ 0x04f200…09e600 20 20 69 66 20 28 68 70 2d 3e 68 5f 65 78 70 74 69 6d 65 29 0a 09 28 76 6f 69 64 29 20 66 70 72 ┆ if (hp->h_exptime) (void) fpr┆ 0x04f200…09e600 69 6e 74 66 28 66 70 2c 20 22 45 78 70 69 72 65 73 3a 20 25 73 5c 6e 22 2c 20 61 72 70 61 64 61 ┆intf(fp, "Expires: %s\n", arpada┆ 0x04f200…09e600 74 65 28 26 68 70 2d 3e 68 5f 65 78 70 74 69 6d 65 29 29 3b 0a 20 20 20 20 69 66 20 28 68 6c 6e ┆te(&hp->h_exptime)); if (hln┆ 0x04f200…09e600 62 6c 61 6e 6b 28 68 70 2d 3e 68 5f 72 65 66 65 72 65 6e 63 65 73 29 29 0a 09 69 66 20 28 68 6c ┆blank(hp->h_references)) if (hl┆ 0x04f200…09e600 6e 62 6c 61 6e 6b 28 68 70 2d 3e 68 5f 74 6f 29 29 0a 09 20 20 20 20 28 76 6f 69 64 29 20 66 70 ┆nblank(hp->h_to)) (void) fp┆ 0x04f200…09e600 72 69 6e 74 66 28 66 70 2c 20 22 49 6e 2d 52 65 70 6c 79 2d 54 6f 3a 20 25 73 5c 6e 22 2c 20 68 ┆rintf(fp, "In-Reply-To: %s\n", h┆ 0x04f200…09e600 70 2d 3e 68 5f 72 65 66 65 72 65 6e 63 65 73 29 3b 0a 09 65 6c 73 65 0a 09 20 20 20 20 28 76 6f ┆p->h_references); else (vo┆ 0x04f200…09e600 69 64 29 20 66 70 72 69 6e 74 66 28 66 70 2c 20 22 52 65 66 65 72 65 6e 63 65 73 3a 20 25 73 5c ┆id) fprintf(fp, "References: %s\┆ 0x04f200…09e600 6e 22 2c 20 68 70 2d 3e 68 5f 72 65 66 65 72 65 6e 63 65 73 29 3b 0a 20 20 20 20 69 66 20 28 68 ┆n", hp->h_references); if (h┆ 0x04f200…09e600 6c 6e 62 6c 61 6e 6b 28 68 70 2d 3e 68 5f 63 74 6c 6d 73 67 29 29 0a 09 28 76 6f 69 64 29 20 66 ┆lnblank(hp->h_ctlmsg)) (void) f┆ 0x04f200…09e600 70 72 69 6e 74 66 28 66 70 2c 20 22 43 6f 6e 74 72 6f 6c 3a 20 25 73 5c 6e 22 2c 20 68 70 2d 3e ┆printf(fp, "Control: %s\n", hp->┆ 0x04f200…09e600 68 5f 63 74 6c 6d 73 67 29 3b 0a 20 20 20 20 69 66 20 28 68 6c 6e 62 6c 61 6e 6b 28 68 70 2d 3e ┆h_ctlmsg); if (hlnblank(hp->┆ 0x04f200…09e600 68 5f 73 65 6e 64 65 72 29 29 0a 09 28 76 6f 69 64 29 20 66 70 72 69 6e 74 66 28 66 70 2c 20 22 ┆h_sender)) (void) fprintf(fp, "┆ 0x04f200…09e600 53 65 6e 64 65 72 3a 20 25 73 5c 6e 22 2c 20 68 70 2d 3e 68 5f 73 65 6e 64 65 72 29 3b 0a 20 20 ┆Sender: %s\n", hp->h_sender); ┆ 0x04f200…09e600 20 20 69 66 20 28 68 6c 6e 62 6c 61 6e 6b 28 68 70 2d 3e 68 5f 72 65 70 6c 79 74 6f 29 29 0a 09 ┆ if (hlnblank(hp->h_replyto)) ┆ 0x04f200…09e600 28 76 6f 69 64 29 20 66 70 72 69 6e 74 66 28 66 70 2c 20 22 52 65 70 6c 79 2d 54 6f 3a 20 25 73 ┆(void) fprintf(fp, "Reply-To: %s┆ 0x04f200…09e600 5c 6e 22 2c 20 68 70 2d 3e 68 5f 72 65 70 6c 79 74 6f 29 3b 0a 20 20 20 20 69 66 20 28 68 6c 6e ┆\n", hp->h_replyto); if (hln┆ 0x04f200…09e600 62 6c 61 6e 6b 28 68 70 2d 3e 68 5f 66 6f 6c 6c 6f 77 74 6f 29 29 0a 09 28 76 6f 69 64 29 20 66 ┆blank(hp->h_followto)) (void) f┆ 0x04f200…09e600 70 72 69 6e 74 66 28 66 70 2c 20 22 46 6f 6c 6c 6f 77 75 70 2d 54 6f 3a 20 25 73 5c 6e 22 2c 20 ┆printf(fp, "Followup-To: %s\n", ┆ 0x04f200…09e600 68 70 2d 3e 68 5f 66 6f 6c 6c 6f 77 74 6f 29 3b 0a 20 20 20 20 69 66 20 28 68 6c 6e 62 6c 61 6e ┆hp->h_followto); if (hlnblan┆ 0x04f200…09e600 6b 28 68 70 2d 3e 68 5f 64 69 73 74 72 69 62 75 74 69 6f 6e 29 29 0a 09 28 76 6f 69 64 29 20 66 ┆k(hp->h_distribution)) (void) f┆ 0x04f200…09e600 70 72 69 6e 74 66 28 66 70 2c 20 22 44 69 73 74 72 69 62 75 74 69 6f 6e 3a 20 25 73 5c 6e 22 2c ┆printf(fp, "Distribution: %s\n",┆ 0x04f200…09e600 20 68 70 2d 3e 68 5f 64 69 73 74 72 69 62 75 74 69 6f 6e 29 3b 0a 20 20 20 20 69 66 20 28 68 6c ┆ hp->h_distribution); if (hl┆ 0x04f200…09e600 6e 62 6c 61 6e 6b 28 68 70 2d 3e 68 5f 6f 72 67 61 6e 69 7a 61 74 69 6f 6e 29 29 0a 09 28 76 6f ┆nblank(hp->h_organization)) (vo┆ 0x04f200…09e600 69 64 29 20 66 70 72 69 6e 74 66 28 66 70 2c 20 22 4f 72 67 61 6e 69 7a 61 74 69 6f 6e 3a 20 25 ┆id) fprintf(fp, "Organization: %┆ 0x04f200…09e600 73 5c 6e 22 2c 20 68 70 2d 3e 68 5f 6f 72 67 61 6e 69 7a 61 74 69 6f 6e 29 3b 0a 20 20 20 20 69 ┆s\n", hp->h_organization); i┆ 0x04f200…09e600 66 20 28 68 6c 6e 62 6c 61 6e 6b 28 68 70 2d 3e 68 5f 6b 65 79 77 6f 72 64 73 29 29 0a 09 28 76 ┆f (hlnblank(hp->h_keywords)) (v┆ 0x04f200…09e600 6f 69 64 29 20 66 70 72 69 6e 74 66 28 66 70 2c 20 22 4b 65 79 77 6f 72 64 73 3a 20 25 73 5c 6e ┆oid) fprintf(fp, "Keywords: %s\n┆ 0x04f200…09e600 22 2c 20 68 70 2d 3e 68 5f 6b 65 79 77 6f 72 64 73 29 3b 0a 20 20 20 20 69 66 20 28 68 6c 6e 62 ┆", hp->h_keywords); if (hlnb┆ 0x04f200…09e600 6c 61 6e 6b 28 68 70 2d 3e 68 5f 73 75 6d 6d 61 72 79 29 29 0a 09 28 76 6f 69 64 29 20 66 70 72 ┆lank(hp->h_summary)) (void) fpr┆ 0x04f200…09e600 69 6e 74 66 28 66 70 2c 20 22 53 75 6d 6d 61 72 79 3a 20 25 73 5c 6e 22 2c 20 68 70 2d 3e 68 5f ┆intf(fp, "Summary: %s\n", hp->h_┆ 0x04f200…09e600 73 75 6d 6d 61 72 79 29 3b 0a 20 20 20 20 69 66 20 28 68 70 2d 3e 68 5f 69 6e 74 70 72 69 6f 72 ┆summary); if (hp->h_intprior┆ 0x04f200…09e600 69 74 79 29 0a 09 28 76 6f 69 64 29 20 66 70 72 69 6e 74 66 28 66 70 2c 20 22 50 72 69 6f 72 69 ┆ity) (void) fprintf(fp, "Priori┆ 0x04f200…09e600 74 79 3a 20 25 64 5c 6e 22 2c 20 68 70 2d 3e 68 5f 69 6e 74 70 72 69 6f 72 69 74 79 29 3b 0a 20 ┆ty: %d\n", hp->h_intpriority); ┆ 0x04f200…09e600 20 20 20 69 66 20 28 68 6c 6e 62 6c 61 6e 6b 28 68 70 2d 3e 68 5f 61 70 70 72 6f 76 65 64 29 29 ┆ if (hlnblank(hp->h_approved))┆ 0x04f200…09e600 0a 09 28 76 6f 69 64 29 20 66 70 72 69 6e 74 66 28 66 70 2c 20 22 41 70 70 72 6f 76 65 64 3a 20 ┆ (void) fprintf(fp, "Approved: ┆ 0x04f200…09e600 25 73 5c 6e 22 2c 20 68 70 2d 3e 68 5f 61 70 70 72 6f 76 65 64 29 3b 0a 20 20 20 20 69 66 20 28 ┆%s\n", hp->h_approved); if (┆ 0x04f200…09e600 68 6c 6e 62 6c 61 6e 6b 28 68 70 2d 3e 68 5f 73 75 70 65 72 73 65 64 65 73 29 29 0a 09 28 76 6f ┆hlnblank(hp->h_supersedes)) (vo┆ 0x04f200…09e600 69 64 29 20 66 70 72 69 6e 74 66 28 66 70 2c 20 22 53 75 70 65 72 73 65 64 65 73 3a 20 25 73 5c ┆id) fprintf(fp, "Supersedes: %s\┆ 0x04f200…09e600 6e 22 2c 20 68 70 2d 3e 68 5f 73 75 70 65 72 73 65 64 65 73 29 3b 0a 20 20 20 20 69 66 20 28 68 ┆n", hp->h_supersedes); if (h┆ 0x04f200…09e600 6c 6e 62 6c 61 6e 6b 28 68 70 2d 3e 68 5f 63 6f 6e 74 65 6e 74 74 79 70 65 29 29 0a 09 28 76 6f ┆lnblank(hp->h_contenttype)) (vo┆ 0x04f200…09e600 69 64 29 20 66 70 72 69 6e 74 66 28 66 70 2c 20 22 43 6f 6e 74 65 6e 74 2d 54 79 70 65 3a 20 25 ┆id) fprintf(fp, "Content-Type: %┆ 0x04f200…09e600 73 5c 6e 22 2c 20 68 70 2d 3e 68 5f 73 75 70 65 72 73 65 64 65 73 29 3b 0a 23 69 66 64 65 66 20 ┆s\n", hp->h_supersedes); #ifdef ┆ 0x04f200…09e600 5a 41 50 4e 4f 54 45 53 0a 20 20 20 20 69 66 20 28 68 6c 6e 62 6c 61 6e 6b 28 68 70 2d 3e 68 5f ┆ZAPNOTES if (hlnblank(hp->h_┆ 0x04f200…09e600 6e 66 69 64 29 29 0a 09 28 76 6f 69 64 29 20 66 70 72 69 6e 74 66 28 66 70 2c 20 22 4e 66 2d 49 ┆nfid)) (void) fprintf(fp, "Nf-I┆ 0x04f200…09e600 44 3a 20 25 73 5c 6e 22 2c 20 68 70 2d 3e 68 5f 6e 66 69 64 29 3b 0a 20 20 20 20 69 66 20 28 68 ┆D: %s\n", hp->h_nfid); if (h┆ 0x04f200…09e600 6c 6e 62 6c 61 6e 6b 28 68 70 2d 3e 68 5f 6e 66 66 72 6f 6d 29 29 0a 09 28 76 6f 69 64 29 20 66 ┆lnblank(hp->h_nffrom)) (void) f┆ 0x04f200…09e600 70 72 69 6e 74 66 28 66 70 2c 20 22 4e 66 2d 46 72 6f 6d 3a 20 25 73 5c 6e 22 2c 20 68 70 2d 3e ┆printf(fp, "Nf-From: %s\n", hp->┆ 0x04f200…09e600 68 5f 6e 66 66 72 6f 6d 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 5a 41 50 4e 4f 54 45 53 20 2a 2f ┆h_nffrom); #endif /* ZAPNOTES */┆ 0x04f200…09e600 0a 23 69 66 64 65 66 20 44 4f 58 52 45 46 53 0a 20 20 20 20 69 66 20 28 68 6c 6e 62 6c 61 6e 6b ┆ #ifdef DOXREFS if (hlnblank┆ 0x04f200…09e600 28 68 70 2d 3e 68 5f 78 72 65 66 29 29 0a 20 20 20 20 7b 0a 09 63 68 61 72 20 2a 63 6f 6c 6f 6e ┆(hp->h_xref)) { char *colon┆ 0x04f200…09e600 3b 0a 0a 09 69 66 20 28 28 63 6f 6c 6f 6e 20 3d 20 73 74 72 63 68 72 28 68 70 2d 3e 68 5f 78 72 ┆; if ((colon = strchr(hp->h_xr┆ 0x04f200…09e600 65 66 2c 20 27 3a 27 29 29 20 21 3d 20 4e 55 4c 4c 0a 09 20 26 26 20 28 63 6f 6c 6f 6e 20 3d 20 ┆ef, ':')) != NULL && (colon = ┆ 0x04f200…09e600 73 74 72 63 68 72 28 63 6f 6c 6f 6e 20 2b 20 31 2c 20 27 3a 27 29 29 20 21 3d 20 4e 55 4c 4c 29 ┆strchr(colon + 1, ':')) != NULL)┆ 0x04f200…09e600 0a 09 20 20 20 20 28 76 6f 69 64 29 20 66 70 72 69 6e 74 66 28 66 70 2c 20 22 58 72 65 66 3a 20 ┆ (void) fprintf(fp, "Xref: ┆ 0x04f200…09e600 25 73 5c 6e 22 2c 20 68 70 2d 3e 68 5f 78 72 65 66 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 ┆%s\n", hp->h_xref); } #endif┆ 0x04f200…09e600 20 2f 2a 20 44 4f 58 52 45 46 53 20 2a 2f 0a 20 20 20 20 69 66 20 28 68 6c 6e 62 6c 61 6e 6b 28 ┆ /* DOXREFS */ if (hlnblank(┆ 0x04f200…09e600 68 70 2d 3e 68 5f 62 61 63 6b 72 65 66 73 29 29 0a 09 28 76 6f 69 64 29 20 66 70 72 69 6e 74 66 ┆hp->h_backrefs)) (void) fprintf┆ 0x04f200…09e600 28 66 70 2c 20 22 42 61 63 6b 2d 52 65 66 65 72 65 6e 63 65 73 3a 20 25 73 5c 6e 22 2c 20 68 70 ┆(fp, "Back-References: %s\n", hp┆ 0x04f200…09e600 2d 3e 68 5f 62 61 63 6b 72 65 66 73 29 3b 0a 20 20 20 20 69 66 20 28 68 70 2d 3e 68 5f 6f 74 68 ┆->h_backrefs); if (hp->h_oth┆ 0x04f200…09e600 65 72 20 21 3d 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 0a 09 28 76 6f 69 64 29 20 66 70 75 74 ┆er != (char *)NULL) (void) fput┆ 0x04f200…09e600 73 28 68 70 2d 3e 68 5f 6f 74 68 65 72 2c 20 66 70 29 3b 0a 20 20 20 20 69 66 20 28 68 70 2d 3e ┆s(hp->h_other, fp); if (hp->┆ 0x04f200…09e600 68 5f 69 6e 74 6e 75 6d 6c 69 6e 65 73 29 0a 09 28 76 6f 69 64 29 20 66 70 72 69 6e 74 66 28 66 ┆h_intnumlines) (void) fprintf(f┆ 0x04f200…09e600 70 2c 20 22 4c 69 6e 65 73 3a 20 25 64 5c 6e 22 2c 20 68 70 2d 3e 68 5f 69 6e 74 6e 75 6d 6c 69 ┆p, "Lines: %d\n", hp->h_intnumli┆ 0x04f200…09e600 6e 65 73 29 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 70 75 74 63 28 27 5c 6e 27 2c 20 66 70 29 3b ┆nes); (void) putc('\n', fp);┆ 0x04f200…09e600 0a 7d 0a 0a 63 68 61 72 20 2a 74 61 69 6c 70 61 74 68 28 68 70 29 0a 2f 2a 20 72 65 74 75 72 6e ┆ } char *tailpath(hp) /* return┆ 0x04f200…09e600 20 61 20 22 2e 2e 21 3c 73 69 74 65 3e 21 3c 6e 61 6d 65 3e 22 20 61 62 62 72 65 76 69 61 74 69 ┆ a "..!<site>!<name>" abbreviati┆ 0x04f200…09e600 6f 6e 20 66 6f 72 20 74 68 65 20 6d 65 73 73 61 67 65 20 73 65 6e 64 65 72 20 2a 2f 0a 68 64 72 ┆on for the message sender */ hdr┆ 0x04f200…09e600 5f 74 20 2a 68 70 3b 0a 7b 0a 20 20 20 20 63 68 61 72 20 2a 73 70 63 2c 20 2a 73 69 74 65 62 61 ┆_t *hp; { char *spc, *siteba┆ 0x04f200…09e600 6e 67 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63 68 61 72 20 70 61 74 68 62 75 66 5b 42 55 46 4c ┆ng; static char pathbuf[BUFL┆ 0x04f200…09e600 45 4e 5d 20 3d 20 22 2e 2e 2e 22 3b 0a 0a 20 20 20 20 69 66 20 28 73 70 63 20 3d 20 73 74 72 63 ┆EN] = "..."; if (spc = strc┆ 0x04f200…09e600 68 72 28 68 70 2d 3e 68 5f 70 61 74 68 2c 20 27 20 27 29 29 09 2f 2a 20 43 68 6f 70 20 6f 66 66 ┆hr(hp->h_path, ' ')) /* Chop off┆ 0x04f200…09e600 20 74 72 61 69 6c 69 6e 67 20 22 20 28 6e 61 6d 65 29 22 20 2a 2f 0a 09 2a 73 70 63 20 3d 20 27 ┆ trailing " (name)" */ *spc = '┆ 0x04f200…09e600 5c 30 27 3b 0a 20 20 20 20 69 66 20 28 73 69 74 65 62 61 6e 67 20 3d 20 73 74 72 72 63 68 72 28 ┆\0'; if (sitebang = strrchr(┆ 0x04f200…09e600 68 70 2d 3e 68 5f 70 61 74 68 2c 20 50 41 54 48 53 45 50 29 29 0a 20 20 20 20 7b 0a 09 77 68 69 ┆hp->h_path, PATHSEP)) { whi┆ 0x04f200…09e600 6c 65 20 28 73 69 74 65 62 61 6e 67 20 3e 20 68 70 2d 3e 68 5f 70 61 74 68 20 26 26 20 2a 2d 2d ┆le (sitebang > hp->h_path && *--┆ 0x04f200…09e600 73 69 74 65 62 61 6e 67 20 21 3d 20 50 41 54 48 53 45 50 29 0a 09 20 20 20 20 63 6f 6e 74 69 6e ┆sitebang != PATHSEP) contin┆ 0x04f200…09e600 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 0a 09 73 69 74 65 62 61 6e 67 20 3d 20 68 ┆ue; } else sitebang = h┆ 0x04f200…09e600 70 2d 3e 68 5f 70 61 74 68 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 73 74 72 63 70 79 28 70 61 74 ┆p->h_path; (void) strcpy(pat┆ 0x04f200…09e600 68 62 75 66 20 2b 20 33 2c 20 73 69 74 65 62 61 6e 67 29 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 ┆hbuf + 3, sitebang); (void) ┆ 0x04f200…09e600 6e 73 74 72 69 70 28 70 61 74 68 62 75 66 29 3b 0a 20 20 20 20 69 66 20 28 73 70 63 29 0a 09 2a ┆nstrip(pathbuf); if (spc) *┆ 0x04f200…09e600 73 70 63 20 3d 20 27 20 27 3b 0a 20 20 20 20 72 65 74 75 72 6e 28 70 61 74 68 62 75 66 29 3b 0a ┆spc = ' '; return(pathbuf); ┆ 0x04f200…09e600 7d 0a 0a 2f 2a 20 68 65 61 64 65 72 2e 63 20 65 6e 64 73 20 68 65 72 65 20 2a 2f 0a 69 61 74 69 ┆} /* header.c ends here */ iati┆ 0x04f200…09e600 6f 6e 20 66 6f 72 20 74 68 65 20 6d 65 73 73 61 67 65 20 73 65 6e 64 65 72 20 2a 2f 0a 68 64 72 ┆on for the message sender */ hdr┆ 0x04f200…09e600 5f 74 20 2a 68 70 3b 0a 7b 0a 20 20 20 20 63 68 61 72 20 2a 73 70 63 2c 20 2a 73 69 74 65 62 61 ┆_t *hp; { char *spc, *siteba┆ 0x04f200…09e600 6e 67 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63 68 61 72 20 70 61 74 68 62 75 66 5b 42 55 46 4c ┆ng; static char pathbuf[BUFL┆ 0x04f200…09e600 45 4e 5d 20 3d 20 22 2e 2e 2e 22 3b 0a 0a 20 20 20 20 69 66 20 28 73 70 63 20 3d 20 73 74 72 63 ┆EN] = "..."; if (spc = strc┆ 0x04f200…09e600 68 72 28 68 70 2d 3e 68 5f 70 61 74 68 2c 20 27 20 27 29 29 09 2f 2a 20 43 68 6f 70 20 6f 66 66 ┆hr(hp->h_path, ' ')) /* Chop off┆ 0x04f200…09e600 20 74 72 61 69 6c 69 6e 67 20 22 20 28 6e 61 6d 65 29 22 20 2a 2f 0a 09 2a 73 70 63 20 3d 20 27 ┆ trailing " (name)" */ *spc = '┆ 0x04f200…09e600 5c 30 27 3b 0a 20 20 20 20 69 66 20 28 73 69 74 65 62 61 6e 67 20 3d 20 73 74 72 72 63 68 72 28 ┆\0'; if (sitebang = strrchr(┆ 0x04f200…09e600 68 70 2d 3e 68 5f 70 61 74 68 2c 20 50 41 54 48 53 45 50 29 29 0a 20 20 20 20 7b 0a 09 77 68 69 ┆hp->h_path, PATHSEP)) { whi┆ 0x04f200…09e600 6c 65 20 28 73 69 74 65 62 61 6e 67 20 3e 20 68 70 2d 3e 68 5f 70 61 74 68 20 26 26 20 2a 2d 2d ┆le (sitebang > hp->h_path && *--┆ 0x04f200…09e600 73 69 74 65 62 61 6e 67 20 21 3d 20 50 41 54 48 53 45 50 29 0a 09 20 20 20 20 63 6f 6e 74 69 6e ┆sitebang != PATHSEP) contin┆ 0x04f200…09e600 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 0a 09 73 69 74 65 62 61 6e 67 20 3d 20 68 ┆ue; } else sitebang = h┆ 0x04f200…09e600 70 2d 3e 68 5f 70 61 74 68 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 73 74 72 63 70 79 28 70 61 74 ┆p->h_path; (void) strcpy(pat┆ 0x04f200…09e600 68 62 75 66 20 2b 20 33 2c 20 73 69 74 65 62 61 6e 67 29 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 ┆hbuf + 3, sitebang); (void) ┆ 0x04f200…09e600 6e 73 74 72 69 70 28 70 61 74 68 62 75 66 29 3b 0a 20 20 20 20 69 66 20 28 73 70 63 29 0a 09 2a ┆nstrip(pathbuf); if (spc) *┆ 0x04f200…09e600 73 70 63 20 3d 20 27 20 27 3b 0a 20 20 20 20 72 65 74 75 72 6e 28 70 61 74 68 62 75 66 29 3b 0a ┆spc = ' '; return(pathbuf); ┆ 0x04f200…09e600 7d 0a 0a 2f 2a 20 68 65 61 64 65 72 2e 63 20 65 6e 73 72 63 2f 44 2e 6e 65 77 73 2f 72 64 62 69 ┆} /* header.c ensrc/D.news/rdbi┆ 0x04f200…09e600 74 73 2e 63 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆ts.c ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆ ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 20 20 20 34 34 34 20 00 20 20 20 ┆ 444 ┆ 0x04f200…09e600 31 34 35 20 00 20 20 20 20 20 31 20 00 20 20 20 20 20 20 32 30 36 31 31 20 20 34 34 36 31 33 31 ┆145 1 20611 446131┆ 0x04f200…09e600 36 31 34 35 20 20 20 37 34 36 32 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆6145 7462 ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆ ┆ […0x9…] 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆ /**************┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆********************************┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 0a ┆****************************** ┆ 0x04f200…09e600 4e 41 4d 45 0a 20 20 20 72 64 62 69 74 73 2e 63 20 2d 2d 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 ┆NAME rdbits.c -- function for┆ 0x04f200…09e600 20 64 65 63 6f 64 69 6e 67 20 62 69 74 2d 6d 61 70 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e ┆ decoding bit-map representation┆ 0x04f200…09e600 73 0a 0a 53 59 4e 4f 50 53 49 53 0a 20 20 20 23 69 6e 63 6c 75 64 65 20 22 61 63 74 69 76 65 2e ┆s SYNOPSIS #include "active.┆ 0x04f200…09e600 68 22 0a 20 20 20 23 69 6e 63 6c 75 64 65 20 22 6e 65 77 73 72 63 2e 68 22 0a 0a 20 20 20 69 6e ┆h" #include "newsrc.h" in┆ 0x04f200…09e600 74 20 67 65 74 62 69 74 28 61 72 74 69 63 6c 65 2c 20 6e 67 70 29 09 2d 2d 20 67 65 74 20 72 65 ┆t getbit(article, ngp) -- get re┆ 0x04f200…09e600 61 64 2f 75 6e 72 65 61 64 20 73 74 61 74 75 73 20 6f 66 20 61 6e 20 61 72 74 69 63 6c 65 0a 20 ┆ad/unread status of an article ┆ 0x04f200…09e600 20 20 6e 61 72 74 5f 74 20 61 72 74 69 63 6c 65 3b 20 67 72 6f 75 70 5f 74 20 2a 6e 67 70 3b 0a ┆ nart_t article; group_t *ngp; ┆ 0x04f200…09e600 0a 20 20 20 69 6e 74 20 73 65 74 62 69 74 28 61 72 74 69 63 6c 65 2c 20 6e 67 70 29 09 2d 2d 20 ┆ int setbit(article, ngp) -- ┆ 0x04f200…09e600 6d 61 72 6b 20 61 6e 20 61 72 74 69 63 6c 65 20 72 65 61 64 0a 20 20 20 6e 61 72 74 5f 74 20 61 ┆mark an article read nart_t a┆ 0x04f200…09e600 72 74 69 63 6c 65 3b 20 67 72 6f 75 70 5f 74 20 2a 6e 67 70 3b 0a 0a 20 20 20 69 6e 74 20 63 6c ┆rticle; group_t *ngp; int cl┆ 0x04f200…09e600 65 61 72 62 69 74 28 61 72 74 69 63 6c 65 2c 20 6e 67 70 29 09 2d 2d 20 6d 61 72 6b 20 61 6e 20 ┆earbit(article, ngp) -- mark an ┆ 0x04f200…09e600 61 72 74 69 63 6c 65 20 75 6e 72 65 61 64 0a 20 20 20 6e 61 72 74 5f 74 20 61 72 74 69 63 6c 65 ┆article unread nart_t article┆ 0x04f200…09e600 3b 20 67 72 6f 75 70 5f 74 20 2a 6e 67 70 3b 0a 0a 20 20 20 69 6e 74 20 72 64 62 69 74 73 28 6d ┆; group_t *ngp; int rdbits(m┆ 0x04f200…09e600 6f 64 65 2c 20 63 70 2c 20 6e 67 70 29 09 2d 2d 20 73 65 74 2f 63 6c 65 61 72 20 74 68 65 20 62 ┆ode, cp, ngp) -- set/clear the b┆ 0x04f200…09e600 69 74 73 20 69 6d 70 6c 69 65 64 20 62 79 20 6c 69 6e 65 20 63 70 20 69 6e 20 6e 67 70 0a 20 20 ┆its implied by line cp in ngp ┆ 0x04f200…09e600 20 69 6e 74 20 6d 6f 64 65 3b 20 63 68 61 72 20 2a 63 70 3b 20 67 72 6f 75 70 5f 74 20 2a 6e 67 ┆ int mode; char *cp; group_t *ng┆ 0x04f200…09e600 70 3b 0a 0a 44 45 53 43 52 49 50 54 49 4f 4e 0a 20 20 20 54 68 65 20 72 64 62 69 74 73 28 29 20 ┆p; DESCRIPTION The rdbits() ┆ 0x04f200…09e600 66 75 6e 63 74 69 6f 6e 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 61 72 73 65 73 20 61 20 6c 69 73 74 ┆function following parses a list┆ 0x04f200…09e600 20 6f 66 20 6e 75 6d 65 72 69 63 20 6c 69 74 65 72 61 6c 73 0a 61 6c 74 65 72 6e 61 74 69 6e 67 ┆ of numeric literals alternating┆ 0x04f200…09e600 20 77 69 74 68 20 64 61 73 68 65 73 20 61 6e 64 2f 6f 72 20 63 6f 6d 6d 61 73 20 69 6e 74 6f 20 ┆ with dashes and/or commas into ┆ 0x04f200…09e600 63 6f 6d 6d 61 6e 64 73 20 74 6f 20 63 68 61 6e 67 65 20 73 65 63 74 69 6f 6e 73 0a 6f 66 20 61 ┆commands to change sections of a┆ 0x04f200…09e600 20 67 72 6f 75 70 27 73 20 62 69 74 6d 61 70 2e 20 49 74 20 61 6c 73 6f 20 61 6c 74 65 72 73 20 ┆ group's bitmap. It also alters ┆ 0x04f200…09e600 74 68 65 20 67 72 6f 75 70 27 73 20 75 6e 72 65 61 64 2d 6d 65 73 73 61 67 65 20 63 6f 75 6e 74 ┆the group's unread-message count┆ 0x04f200…09e600 0a 61 6e 64 20 74 68 65 20 63 6f 75 6e 74 20 6f 66 20 74 6f 74 61 6c 20 6d 65 73 73 61 67 65 73 ┆ and the count of total messages┆ 0x04f200…09e600 20 75 6e 72 65 61 64 20 61 70 70 72 6f 70 72 69 61 74 65 6c 79 2e 0a 20 20 20 57 65 20 64 65 66 ┆ unread appropriately. We def┆ 0x04f200…09e600 69 6e 65 20 74 68 69 73 20 73 65 70 61 72 61 74 65 6c 79 20 73 6f 20 74 68 61 74 20 6e 6f 6e 2d ┆ine this separately so that non-┆ 0x04f200…09e600 72 65 61 64 65 72 20 70 72 6f 67 72 61 6d 73 20 28 69 6e 20 70 61 72 74 69 63 75 6c 61 72 2c 0a ┆reader programs (in particular, ┆ 0x04f200…09e600 74 68 65 20 65 69 70 63 6c 69 62 2e 61 20 6c 69 62 72 61 72 79 29 20 63 61 6e 20 75 73 65 20 69 ┆the eipclib.a library) can use i┆ 0x04f200…09e600 74 2e 0a 0a 20 20 20 47 69 76 65 6e 20 61 20 76 61 6c 69 64 20 67 72 6f 75 70 20 64 61 74 61 20 ┆t. Given a valid group data ┆ 0x04f200…09e600 70 6f 69 6e 74 65 72 20 74 68 65 20 67 65 74 62 69 74 28 29 2c 20 73 65 74 62 69 74 28 29 20 61 ┆pointer the getbit(), setbit() a┆ 0x04f200…09e600 6e 64 20 63 6c 65 61 72 62 69 74 28 29 0a 66 75 6e 63 74 69 6f 6e 73 20 6d 61 79 20 62 65 20 75 ┆nd clearbit() functions may be u┆ 0x04f200…09e600 73 65 64 20 74 6f 20 65 78 61 6d 69 6e 65 20 61 6e 64 20 63 68 61 6e 67 65 20 74 68 65 20 6e 67 ┆sed to examine and change the ng┆ 0x04f200…09e600 5f 62 69 74 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 2d 20 62 75 74 0a 73 65 65 20 74 68 65 ┆_bits information -- but see the┆ 0x04f200…09e600 20 4d 41 43 52 4f 20 49 4e 54 45 52 46 41 43 45 20 73 65 63 74 69 6f 6e 20 62 65 6c 6f 77 2e 0a ┆ MACRO INTERFACE section below. ┆ 0x04f200…09e600 0a 54 48 45 20 4d 41 43 52 4f 20 49 4e 54 45 52 46 41 43 45 0a 20 20 20 53 6f 6d 65 20 6d 61 63 ┆ THE MACRO INTERFACE Some mac┆ 0x04f200…09e600 72 6f 73 20 61 72 65 20 64 65 66 69 6e 65 64 20 69 6e 20 6e 65 77 73 72 63 2e 68 20 74 68 61 74 ┆ros are defined in newsrc.h that┆ 0x04f200…09e600 20 64 65 66 69 6e 65 20 70 73 65 75 64 6f 2d 66 75 6e 63 74 69 6f 6e 61 6c 20 68 61 6e 64 6c 65 ┆ define pseudo-functional handle┆ 0x04f200…09e600 73 0a 6f 6e 20 67 72 6f 75 70 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 3b 20 74 68 65 79 20 61 72 65 ┆s on group information; they are┆ 0x04f200…09e600 20 61 6c 6c 20 27 73 61 66 65 27 20 28 69 2e 65 2e 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 20 ┆ all 'safe' (i.e. can be called ┆ 0x04f200…09e600 77 69 74 68 20 61 72 67 75 6d 65 6e 74 73 0a 74 68 61 74 20 68 61 76 65 20 73 69 64 65 2d 65 66 ┆with arguments that have side-ef┆ 0x04f200…09e600 66 65 63 74 73 29 20 61 6e 64 20 70 72 65 74 74 79 20 6d 75 63 68 20 73 65 6c 66 2d 65 78 70 6c ┆fects) and pretty much self-expl┆ 0x04f200…09e600 61 6e 61 74 6f 72 79 2e 20 54 68 65 20 61 64 76 61 6e 74 61 67 65 20 6f 66 0a 75 73 69 6e 67 20 ┆anatory. The advantage of using ┆ 0x04f200…09e600 74 68 69 73 20 6c 61 79 65 72 20 69 73 20 74 68 61 74 20 69 74 20 69 6e 76 69 73 69 62 6c 79 20 ┆this layer is that it invisibly ┆ 0x04f200…09e600 6d 61 69 6e 74 61 69 6e 73 20 74 68 65 20 63 75 72 72 65 6e 74 2d 67 72 6f 75 70 20 70 6f 69 6e ┆maintains the current-group poin┆ 0x04f200…09e600 74 65 72 0a 61 63 74 69 76 65 2e 61 72 74 69 63 6c 65 2e 6d 5f 67 72 6f 75 70 2e 0a 0a 6e 67 75 ┆ter active.article.m_group. ngu┆ 0x04f200…09e600 6e 72 65 61 64 28 29 09 2d 2d 20 63 6f 75 6e 74 20 6f 66 20 61 72 74 69 63 6c 65 73 20 69 6e 20 ┆nread() -- count of articles in ┆ 0x04f200…09e600 74 68 65 20 67 72 6f 75 70 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 72 65 61 64 0a 6e 67 64 75 6d ┆the group currently unread ngdum┆ 0x04f200…09e600 70 28 29 09 2d 2d 20 64 75 6d 70 20 67 72 6f 75 70 20 64 61 74 61 20 74 6f 20 73 74 64 65 72 72 ┆p() -- dump group data to stderr┆ 0x04f200…09e600 20 28 6f 6e 6c 79 20 64 65 66 69 6e 65 64 20 23 69 66 64 65 66 20 44 45 42 55 47 29 0a 72 63 63 ┆ (only defined #ifdef DEBUG) rcc┆ 0x04f200…09e600 6d 64 73 28 29 09 2d 2d 20 72 65 74 75 72 6e 20 63 6f 6d 6d 61 6e 64 73 20 66 69 65 6c 64 20 6f ┆mds() -- return commands field o┆ 0x04f200…09e600 66 20 74 68 65 20 67 72 6f 75 70 0a 0a 54 68 65 72 65 20 69 73 20 61 6c 73 6f 3a 0a 0a 72 63 73 ┆f the group There is also: rcs┆ 0x04f200…09e600 75 62 73 63 28 67 70 29 09 2d 2d 20 72 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 69 73 20 ┆ubsc(gp) -- return TRUE if this ┆ 0x04f200…09e600 67 72 6f 75 70 20 69 73 20 73 75 62 73 63 72 69 62 65 64 20 74 6f 20 65 6c 73 65 20 46 41 4c 53 ┆group is subscribed to else FALS┆ 0x04f200…09e600 45 0a 0a 49 74 20 69 73 20 65 78 70 65 63 74 65 64 20 74 68 61 74 20 6d 6f 73 74 20 75 73 65 72 ┆E It is expected that most user┆ 0x04f200…09e600 73 20 77 69 6c 6c 20 63 61 6c 6c 20 74 68 65 73 65 20 6d 61 63 72 6f 73 20 72 61 74 68 65 72 20 ┆s will call these macros rather ┆ 0x04f200…09e600 74 68 61 6e 20 74 68 65 0a 75 6e 64 65 72 6c 79 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73 2c 20 73 ┆than the underlying functions, s┆ 0x04f200…09e600 6f 20 74 68 61 74 20 61 63 74 69 76 65 2e 61 72 74 69 63 6c 65 2e 6d 5f 67 72 6f 75 70 20 64 6f ┆o that active.article.m_group do┆ 0x04f200…09e600 65 73 6e 27 74 20 6e 65 65 64 20 74 6f 20 62 65 0a 6d 61 6e 69 70 75 6c 61 74 65 64 20 65 78 70 ┆esn't need to be manipulated exp┆ 0x04f200…09e600 6c 69 63 69 74 6c 79 2e 0a 0a 53 45 45 20 41 4c 53 4f 0a 20 20 20 72 64 6e 65 77 73 72 63 2e 63 ┆licitly. SEE ALSO rdnewsrc.c┆ 0x04f200…09e600 09 09 2d 2d 20 72 65 61 64 20 69 6e 20 73 65 65 6e 20 2e 6e 65 77 73 72 63 20 69 6e 66 6f 0a 20 ┆ -- read in seen .newsrc info ┆ 0x04f200…09e600 20 20 77 72 6e 65 77 73 72 63 2e 63 09 2d 2d 20 66 75 6c 6c 20 2e 6e 65 77 73 72 63 20 69 6e 74 ┆ wrnewsrc.c -- full .newsrc int┆ 0x04f200…09e600 65 72 70 72 65 74 61 74 69 6f 6e 20 66 6f 72 20 75 73 65 20 77 69 74 68 20 72 65 61 64 65 72 73 ┆erpretation for use with readers┆ 0x04f200…09e600 2e 0a 0a 41 55 54 48 4f 52 0a 20 20 20 45 72 69 63 20 53 2e 20 52 61 79 6d 6f 6e 64 0a 20 20 20 ┆. AUTHOR Eric S. Raymond ┆ 0x04f200…09e600 54 68 69 73 20 73 6f 66 74 77 61 72 65 20 69 73 20 43 6f 70 79 72 69 67 68 74 20 28 43 29 20 31 ┆This software is Copyright (C) 1┆ 0x04f200…09e600 39 38 39 20 62 79 20 45 72 69 63 20 53 2e 20 52 61 79 6d 6f 6e 64 20 66 6f 72 20 74 68 65 20 73 ┆989 by Eric S. Raymond for the s┆ 0x04f200…09e600 6f 6c 65 20 70 75 72 70 6f 73 65 0a 6f 66 20 70 72 6f 74 65 63 74 69 6e 67 20 66 72 65 65 20 72 ┆ole purpose of protecting free r┆ 0x04f200…09e600 65 64 69 73 74 72 69 62 75 74 69 6f 6e 3b 20 73 65 65 20 74 68 65 20 4c 49 43 45 4e 53 45 20 66 ┆edistribution; see the LICENSE f┆ 0x04f200…09e600 69 6c 65 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆ile for details. **************┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆********************************┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a ┆****************************/ /*┆ 0x04f200…09e600 4c 49 4e 54 4c 49 42 52 41 52 59 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 6e 65 77 73 2e 68 22 0a ┆LINTLIBRARY*/ #include "news.h" ┆ 0x04f200…09e600 23 69 6e 63 6c 75 64 65 20 22 61 63 74 69 76 65 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 6e 65 ┆#include "active.h" #include "ne┆ 0x04f200…09e600 77 73 72 63 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 62 69 74 6d 61 63 72 6f 73 2e 68 22 0a 0a ┆wsrc.h" #include "bitmacros.h" ┆ 0x04f200…09e600 2f 2a 20 66 69 67 75 72 65 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 ┆/* figure the minimum number of ┆ 0x04f200…09e600 62 69 74 73 20 74 68 61 74 20 77 69 6c 6c 20 66 69 74 20 69 6e 20 6f 6e 65 20 28 63 68 61 72 20 ┆bits that will fit in one (char ┆ 0x04f200…09e600 2a 29 20 2a 2f 0a 23 69 66 64 65 66 20 53 4d 41 4c 4c 5f 41 44 44 52 45 53 53 5f 53 50 41 43 45 ┆*) */ #ifdef SMALL_ADDRESS_SPACE┆ 0x04f200…09e600 0a 23 64 65 66 69 6e 65 20 50 54 52 5f 42 49 54 53 09 31 36 0a 23 65 6c 73 65 0a 23 64 65 66 69 ┆ #define PTR_BITS 16 #else #defi┆ 0x04f200…09e600 6e 65 20 50 54 52 5f 42 49 54 53 09 33 32 0a 23 65 6e 64 69 66 0a 0a 23 75 6e 64 65 66 20 50 54 ┆ne PTR_BITS 32 #endif #undef PT┆ 0x04f200…09e600 52 5f 42 49 54 53 09 09 2f 2a 20 74 68 69 73 20 63 6f 64 65 20 69 73 20 77 65 69 72 64 6c 79 20 ┆R_BITS /* this code is weirdly ┆ 0x04f200…09e600 62 75 67 67 79 20 2a 2f 0a 0a 2f 2a 0a 20 2a 20 48 65 72 65 20 61 72 65 20 74 68 65 20 66 75 6e ┆buggy */ /* * Here are the fun┆ 0x04f200…09e600 63 74 69 6f 6e 73 20 66 6f 72 20 67 65 74 74 69 6e 67 20 61 6e 64 20 73 65 74 74 69 6e 67 20 74 ┆ctions for getting and setting t┆ 0x04f200…09e600 68 65 20 27 73 65 65 6e 27 20 62 69 74 73 0a 20 2a 2f 0a 0a 69 6e 74 20 67 65 74 62 69 74 28 61 ┆he 'seen' bits */ int getbit(a┆ 0x04f200…09e600 72 74 69 63 6c 65 2c 20 6e 67 70 29 0a 2f 2a 20 72 65 74 75 72 6e 20 74 68 65 20 73 74 61 74 75 ┆rticle, ngp) /* return the statu┆ 0x04f200…09e600 73 20 6f 66 20 61 6e 20 61 72 74 69 63 6c 65 20 2a 2f 0a 6e 61 72 74 5f 74 09 61 72 74 69 63 6c ┆s of an article */ nart_t articl┆ 0x04f200…09e600 65 3b 0a 67 72 6f 75 70 5f 74 09 2a 6e 67 70 3b 0a 7b 0a 20 20 20 20 2f 2a 20 72 65 74 75 72 6e ┆e; group_t *ngp; { /* return┆ 0x04f200…09e600 20 46 41 49 4c 20 69 66 20 74 68 65 20 61 72 74 69 63 6c 65 20 69 73 20 6f 75 74 20 6f 66 20 72 ┆ FAIL if the article is out of r┆ 0x04f200…09e600 61 6e 67 65 20 2a 2f 0a 20 20 20 20 69 66 20 28 61 72 74 69 63 6c 65 20 3c 20 6e 67 70 2d 3e 6e ┆ange */ if (article < ngp->n┆ 0x04f200…09e600 67 5f 6d 69 6e 20 7c 7c 20 61 72 74 69 63 6c 65 20 3e 20 6e 67 70 2d 3e 6e 67 5f 6d 61 78 29 0a ┆g_min || article > ngp->ng_max) ┆ 0x04f200…09e600 09 72 65 74 75 72 6e 28 46 41 49 4c 29 3b 0a 0a 20 20 20 20 69 66 20 28 6e 67 70 2d 3e 72 63 5f ┆ return(FAIL); if (ngp->rc_┆ 0x04f200…09e600 73 65 65 6e 20 3d 3d 20 28 75 63 68 61 72 20 2a 29 4e 55 4c 4c 29 0a 09 72 65 74 75 72 6e 28 46 ┆seen == (uchar *)NULL) return(F┆ 0x04f200…09e600 41 4c 53 45 29 3b 0a 23 69 66 64 65 66 20 50 54 52 5f 42 49 54 53 0a 20 20 20 20 65 6c 73 65 20 ┆ALSE); #ifdef PTR_BITS else ┆ 0x04f200…09e600 69 66 20 28 6e 67 70 2d 3e 6e 67 5f 6d 61 78 20 2d 20 6e 67 70 2d 3e 6e 67 5f 6d 69 6e 20 2b 20 ┆if (ngp->ng_max - ngp->ng_min + ┆ 0x04f200…09e600 31 20 3c 3d 20 50 54 52 5f 42 49 54 53 29 0a 09 72 65 74 75 72 6e 28 47 45 54 5f 42 49 54 28 28 ┆1 <= PTR_BITS) return(GET_BIT((┆ 0x04f200…09e600 63 68 61 72 20 2a 29 26 6e 67 70 2d 3e 72 63 5f 73 65 65 6e 2c 20 61 72 74 69 63 6c 65 20 2d 20 ┆char *)&ngp->rc_seen, article - ┆ 0x04f200…09e600 6e 67 70 2d 3e 6e 67 5f 6d 69 6e 29 20 21 3d 20 30 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 50 54 ┆ngp->ng_min) != 0); #endif /* PT┆ 0x04f200…09e600 52 5f 42 49 54 53 20 2a 2f 0a 20 20 20 20 65 6c 73 65 0a 09 72 65 74 75 72 6e 28 47 45 54 5f 42 ┆R_BITS */ else return(GET_B┆ 0x04f200…09e600 49 54 28 6e 67 70 2d 3e 72 63 5f 73 65 65 6e 2c 20 61 72 74 69 63 6c 65 20 2d 20 6e 67 70 2d 3e ┆IT(ngp->rc_seen, article - ngp->┆ 0x04f200…09e600 6e 67 5f 6d 69 6e 29 20 21 3d 20 30 29 3b 0a 7d 0a 0a 69 6e 74 20 73 65 74 62 69 74 28 61 72 74 ┆ng_min) != 0); } int setbit(art┆ 0x04f200…09e600 69 63 6c 65 2c 20 6e 67 70 29 0a 2f 2a 20 6d 61 72 6b 20 61 6e 20 61 72 74 69 63 6c 65 20 72 65 ┆icle, ngp) /* mark an article re┆ 0x04f200…09e600 61 64 20 2a 2f 0a 6e 61 72 74 5f 74 09 61 72 74 69 63 6c 65 3b 0a 67 72 6f 75 70 5f 74 09 2a 6e ┆ad */ nart_t article; group_t *n┆ 0x04f200…09e600 67 70 3b 0a 7b 0a 20 20 20 20 69 6e 74 20 67 72 70 73 69 7a 65 20 3d 20 6e 67 70 2d 3e 6e 67 5f ┆gp; { int grpsize = ngp->ng_┆ 0x04f200…09e600 6d 61 78 20 2d 20 6e 67 70 2d 3e 6e 67 5f 6d 69 6e 20 2b 20 31 3b 0a 20 20 20 20 62 6f 6f 6c 20 ┆max - ngp->ng_min + 1; bool ┆ 0x04f200…09e600 63 68 61 6e 67 65 64 3b 0a 0a 23 69 66 64 65 66 20 47 54 45 53 54 0a 20 20 20 20 28 76 6f 69 64 ┆changed; #ifdef GTEST (void┆ 0x04f200…09e600 29 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 0a 09 20 20 20 20 22 6d 61 72 6b 3a 20 6d 61 ┆) fprintf(stderr, "mark: ma┆ 0x04f200…09e600 72 6b 69 6e 67 20 61 72 74 69 63 6c 65 20 25 64 20 6f 66 20 25 73 5c 6e 22 2c 0a 09 20 20 20 20 ┆rking article %d of %s\n", ┆ 0x04f200…09e600 61 72 74 69 63 6c 65 2c 20 6e 67 70 2d 3e 6e 67 5f 6e 61 6d 65 29 3b 0a 23 65 6e 64 69 66 20 2f ┆article, ngp->ng_name); #endif /┆ 0x04f200…09e600 2a 20 54 45 53 54 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 72 65 74 75 72 6e 20 46 41 49 4c 20 69 66 ┆* TEST */ /* return FAIL if┆ 0x04f200…09e600 20 74 68 65 20 61 72 74 69 63 6c 65 20 69 73 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 20 2a 2f 0a ┆ the article is out of range */ ┆ 0x04f200…09e600 20 20 20 20 69 66 20 28 61 72 74 69 63 6c 65 20 3c 20 6e 67 70 2d 3e 6e 67 5f 6d 69 6e 20 7c 7c ┆ if (article < ngp->ng_min ||┆ 0x04f200…09e600 20 61 72 74 69 63 6c 65 20 3e 20 6e 67 70 2d 3e 6e 67 5f 6d 61 78 29 0a 09 72 65 74 75 72 6e 28 ┆ article > ngp->ng_max) return(┆ 0x04f200…09e600 46 41 49 4c 29 3b 0a 0a 20 20 20 20 2f 2a 20 69 66 20 74 68 65 72 65 27 73 20 6e 6f 20 62 69 74 ┆FAIL); /* if there's no bit┆ 0x04f200…09e600 6d 61 70 2c 20 61 6c 6c 6f 63 61 74 65 20 61 20 72 69 67 68 74 2d 73 69 7a 65 64 20 6f 6e 65 20 ┆map, allocate a right-sized one ┆ 0x04f200…09e600 2a 2f 0a 20 20 20 20 69 66 20 28 6e 67 70 2d 3e 72 63 5f 73 65 65 6e 20 3d 3d 20 28 75 63 68 61 ┆*/ if (ngp->rc_seen == (ucha┆ 0x04f200…09e600 72 20 2a 29 4e 55 4c 4c 29 0a 20 20 20 20 7b 0a 23 69 66 64 65 66 20 50 54 52 5f 42 49 54 53 0a ┆r *)NULL) { #ifdef PTR_BITS ┆ 0x04f200…09e600 09 69 66 20 28 67 72 70 73 69 7a 65 20 3e 20 50 54 52 5f 42 49 54 53 29 0a 23 65 6e 64 69 66 20 ┆ if (grpsize > PTR_BITS) #endif ┆ 0x04f200…09e600 2f 2a 20 50 54 52 5f 42 49 54 53 20 2a 2f 09 0a 20 20 20 20 69 66 20 28 28 6e 67 70 2d 3e 72 63 ┆/* PTR_BITS */ if ((ngp->rc┆ 0x04f200…09e600 5f 73 65 65 6e 20 3d 20 28 75 63 68 61 72 20 2a 29 20 41 4c 4c 4f 43 5f 42 49 54 53 28 67 72 70 ┆_seen = (uchar *) ALLOC_BITS(grp┆ 0x04f200…09e600 73 69 7a 65 29 29 20 3d 3d 20 28 75 63 68 61 72 2a 29 4e 55 4c 4c 29 0a 09 09 78 65 72 72 6f 72 ┆size)) == (uchar*)NULL) xerror┆ 0x04f200…09e600 30 28 22 42 69 74 6d 61 70 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 65 64 22 29 3b 0a 20 ┆0("Bitmap allocation failed"); ┆ 0x04f200…09e600 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 63 68 61 6e 67 65 64 20 3d 20 28 67 65 74 62 69 74 28 ┆ } if (changed = (getbit(┆ 0x04f200…09e600 61 72 74 69 63 6c 65 2c 20 6e 67 70 29 20 3d 3d 20 46 41 4c 53 45 29 29 0a 09 6e 67 70 2d 3e 6e ┆article, ngp) == FALSE)) ngp->n┆ 0x04f200…09e600 67 5f 75 6e 72 65 61 64 2d 2d 3b 0a 0a 23 69 66 64 65 66 20 50 54 52 5f 42 49 54 53 0a 20 20 20 ┆g_unread--; #ifdef PTR_BITS ┆ 0x04f200…09e600 20 69 66 20 28 6e 67 70 2d 3e 6e 67 5f 6d 61 78 20 2d 20 6e 67 70 2d 3e 6e 67 5f 6d 69 6e 20 2b ┆ if (ngp->ng_max - ngp->ng_min +┆ 0x04f200…09e600 20 31 20 3c 3d 20 50 54 52 5f 42 49 54 53 29 0a 09 53 45 54 5f 42 49 54 28 28 63 68 61 72 20 2a ┆ 1 <= PTR_BITS) SET_BIT((char *┆ 0x04f200…09e600 29 26 6e 67 70 2d 3e 72 63 5f 73 65 65 6e 2c 20 61 72 74 69 63 6c 65 20 2d 20 6e 67 70 2d 3e 6e ┆)&ngp->rc_seen, article - ngp->n┆ 0x04f200…09e600 67 5f 6d 69 6e 29 3b 0a 20 20 20 20 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 50 54 52 5f 42 ┆g_min); else #endif /* PTR_B┆ 0x04f200…09e600 49 54 53 20 2a 2f 0a 09 53 45 54 5f 42 49 54 28 6e 67 70 2d 3e 72 63 5f 73 65 65 6e 2c 20 61 72 ┆ITS */ SET_BIT(ngp->rc_seen, ar┆ 0x04f200…09e600 74 69 63 6c 65 20 2d 20 6e 67 70 2d 3e 6e 67 5f 6d 69 6e 29 3b 0a 0a 20 20 20 20 6e 67 70 2d 3e ┆ticle - ngp->ng_min); ngp->┆ 0x04f200…09e600 72 63 5f 66 6c 61 67 73 20 7c 3d 20 52 43 5f 56 49 53 49 54 45 44 3b 0a 20 20 20 20 72 65 74 75 ┆rc_flags |= RC_VISITED; retu┆ 0x04f200…09e600 72 6e 28 63 68 61 6e 67 65 64 29 3b 0a 7d 0a 0a 69 6e 74 20 63 6c 65 61 72 62 69 74 28 61 72 74 ┆rn(changed); } int clearbit(art┆ 0x04f200…09e600 69 63 6c 65 2c 20 6e 67 70 29 0a 2f 2a 20 6d 61 72 6b 20 61 6e 20 61 72 74 69 63 6c 65 20 75 6e ┆icle, ngp) /* mark an article un┆ 0x04f200…09e600 72 65 61 64 20 2a 2f 0a 6e 61 72 74 5f 74 09 61 72 74 69 63 6c 65 3b 0a 67 72 6f 75 70 5f 74 09 ┆read */ nart_t article; group_t ┆ 0x04f200…09e600 2a 6e 67 70 3b 0a 7b 0a 20 20 20 20 62 6f 6f 6c 20 63 68 61 6e 67 65 64 3b 0a 0a 20 20 20 20 2f ┆*ngp; { bool changed; /┆ 0x04f200…09e600 2a 20 72 65 74 75 72 6e 20 46 41 49 4c 20 69 66 20 74 68 65 20 61 72 74 69 63 6c 65 20 69 73 20 ┆* return FAIL if the article is ┆ 0x04f200…09e600 6f 75 74 20 6f 66 20 72 61 6e 67 65 20 2a 2f 0a 20 20 20 20 69 66 20 28 61 72 74 69 63 6c 65 20 ┆out of range */ if (article ┆ 0x04f200…09e600 3c 20 6e 67 70 2d 3e 6e 67 5f 6d 69 6e 20 7c 7c 20 61 72 74 69 63 6c 65 20 3e 20 6e 67 70 2d 3e ┆< ngp->ng_min || article > ngp->┆ 0x04f200…09e600 6e 67 5f 6d 61 78 29 0a 09 72 65 74 75 72 6e 28 46 41 49 4c 29 3b 0a 0a 20 20 20 20 69 66 20 28 ┆ng_max) return(FAIL); if (┆ 0x04f200…09e600 6e 67 70 2d 3e 72 63 5f 73 65 65 6e 29 0a 20 20 20 20 7b 0a 09 69 66 20 28 63 68 61 6e 67 65 64 ┆ngp->rc_seen) { if (changed┆ 0x04f200…09e600 20 3d 20 28 67 65 74 62 69 74 28 61 72 74 69 63 6c 65 2c 20 6e 67 70 29 20 3d 3d 20 54 52 55 45 ┆ = (getbit(article, ngp) == TRUE┆ 0x04f200…09e600 29 29 0a 09 20 20 20 20 6e 67 70 2d 3e 6e 67 5f 75 6e 72 65 61 64 2b 2b 3b 0a 0a 23 69 66 64 65 ┆)) ngp->ng_unread++; #ifde┆ 0x04f200…09e600 66 20 50 54 52 5f 42 49 54 53 0a 09 69 66 20 28 6e 67 70 2d 3e 6e 67 5f 6d 61 78 20 2d 20 6e 67 ┆f PTR_BITS if (ngp->ng_max - ng┆ 0x04f200…09e600 70 2d 3e 6e 67 5f 6d 69 6e 20 2b 20 31 20 3c 3d 20 50 54 52 5f 42 49 54 53 29 0a 09 20 20 20 20 ┆p->ng_min + 1 <= PTR_BITS) ┆ 0x04f200…09e600 43 4c 45 41 52 5f 42 49 54 28 28 63 68 61 72 20 2a 29 26 6e 67 70 2d 3e 72 63 5f 73 65 65 6e 2c ┆CLEAR_BIT((char *)&ngp->rc_seen,┆ 0x04f200…09e600 20 61 72 74 69 63 6c 65 20 2d 20 6e 67 70 2d 3e 6e 67 5f 6d 69 6e 29 3b 0a 09 65 6c 73 65 0a 23 ┆ article - ngp->ng_min); else #┆ 0x04f200…09e600 65 6e 64 69 66 20 2f 2a 20 50 54 52 5f 42 49 54 53 20 2a 2f 0a 09 20 20 20 20 43 4c 45 41 52 5f ┆endif /* PTR_BITS */ CLEAR_┆ 0x04f200…09e600 42 49 54 28 6e 67 70 2d 3e 72 63 5f 73 65 65 6e 2c 20 61 72 74 69 63 6c 65 20 2d 20 6e 67 70 2d ┆BIT(ngp->rc_seen, article - ngp-┆ 0x04f200…09e600 3e 6e 67 5f 6d 69 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 0a 09 72 65 74 75 72 6e ┆>ng_min); } else return┆ 0x04f200…09e600 28 46 41 49 4c 29 3b 09 2f 2a 20 73 68 61 6b 79 2e 2e 2e 75 6e 64 65 72 20 73 6f 6d 65 20 63 69 ┆(FAIL); /* shaky...under some ci┆ 0x04f200…09e600 72 63 75 6d 73 74 61 6e 63 65 73 20 73 68 6f 75 6c 64 20 62 65 20 46 41 4c 53 45 20 2a 2f 0a 0a ┆rcumstances should be FALSE */ ┆ 0x04f200…09e600 20 20 20 20 72 65 74 75 72 6e 28 63 68 61 6e 67 65 64 29 3b 0a 7d 0a 0a 69 6e 74 20 72 64 62 69 ┆ return(changed); } int rdbi┆ 0x04f200…09e600 74 73 28 6d 6f 64 65 2c 20 63 70 2c 20 6e 67 70 29 0a 2f 2a 20 73 65 74 2f 63 6c 65 61 72 20 74 ┆ts(mode, cp, ngp) /* set/clear t┆ 0x04f200…09e600 68 65 20 62 69 74 73 20 69 6d 70 6c 69 65 64 20 62 79 20 6c 69 6e 65 20 63 70 20 74 6f 20 74 68 ┆he bits implied by line cp to th┆ 0x04f200…09e600 65 20 67 72 6f 75 70 20 64 61 74 61 20 69 6e 20 6e 67 70 20 2a 2f 0a 69 6e 74 09 6d 6f 64 65 3b ┆e group data in ngp */ int mode;┆ 0x04f200…09e600 09 2f 2a 20 77 68 65 74 68 65 72 20 74 6f 20 64 6f 20 73 65 74 73 2c 20 63 6c 65 61 72 73 20 6f ┆ /* whether to do sets, clears o┆ 0x04f200…09e600 72 20 62 6f 74 68 20 2a 2f 0a 63 68 61 72 09 2a 63 70 3b 09 2f 2a 20 74 68 65 20 6c 69 6e 65 20 ┆r both */ char *cp; /* the line ┆ 0x04f200…09e600 74 6f 20 72 65 61 64 20 74 68 69 73 20 64 61 74 61 20 66 72 6f 6d 20 2a 2f 0a 67 72 6f 75 70 5f ┆to read this data from */ group_┆ 0x04f200…09e600 74 09 2a 6e 67 70 3b 09 2f 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20 67 72 6f 75 70 20 64 61 74 61 ┆t *ngp; /* pointer to group data┆ 0x04f200…09e600 20 74 6f 20 75 70 64 61 74 65 20 2a 2f 0a 7b 0a 23 64 65 66 69 6e 65 20 53 5f 43 4f 4d 4d 41 09 ┆ to update */ { #define S_COMMA ┆ 0x04f200…09e600 20 20 20 20 30 09 2f 2a 20 6c 6f 77 20 65 6e 64 20 6f 66 20 61 20 72 61 6e 67 65 20 68 61 73 20 ┆ 0 /* low end of a range has ┆ 0x04f200…09e600 62 65 65 6e 20 67 6f 74 74 65 6e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53 5f 4e 55 4d 09 20 20 20 ┆been gotten */ #define S_NUM ┆ 0x04f200…09e600 20 31 09 2f 2a 20 63 6f 6d 6d 61 20 61 66 74 65 72 20 61 20 6e 75 6d 62 65 72 20 68 61 73 20 62 ┆ 1 /* comma after a number has b┆ 0x04f200…09e600 65 65 6e 20 73 65 65 6e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53 5f 44 41 53 48 09 20 20 20 20 32 ┆een seen */ #define S_DASH 2┆ 0x04f200…09e600 09 2f 2a 20 64 61 73 68 20 68 61 73 20 62 65 65 6e 20 73 65 65 6e 20 2a 2f 0a 23 64 65 66 69 6e ┆ /* dash has been seen */ #defin┆ 0x04f200…09e600 65 20 53 5f 45 4f 4c 09 20 20 20 20 33 09 2f 2a 20 65 6e 64 2d 6f 66 2d 6c 69 6e 65 20 73 65 65 ┆e S_EOL 3 /* end-of-line see┆ 0x04f200…09e600 6e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53 5f 53 4f 4c 09 20 20 20 20 34 09 2f 2a 20 73 74 61 72 ┆n */ #define S_SOL 4 /* star┆ 0x04f200…09e600 74 2d 6f 66 2d 6c 69 6e 65 20 73 74 61 74 65 20 2a 2f 0a 0a 20 20 20 20 73 74 61 74 69 63 20 69 ┆t-of-line state */ static i┆ 0x04f200…09e600 6e 74 09 61 63 74 69 6f 6e 5b 34 5d 5b 35 5d 0a 09 20 20 20 20 3d 20 7b 7b 30 2c 31 2c 30 2c 30 ┆nt action[4][5] = {{0,1,0,0┆ 0x04f200…09e600 2c 30 7d 2c 20 7b 32 2c 30 2c 33 2c 30 2c 32 7d 2c 20 7b 30 2c 34 2c 30 2c 30 2c 30 7d 2c 20 7b ┆,0}, {2,0,3,0,2}, {0,4,0,0,0}, {┆ 0x04f200…09e600 30 2c 35 2c 30 2c 30 2c 36 7d 7d 3b 0a 0a 20 20 20 20 69 6e 74 09 20 20 20 20 74 6f 6b 74 79 70 ┆0,5,0,0,6}}; int toktyp┆ 0x04f200…09e600 65 2c 20 73 74 61 74 65 3b 0a 20 20 20 20 6e 61 72 74 5f 74 20 20 6c 6f 20 3d 20 6e 67 70 2d 3e ┆e, state; nart_t lo = ngp->┆ 0x04f200…09e600 6e 67 5f 6d 69 6e 3b 0a 20 20 20 20 6e 61 72 74 5f 74 20 20 76 61 6c 20 3d 20 30 3b 0a 20 20 20 ┆ng_min; nart_t val = 0; ┆ 0x04f200…09e600 20 6e 61 72 74 5f 74 20 20 69 3b 0a 0a 20 20 20 20 2f 2a 20 69 66 20 77 65 27 72 65 20 6f 6e 20 ┆ nart_t i; /* if we're on ┆ 0x04f200…09e600 74 68 65 20 31 73 74 20 72 65 61 64 2c 20 74 68 65 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 ┆the 1st read, the initial value ┆ 0x04f200…09e600 69 73 20 77 72 6f 6e 67 20 66 6f 72 20 43 4c 45 41 52 20 6d 6f 64 65 20 2a 2f 0a 20 20 20 20 69 ┆is wrong for CLEAR mode */ i┆ 0x04f200…09e600 66 20 28 6d 6f 64 65 20 3d 3d 20 43 4c 45 41 52 20 26 26 20 6e 67 70 2d 3e 72 63 5f 73 65 65 6e ┆f (mode == CLEAR && ngp->rc_seen┆ 0x04f200…09e600 20 3d 3d 20 28 75 63 68 61 72 20 2a 29 4e 55 4c 4c 29 0a 09 6e 67 70 2d 3e 6e 67 5f 75 6e 72 65 ┆ == (uchar *)NULL) ngp->ng_unre┆ 0x04f200…09e600 61 64 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 70 61 72 73 65 20 61 6e 20 75 6e 70 61 63 6b 65 ┆ad = 0; /* parse an unpacke┆ 0x04f200…09e600 64 20 62 69 74 6d 61 70 20 69 6e 74 6f 20 61 20 70 61 63 6b 65 64 20 6f 6e 65 20 2a 2f 0a 20 20 ┆d bitmap into a packed one */ ┆ 0x04f200…09e600 20 20 66 6f 72 20 28 73 74 61 74 65 20 3d 20 53 5f 53 4f 4c 3b 20 73 74 61 74 65 20 21 3d 20 53 ┆ for (state = S_SOL; state != S┆ 0x04f200…09e600 5f 45 4f 4c 3b 20 73 74 61 74 65 20 3d 20 74 6f 6b 74 79 70 65 29 0a 20 20 20 20 7b 0a 09 2f 2a ┆_EOL; state = toktype) { /*┆ 0x04f200…09e600 0a 09 20 2a 20 48 65 72 65 27 73 20 74 68 65 20 6c 65 78 69 63 61 6c 20 61 6e 61 6c 79 7a 65 72 ┆ * Here's the lexical analyzer┆ 0x04f200…09e600 0a 09 20 2a 2f 0a 09 77 68 69 6c 65 20 28 2a 63 70 20 26 26 20 69 73 73 70 61 63 65 28 2a 63 70 ┆ */ while (*cp && isspace(*cp┆ 0x04f200…09e600 29 29 09 2f 2a 20 73 6b 69 70 20 6c 65 61 64 69 6e 67 20 77 68 69 74 65 73 70 61 63 65 20 2a 2f ┆)) /* skip leading whitespace */┆ 0x04f200…09e600 0a 09 20 20 20 20 63 70 2b 2b 3b 0a 0a 09 2f 2a 20 6c 6f 6f 6b 20 66 6f 72 20 61 20 74 6f 6b 65 ┆ cp++; /* look for a toke┆ 0x04f200…09e600 6e 20 2a 2f 0a 09 69 66 20 28 2a 63 70 20 3d 3d 20 27 5c 30 27 20 7c 7c 20 2a 63 70 20 3d 3d 20 ┆n */ if (*cp == '\0' || *cp == ┆ 0x04f200…09e600 53 55 42 53 43 4d 4b 29 0a 09 7b 0a 09 20 20 20 20 74 6f 6b 74 79 70 65 20 3d 20 53 5f 45 4f 4c ┆SUBSCMK) { toktype = S_EOL┆ 0x04f200…09e600 3b 0a 09 7d 0a 09 65 6c 73 65 20 69 66 20 28 2a 63 70 20 3d 3d 20 27 2c 27 29 09 20 20 20 20 2f ┆; } else if (*cp == ',') /┆ 0x04f200…09e600 2a 20 61 20 63 6f 6d 6d 61 20 28 65 6e 64 73 20 63 75 72 72 65 6e 74 20 72 61 6e 67 65 29 20 2a ┆* a comma (ends current range) *┆ 0x04f200…09e600 2f 0a 09 7b 0a 09 20 20 20 20 74 6f 6b 74 79 70 65 20 3d 20 53 5f 43 4f 4d 4d 41 3b 0a 09 20 20 ┆/ { toktype = S_COMMA; ┆ 0x04f200…09e600 20 20 63 70 2b 2b 3b 0a 09 7d 0a 09 65 6c 73 65 20 69 66 20 28 2a 63 70 20 3d 3d 20 27 2d 27 29 ┆ cp++; } else if (*cp == '-')┆ 0x04f200…09e600 09 20 20 20 20 2f 2a 20 61 20 64 61 73 68 20 28 66 6c 61 67 73 20 61 20 72 65 61 6c 20 72 61 6e ┆ /* a dash (flags a real ran┆ 0x04f200…09e600 67 65 29 20 2a 2f 0a 09 7b 0a 09 20 20 20 20 74 6f 6b 74 79 70 65 20 3d 20 53 5f 44 41 53 48 3b ┆ge) */ { toktype = S_DASH;┆ 0x04f200…09e600 0a 09 20 20 20 20 63 70 2b 2b 3b 0a 09 7d 0a 09 65 6c 73 65 20 69 66 20 28 69 73 64 69 67 69 74 ┆ cp++; } else if (isdigit┆ 0x04f200…09e600 28 2a 63 70 29 29 09 20 20 20 20 2f 2a 20 6f 72 20 61 20 64 69 67 69 74 20 73 65 71 75 65 6e 63 ┆(*cp)) /* or a digit sequenc┆ 0x04f200…09e600 65 20 2a 2f 0a 09 7b 0a 09 20 20 20 20 76 61 6c 20 3d 20 61 74 6f 61 28 63 70 29 3b 09 2f 2a 20 ┆e */ { val = atoa(cp); /* ┆ 0x04f200…09e600 73 65 65 20 6e 65 77 73 2e 68 20 66 6f 72 20 61 74 6f 61 28 29 20 2a 2f 0a 09 20 20 20 20 74 6f ┆see news.h for atoa() */ to┆ 0x04f200…09e600 6b 74 79 70 65 20 3d 20 53 5f 4e 55 4d 3b 0a 09 20 20 20 20 77 68 69 6c 65 20 28 69 73 64 69 67 ┆ktype = S_NUM; while (isdig┆ 0x04f200…09e600 69 74 28 2a 63 70 29 29 0a 09 09 63 70 2b 2b 3b 0a 09 7d 0a 09 65 6c 73 65 09 09 09 20 20 20 20 ┆it(*cp)) cp++; } else ┆ 0x04f200…09e600 2f 2a 20 61 6e 79 74 68 69 6e 67 20 65 6c 73 65 20 69 73 20 61 6e 20 69 6c 6c 65 67 61 6c 20 63 ┆/* anything else is an illegal c┆ 0x04f200…09e600 68 61 72 20 2a 2f 0a 23 69 66 6e 64 65 66 20 47 54 45 53 54 0a 09 20 20 20 20 72 65 74 75 72 6e ┆har */ #ifndef GTEST return┆ 0x04f200…09e600 28 46 41 49 4c 29 3b 0a 23 65 6c 73 65 0a 09 7b 0a 09 20 20 20 20 28 76 6f 69 64 29 20 66 70 72 ┆(FAIL); #else { (void) fpr┆ 0x04f200…09e600 69 6e 74 66 28 73 74 64 65 72 72 2c 0a 09 09 20 20 20 20 22 72 64 62 69 74 73 3a 20 63 68 6f 6b ┆intf(stderr, "rdbits: chok┆ 0x04f200…09e600 65 64 20 6f 6e 20 62 61 64 20 63 68 61 72 61 63 74 65 72 20 27 25 63 27 20 3d 20 30 78 25 30 32 ┆ed on bad character '%c' = 0x%02┆ 0x04f200…09e600 78 5c 6e 22 2c 0a 09 09 20 20 20 20 2a 63 70 2c 20 2a 63 70 29 3b 0a 09 20 20 20 20 72 65 74 75 ┆x\n", *cp, *cp); retu┆ 0x04f200…09e600 72 6e 28 46 41 49 4c 29 3b 0a 09 7d 0a 0a 09 28 76 6f 69 64 29 20 66 70 72 69 6e 74 66 28 73 74 ┆rn(FAIL); } (void) fprintf(st┆ 0x04f200…09e600 64 65 72 72 2c 0a 09 09 22 72 64 62 69 74 73 3a 20 74 6f 6b 65 6e 20 74 79 70 65 20 25 64 2c 20 ┆derr, "rdbits: token type %d, ┆ 0x04f200…09e600 76 61 6c 75 65 20 25 64 5c 6e 22 2c 0a 09 09 74 6f 6b 74 79 70 65 2c 20 28 74 6f 6b 74 79 70 65 ┆value %d\n", toktype, (toktype┆ 0x04f200…09e600 20 3d 3d 20 53 5f 4e 55 4d 29 20 3f 20 76 61 6c 20 3a 20 2d 31 0a 09 09 29 3b 0a 23 65 6e 64 69 ┆ == S_NUM) ? val : -1 ); #endi┆ 0x04f200…09e600 66 20 2f 2a 20 54 45 53 54 20 2a 2f 0a 09 2f 2a 0a 09 20 2a 20 48 65 72 65 27 73 20 74 68 65 20 ┆f /* TEST */ /* * Here's the ┆ 0x04f200…09e600 73 74 61 74 65 20 6d 61 63 68 69 6e 65 20 74 68 61 74 20 64 6f 65 73 20 74 68 65 20 67 72 61 6d ┆state machine that does the gram┆ 0x04f200…09e600 6d 61 72 20 70 72 6f 63 65 73 73 69 6e 67 0a 09 20 2a 2f 0a 09 73 77 69 74 63 68 28 61 63 74 69 ┆mar processing */ switch(acti┆ 0x04f200…09e600 6f 6e 5b 74 6f 6b 74 79 70 65 5d 5b 73 74 61 74 65 5d 29 0a 09 7b 0a 09 63 61 73 65 20 31 3a 09 ┆on[toktype][state]) { case 1: ┆ 0x04f200…09e600 09 20 20 20 20 2f 2a 20 6e 75 6d 62 65 72 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 63 6f 6d 6d 61 ┆ /* number followed by comma┆ 0x04f200…09e600 20 2a 2f 0a 09 20 20 20 20 2f 2a 20 77 65 20 77 61 6e 74 20 74 6f 20 69 67 6e 6f 72 65 20 61 72 ┆ */ /* we want to ignore ar┆ 0x04f200…09e600 74 69 63 6c 65 73 20 74 6f 6f 20 6f 6c 64 20 74 6f 20 62 65 20 61 63 74 69 76 65 20 2a 2f 0a 09 ┆ticles too old to be active */ ┆ 0x04f200…09e600 20 20 20 20 6c 6f 20 3d 20 28 76 61 6c 20 3e 20 6e 67 70 2d 3e 6e 67 5f 6d 69 6e 29 20 3f 20 76 ┆ lo = (val > ngp->ng_min) ? v┆ 0x04f200…09e600 61 6c 20 3a 20 6e 67 70 2d 3e 6e 67 5f 6d 69 6e 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a 09 ┆al : ngp->ng_min; break; ┆ 0x04f200…09e600 63 61 73 65 20 32 3a 09 09 20 20 20 20 2f 2a 20 63 6f 6d 6d 61 20 66 6f 6c 6c 6f 77 65 64 20 62 ┆case 2: /* comma followed b┆ 0x04f200…09e600 79 20 6e 75 6d 62 65 72 20 2a 2f 0a 23 69 66 64 65 66 20 47 54 45 53 54 0a 09 20 20 20 20 28 76 ┆y number */ #ifdef GTEST (v┆ 0x04f200…09e600 6f 69 64 29 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 0a 09 09 22 72 64 62 69 74 73 3a 20 ┆oid) fprintf(stderr, "rdbits: ┆ 0x04f200…09e600 66 6f 72 67 65 74 74 69 6e 67 20 25 64 20 74 68 72 6f 75 67 68 20 25 64 5c 6e 22 2c 6c 6f 2b 31 ┆forgetting %d through %d\n",lo+1┆ 0x04f200…09e600 2c 76 61 6c 2d 31 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 54 45 53 54 20 2a 2f 0a 09 20 20 20 20 ┆,val-1); #endif /* TEST */ ┆ 0x04f200…09e600 69 66 20 28 6d 6f 64 65 20 26 20 43 4c 45 41 52 29 0a 09 09 66 6f 72 20 28 69 20 3d 20 6c 6f 20 ┆if (mode & CLEAR) for (i = lo ┆ 0x04f200…09e600 2b 20 31 3b 20 69 20 3c 20 76 61 6c 3b 20 69 2b 2b 29 0a 09 09 20 20 20 20 28 76 6f 69 64 29 20 ┆+ 1; i < val; i++) (void) ┆ 0x04f200…09e600 63 6c 65 61 72 62 69 74 28 69 2c 20 6e 67 70 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a 09 ┆clearbit(i, ngp); break; ┆ 0x04f200…09e600 63 61 73 65 20 33 3a 09 09 20 20 20 20 2f 2a 20 64 61 73 68 20 66 6f 6c 6c 6f 77 65 64 20 62 79 ┆case 3: /* dash followed by┆ 0x04f200…09e600 20 6e 75 6d 62 65 72 20 2a 2f 0a 23 69 66 64 65 66 20 47 54 45 53 54 0a 09 20 20 20 20 28 76 6f ┆ number */ #ifdef GTEST (vo┆ 0x04f200…09e600 69 64 29 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 0a 09 09 22 72 64 62 69 74 73 3a 20 6d ┆id) fprintf(stderr, "rdbits: m┆ 0x04f200…09e600 61 72 6b 69 6e 67 20 25 64 20 74 68 72 6f 75 67 68 20 25 64 5c 6e 22 2c 20 6c 6f 2c 20 76 61 6c ┆arking %d through %d\n", lo, val┆ 0x04f200…09e600 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 54 45 53 54 20 2a 2f 0a 09 20 20 20 20 69 66 20 28 6d 6f ┆); #endif /* TEST */ if (mo┆ 0x04f200…09e600 64 65 20 26 20 53 45 54 29 0a 09 09 66 6f 72 20 28 69 20 3d 20 6c 6f 3b 20 69 20 3c 3d 20 76 61 ┆de & SET) for (i = lo; i <= va┆ 0x04f200…09e600 6c 3b 20 69 2b 2b 29 0a 09 09 20 20 20 20 28 76 6f 69 64 29 20 73 65 74 62 69 74 28 69 2c 20 6e ┆l; i++) (void) setbit(i, n┆ 0x04f200…09e600 67 70 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a 09 63 61 73 65 20 34 3a 09 09 20 20 20 20 ┆gp); break; case 4: ┆ 0x04f200…09e600 2f 2a 20 6e 75 6d 62 65 72 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 64 61 73 68 20 2a 2f 0a 09 20 ┆/* number followed by dash */ ┆ 0x04f200…09e600 20 20 20 6c 6f 20 3d 20 76 61 6c 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a 09 63 61 73 65 20 ┆ lo = val; break; case ┆ 0x04f200…09e600 35 3a 09 09 20 20 20 20 2f 2a 20 64 69 67 69 74 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 65 6e 64 ┆5: /* digit followed by end┆ 0x04f200…09e600 2d 6f 66 2d 66 69 65 6c 64 20 2a 2f 0a 09 20 20 20 20 28 76 6f 69 64 29 20 73 65 74 62 69 74 28 ┆-of-field */ (void) setbit(┆ 0x04f200…09e600 76 61 6c 2c 20 6e 67 70 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a 09 63 61 73 65 20 36 3a ┆val, ngp); break; case 6:┆ 0x04f200…09e600 09 09 20 20 20 20 2f 2a 20 73 74 61 72 74 2d 6f 66 2d 66 69 65 6c 64 20 66 6f 6c 6c 6f 77 65 64 ┆ /* start-of-field followed┆ 0x04f200…09e600 20 62 79 20 65 6e 64 2d 6f 66 2d 66 69 65 6c 64 20 2a 2f 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a ┆ by end-of-field */ break; ┆ 0x04f200…09e600 0a 09 64 65 66 61 75 6c 74 3a 0a 09 20 20 20 20 72 65 74 75 72 6e 28 46 41 49 4c 29 3b 0a 09 7d ┆ default: return(FAIL); }┆ 0x04f200…09e600 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 0a 20 20 20 20 20 2a 20 4e 6f 77 20 69 74 27 73 20 ┆ } /* * Now it's ┆ 0x04f200…09e600 74 69 6d 65 20 74 6f 20 66 69 78 20 74 68 65 20 75 6e 72 65 61 64 20 63 6f 75 6e 74 2e 20 49 66 ┆time to fix the unread count. If┆ 0x04f200…09e600 20 74 68 65 20 6d 6f 64 65 20 77 61 73 20 43 4c 45 41 52 2c 0a 20 20 20 20 20 2a 20 65 76 65 72 ┆ the mode was CLEAR, * ever┆ 0x04f200…09e600 79 74 68 69 6e 67 20 69 73 20 4f 4b 3b 20 77 65 20 6f 6e 6c 79 20 61 64 64 65 64 20 62 69 74 73 ┆ything is OK; we only added bits┆ 0x04f200…09e600 20 66 6f 72 20 74 68 65 20 75 6e 73 65 65 6e 20 6f 6e 65 73 2e 20 4f 74 68 65 72 77 69 73 65 2c ┆ for the unseen ones. Otherwise,┆ 0x04f200…09e600 0a 20 20 20 20 20 2a 20 69 66 20 62 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 75 6e ┆ * if b is the number of un┆ 0x04f200…09e600 72 65 61 64 20 61 72 74 69 63 6c 65 73 20 61 6e 64 20 61 20 74 68 65 20 6e 75 6d 62 65 72 20 6f ┆read articles and a the number o┆ 0x04f200…09e600 66 20 72 65 61 64 20 6f 6e 65 73 3b 0a 20 20 20 20 20 2a 09 20 20 20 20 28 62 20 2b 20 61 29 20 ┆f read ones; * (b + a) ┆ 0x04f200…09e600 3d 20 28 6e 67 6d 61 78 28 29 20 2d 20 6e 67 6d 69 6e 28 29 20 2b 20 31 29 0a 20 20 20 20 20 2a ┆= (ngmax() - ngmin() + 1) *┆ 0x04f200…09e600 20 74 68 69 73 20 77 61 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 6f 66 20 74 ┆ this was the initial value of t┆ 0x04f200…09e600 68 65 20 75 6e 72 65 61 64 20 63 6f 75 6e 74 2e 0a 20 20 20 20 20 2a 20 49 66 20 74 68 65 20 6d ┆he unread count. * If the m┆ 0x04f200…09e600 6f 64 65 20 69 73 20 53 45 54 2c 20 74 68 65 20 75 6e 72 65 61 64 20 66 69 65 6c 64 20 77 69 6c ┆ode is SET, the unread field wil┆ 0x04f200…09e600 6c 20 6e 6f 77 20 68 61 76 65 20 74 68 65 20 76 61 6c 75 65 0a 20 20 20 20 20 2a 09 20 20 20 20 ┆l now have the value * ┆ 0x04f200…09e600 28 62 20 2b 20 61 29 20 2d 20 61 20 3d 20 62 0a 20 20 20 20 20 2a 20 49 66 20 74 68 65 20 6d 6f ┆(b + a) - a = b * If the mo┆ 0x04f200…09e600 64 65 20 69 73 20 28 53 45 54 20 7c 20 43 4c 45 41 52 29 2c 20 74 68 65 20 75 6e 72 65 61 64 20 ┆de is (SET | CLEAR), the unread ┆ 0x04f200…09e600 66 69 65 6c 64 20 77 69 6c 6c 20 6e 6f 77 20 68 61 76 65 20 74 68 65 20 76 61 6c 75 65 0a 20 20 ┆field will now have the value ┆ 0x04f200…09e600 20 20 20 2a 09 20 20 20 20 28 62 20 2b 20 61 29 20 2b 20 28 62 20 2d 20 61 29 20 3d 20 32 62 0a ┆ * (b + a) + (b - a) = 2b ┆ 0x04f200…09e600 20 20 20 20 20 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 69 73 20 63 61 73 65 20 77 69 6c 6c 20 ┆ * Note that this case will ┆ 0x04f200…09e600 66 61 69 6c 20 69 66 20 74 68 65 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 77 61 73 6e 27 74 ┆fail if the initial value wasn't┆ 0x04f200…09e600 20 28 62 2b 61 29 2c 20 69 2e 65 2e 0a 20 20 20 20 20 2a 20 75 73 75 61 6c 6c 79 20 69 66 20 28 ┆ (b+a), i.e. * usually if (┆ 0x04f200…09e600 53 45 54 20 7c 20 43 4c 45 41 52 29 20 69 73 20 75 73 65 64 20 61 66 74 65 72 20 74 68 65 20 66 ┆SET | CLEAR) is used after the f┆ 0x04f200…09e600 69 72 73 74 20 72 65 61 64 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 20 28 6d 6f 64 65 20 ┆irst read. */ if (mode ┆ 0x04f200…09e600 3d 3d 20 28 53 45 54 20 7c 20 43 4c 45 41 52 29 29 0a 09 6e 67 70 2d 3e 6e 67 5f 75 6e 72 65 61 ┆== (SET | CLEAR)) ngp->ng_unrea┆ 0x04f200…09e600 64 20 2f 3d 20 32 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e 28 53 55 43 43 45 45 44 29 3b 0a 7d 0a ┆d /= 2; return(SUCCEED); } ┆ 0x04f200…09e600 0a 2f 2a 20 72 64 62 69 74 73 2e 63 20 65 6e 64 73 20 68 65 72 65 20 2a 2f 0a 20 20 20 20 20 2a ┆ /* rdbits.c ends here */ *┆ 0x04f200…09e600 20 74 68 69 73 20 77 61 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 6f 66 20 74 ┆ this was the initial value of t┆ 0x04f200…09e600 68 65 20 75 6e 72 65 61 64 20 63 6f 75 6e 74 2e 0a 20 20 20 20 20 2a 20 49 66 20 74 68 65 20 6d ┆he unread count. * If the m┆ 0x04f200…09e600 6f 64 65 20 69 73 20 53 45 54 2c 20 74 68 65 20 75 6e 72 65 61 64 20 66 69 65 6c 64 20 77 69 6c ┆ode is SET, the unread field wil┆ 0x04f200…09e600 6c 20 6e 6f 77 20 68 61 76 65 20 74 68 65 20 76 61 73 72 63 2f 44 2e 70 6f 72 74 2f 4d 61 6b 65 ┆l now have the vasrc/D.port/Make┆ 0x04f200…09e600 66 69 6c 65 2e 64 73 74 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆file.dst ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆ ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 20 20 20 34 34 34 20 00 20 20 20 ┆ 444 ┆ 0x04f200…09e600 31 34 35 20 00 20 20 20 20 20 31 20 00 20 20 20 20 20 20 31 30 36 34 31 20 20 34 34 37 36 32 33 ┆145 1 10641 447623┆ 0x04f200…09e600 36 32 31 33 20 20 31 30 32 37 35 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆6213 10275 ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆ ┆ […0x9…] 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 23 20 6c 69 62 70 6f 72 74 2e 61 20 67 65 6e ┆ # libport.a gen┆ 0x04f200…09e600 65 72 69 63 20 4d 61 6b 65 66 69 6c 65 20 74 6f 20 62 65 20 63 75 73 74 6f 6d 69 7a 65 64 20 66 ┆eric Makefile to be customized f┆ 0x04f200…09e600 6f 72 20 79 6f 75 72 20 73 69 74 65 20 62 79 20 43 6f 6e 66 69 67 75 72 65 0a 23 0a 23 20 54 68 ┆or your site by Configure # # Th┆ 0x04f200…09e600 69 73 20 69 73 20 74 68 65 20 70 6f 72 74 61 62 69 6c 69 74 79 20 6c 69 62 72 61 72 79 20 64 69 ┆is is the portability library di┆ 0x04f200…09e600 72 65 63 74 6f 72 79 2e 20 54 68 65 20 4d 61 6b 65 66 69 6c 65 20 64 65 66 69 6e 65 73 20 66 6f ┆rectory. The Makefile defines fo┆ 0x04f200…09e600 75 72 20 74 61 72 67 65 74 73 3a 0a 23 0a 23 20 6c 69 62 70 6f 72 74 2e 61 3a 09 54 68 65 20 70 ┆ur targets: # # libport.a: The p┆ 0x04f200…09e600 6f 72 74 61 62 69 6c 69 74 79 20 6c 69 62 72 61 72 79 20 69 74 73 65 6c 66 0a 23 20 6d 61 6e 69 ┆ortability library itself # mani┆ 0x04f200…09e600 66 65 73 74 3a 09 45 63 68 6f 20 61 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6e ┆fest: Echo a string containing n┆ 0x04f200…09e600 61 6d 65 73 20 6f 66 20 61 6c 6c 20 6c 69 62 72 61 72 79 20 73 6f 75 72 63 65 73 0a 23 20 6c 6c ┆ames of all library sources # ll┆ 0x04f200…09e600 69 62 2d 6c 70 6f 72 74 2e 6c 6e 09 54 68 65 20 6c 69 6e 74 20 6c 69 62 72 61 72 79 20 6d 61 64 ┆ib-lport.ln The lint library mad┆ 0x04f200…09e600 65 20 66 72 6f 6d 20 6c 69 62 70 6f 72 74 2e 61 0a 23 20 63 6c 65 61 6e 3a 09 43 6c 65 61 6e 20 ┆e from libport.a # clean: Clean ┆ 0x04f200…09e600 6f 75 74 20 61 6c 6c 20 6f 62 6a 65 63 74 2c 20 6c 69 62 72 61 72 79 20 61 6e 64 20 6c 69 6e 74 ┆out all object, library and lint┆ 0x04f200…09e600 20 66 69 6c 65 73 0a 23 0a 23 20 54 61 72 67 65 74 73 20 74 68 61 74 20 63 72 65 61 74 65 20 61 ┆ files # # Targets that create a┆ 0x04f200…09e600 20 63 6f 75 70 6c 65 20 6f 66 20 69 6e 74 65 72 61 63 74 69 76 65 20 74 65 73 74 20 6d 6f 64 75 ┆ couple of interactive test modu┆ 0x04f200…09e600 6c 65 73 20 61 72 65 20 61 6c 73 6f 20 67 69 76 65 6e 0a 23 20 43 61 6c 6c 20 22 6d 61 6b 65 20 ┆les are also given # Call "make ┆ 0x04f200…09e600 2d 66 20 4d 61 6b 65 66 69 6c 65 2e 64 73 74 20 4d 61 6b 65 66 69 6c 65 22 20 66 72 6f 6d 20 68 ┆-f Makefile.dst Makefile" from h┆ 0x04f200…09e600 65 72 65 20 74 6f 20 72 65 62 75 69 6c 64 20 74 68 65 20 4d 61 6b 65 66 69 6c 65 0a 0a 23 20 4f ┆ere to rebuild the Makefile # O┆ 0x04f200…09e600 74 68 65 72 20 6e 65 74 6e 65 77 73 20 73 6f 75 72 63 65 20 64 69 72 65 63 74 6f 72 69 65 73 0a ┆ther netnews source directories ┆ 0x04f200…09e600 4d 41 49 4e 44 49 52 20 3d 20 2e 2e 0a 0a 44 49 52 4c 49 53 54 20 3d 20 24 28 4d 41 49 4e 44 49 ┆MAINDIR = .. DIRLIST = $(MAINDI┆ 0x04f200…09e600 52 29 0a 49 4e 43 4c 55 44 45 20 3d 20 2d 49 2e 20 2d 49 24 28 4d 41 49 4e 44 49 52 29 0a 4c 49 ┆R) INCLUDE = -I. -I$(MAINDIR) LI┆ 0x04f200…09e600 42 53 44 49 52 20 3d 20 24 28 4d 41 49 4e 44 49 52 29 0a 0a 23 0a 23 20 59 6f 75 20 73 68 6f 75 ┆BSDIR = $(MAINDIR) # # You shou┆ 0x04f200…09e600 6c 64 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 65 64 69 74 20 61 6e 79 74 68 69 6e 67 20 62 65 6c ┆ld not need to edit anything bel┆ 0x04f200…09e600 6f 77 20 74 68 69 73 20 6c 69 6e 65 0a 23 0a 0a 23 20 48 65 72 65 20 61 72 65 20 74 68 65 20 6d ┆ow this line # # Here are the m┆ 0x04f200…09e600 61 63 72 6f 20 64 65 66 69 6e 69 74 69 6f 6e 73 20 74 68 61 74 20 43 6f 6e 66 69 67 75 72 65 20 ┆acro definitions that Configure ┆ 0x04f200…09e600 74 77 65 61 6b 73 0a 43 46 4c 41 47 53 20 3d 20 24 28 43 44 45 42 55 47 29 20 24 28 49 4e 43 4c ┆tweaks CFLAGS = $(CDEBUG) $(INCL┆ 0x04f200…09e600 55 44 45 29 20 24 28 43 53 50 45 43 49 41 4c 29 0a 4c 44 46 4c 41 47 53 20 3d 20 24 28 4c 44 44 ┆UDE) $(CSPECIAL) LDFLAGS = $(LDD┆ 0x04f200…09e600 45 42 55 47 29 20 24 28 4c 44 53 50 45 43 49 41 4c 29 0a 4c 49 4e 54 46 4c 41 47 53 20 3d 20 24 ┆EBUG) $(LDSPECIAL) LINTFLAGS = $┆ 0x04f200…09e600 28 49 4e 43 4c 55 44 45 29 0a 0a 2e 50 52 45 43 49 4f 55 53 3a 20 4d 61 6b 65 66 69 6c 65 20 6c ┆(INCLUDE) .PRECIOUS: Makefile l┆ 0x04f200…09e600 69 62 70 6f 72 74 2e 61 0a 0a 23 56 37 20 53 59 53 53 52 43 53 20 3d 20 62 7a 65 72 6f 2e 63 20 ┆ibport.a #V7 SYSSRCS = bzero.c ┆ 0x04f200…09e600 75 6e 61 6d 65 2e 63 0a 23 55 53 47 20 53 59 53 53 52 43 53 20 3d 20 62 7a 65 72 6f 2e 63 0a 23 ┆uname.c #USG SYSSRCS = bzero.c #┆ 0x04f200…09e600 42 53 44 34 5f 31 20 53 59 53 53 52 43 53 20 3d 20 62 7a 65 72 6f 2e 63 20 75 6e 61 6d 65 2e 63 ┆BSD4_1 SYSSRCS = bzero.c uname.c┆ 0x04f200…09e600 0a 23 42 53 44 34 5f 32 20 53 59 53 53 52 43 53 20 3d 20 75 6e 61 6d 65 2e 63 0a 23 42 53 44 34 ┆ #BSD4_2 SYSSRCS = uname.c #BSD4┆ 0x04f200…09e600 5f 33 20 53 59 53 53 52 43 53 20 3d 20 75 6e 61 6d 65 2e 63 0a 23 53 43 4f 5f 58 45 4e 49 58 20 ┆_3 SYSSRCS = uname.c #SCO_XENIX ┆ 0x04f200…09e600 53 59 53 53 52 43 53 20 3d 20 62 7a 65 72 6f 2e 63 20 6c 6f 63 6b 66 2e 63 0a 23 4d 5f 58 45 4e ┆SYSSRCS = bzero.c lockf.c #M_XEN┆ 0x04f200…09e600 49 58 20 53 59 53 53 52 43 53 20 3d 20 62 7a 65 72 6f 2e 63 20 6c 6f 63 6b 66 2e 63 0a 0a 23 56 ┆IX SYSSRCS = bzero.c lockf.c #V┆ 0x04f200…09e600 37 20 53 59 53 4f 42 4a 53 20 3d 20 62 7a 65 72 6f 2e 6f 20 75 6e 61 6d 65 2e 6f 0a 23 55 53 47 ┆7 SYSOBJS = bzero.o uname.o #USG┆ 0x04f200…09e600 20 53 59 53 4f 42 4a 53 20 3d 20 62 7a 65 72 6f 2e 6f 0a 23 42 53 44 34 5f 31 20 53 59 53 4f 42 ┆ SYSOBJS = bzero.o #BSD4_1 SYSOB┆ 0x04f200…09e600 4a 53 20 3d 20 62 7a 65 72 6f 2e 6f 20 75 6e 61 6d 65 2e 6f 0a 23 42 53 44 34 5f 32 20 53 59 53 ┆JS = bzero.o uname.o #BSD4_2 SYS┆ 0x04f200…09e600 4f 42 4a 53 20 3d 20 75 6e 61 6d 65 2e 6f 0a 23 42 53 44 34 5f 33 20 53 59 53 4f 42 4a 53 20 3d ┆OBJS = uname.o #BSD4_3 SYSOBJS =┆ 0x04f200…09e600 20 75 6e 61 6d 65 2e 6f 0a 23 53 43 4f 5f 58 45 4e 49 58 20 53 59 53 4f 42 4a 53 20 3d 20 62 7a ┆ uname.o #SCO_XENIX SYSOBJS = bz┆ 0x04f200…09e600 65 72 6f 2e 6f 20 6c 6f 63 6b 66 2e 6f 0a 23 4d 5f 58 45 4e 49 58 20 53 59 53 4f 42 4a 53 20 3d ┆ero.o lockf.o #M_XENIX SYSOBJS =┆ 0x04f200…09e600 20 62 7a 65 72 6f 2e 6f 20 6c 6f 63 6b 66 2e 6f 0a 23 55 4e 49 58 50 43 20 53 59 53 4f 42 4a 53 ┆ bzero.o lockf.o #UNIXPC SYSOBJS┆ 0x04f200…09e600 20 3d 20 62 7a 65 72 6f 2e 6f 20 6c 6f 63 6b 66 2e 6f 0a 0a 4d 41 4c 4c 4f 43 53 52 43 3d 0a 4d ┆ = bzero.o lockf.o MALLOCSRC= M┆ 0x04f200…09e600 41 4c 4c 4f 43 4f 42 4a 3d 0a 0a 41 4c 4c 53 59 53 43 20 3d 20 62 7a 65 72 6f 2e 63 20 75 6e 61 ┆ALLOCOBJ= ALLSYSC = bzero.c una┆ 0x04f200…09e600 6d 65 2e 63 20 78 6c 6f 63 6b 66 2e 63 0a 0a 4c 48 44 52 53 20 3d 20 61 6c 69 73 74 2e 68 20 64 ┆me.c xlockf.c LHDRS = alist.h d┆ 0x04f200…09e600 62 61 6c 6c 6f 63 2e 68 20 65 64 62 6d 2e 68 20 67 72 6f 77 2e 68 20 70 72 6f 63 6f 70 74 73 2e ┆balloc.h edbm.h grow.h procopts.┆ 0x04f200…09e600 68 20 72 65 67 65 78 70 2e 68 20 73 65 72 76 65 72 2e 68 20 73 6c 69 73 74 2e 68 20 5c 0a 09 73 ┆h regexp.h server.h slist.h \ s┆ 0x04f200…09e600 70 61 77 6e 2e 68 20 6c 69 62 70 6f 72 74 2e 68 0a 4c 53 52 43 53 20 3d 20 61 6c 69 73 74 2e 63 ┆pawn.h libport.h LSRCS = alist.c┆ 0x04f200…09e600 20 61 72 70 61 64 61 74 65 2e 63 20 62 61 63 6b 71 75 6f 74 65 2e 63 20 62 69 74 62 75 63 6b 65 ┆ arpadate.c backquote.c bitbucke┆ 0x04f200…09e600 74 2e 63 20 63 68 65 63 6b 73 75 6d 2e 63 20 64 62 61 6c 6c 6f 63 2e 63 20 64 66 2e 63 20 5c 0a ┆t.c checksum.c dballoc.c df.c \ ┆ 0x04f200…09e600 09 65 64 62 6d 2e 63 20 65 6e 76 69 72 6f 6e 2e 63 20 65 72 72 6d 73 67 2e 63 20 66 63 6f 70 79 ┆ edbm.c environ.c errmsg.c fcopy┆ 0x04f200…09e600 2e 63 20 66 69 6c 65 73 74 61 74 2e 63 20 66 75 6c 6c 6e 61 6d 65 2e 63 20 66 77 61 69 74 2e 63 ┆.c filestat.c fullname.c fwait.c┆ 0x04f200…09e600 20 5c 0a 09 67 72 6f 77 2e 63 20 6c 63 61 73 65 2e 63 20 6c 69 6e 65 63 6f 75 6e 74 2e 63 20 6d ┆ \ grow.c lcase.c linecount.c m┆ 0x04f200…09e600 6b 62 72 61 6e 63 68 2e 63 20 6d 6f 72 65 2e 63 20 6e 73 74 72 69 70 2e 63 20 70 65 6f 70 65 6e ┆kbranch.c more.c nstrip.c peopen┆ 0x04f200…09e600 2e 63 20 5c 0a 09 70 72 65 66 69 78 2e 63 20 70 72 6f 63 6f 70 74 73 2e 63 20 72 65 67 65 78 70 ┆.c \ prefix.c procopts.c regexp┆ 0x04f200…09e600 2e 63 20 73 61 76 65 73 74 72 2e 63 20 73 65 72 76 65 72 2e 63 20 73 65 74 61 64 64 2e 63 20 73 ┆.c savestr.c server.c setadd.c s┆ 0x04f200…09e600 6c 69 73 74 2e 63 20 5c 0a 09 73 70 61 77 6e 2e 63 20 73 74 72 69 6e 64 65 78 2e 63 20 76 6d 73 ┆list.c \ spawn.c strindex.c vms┆ 0x04f200…09e600 2e 63 20 78 65 72 72 6f 72 2e 63 0a 4c 4f 42 4a 53 20 3d 20 61 6c 69 73 74 2e 6f 20 61 72 70 61 ┆.c xerror.c LOBJS = alist.o arpa┆ 0x04f200…09e600 64 61 74 65 2e 6f 20 62 61 63 6b 71 75 6f 74 65 2e 6f 20 62 69 74 62 75 63 6b 65 74 2e 6f 20 63 ┆date.o backquote.o bitbucket.o c┆ 0x04f200…09e600 68 65 63 6b 73 75 6d 2e 6f 20 64 62 61 6c 6c 6f 63 2e 6f 20 64 66 2e 6f 20 5c 0a 09 65 64 62 6d ┆hecksum.o dballoc.o df.o \ edbm┆ 0x04f200…09e600 2e 6f 20 65 6e 76 69 72 6f 6e 2e 6f 20 65 72 72 6d 73 67 2e 6f 20 66 63 6f 70 79 2e 6f 20 66 69 ┆.o environ.o errmsg.o fcopy.o fi┆ 0x04f200…09e600 6c 65 73 74 61 74 2e 6f 20 66 75 6c 6c 6e 61 6d 65 2e 6f 20 66 77 61 69 74 2e 6f 20 5c 0a 09 67 ┆lestat.o fullname.o fwait.o \ g┆ 0x04f200…09e600 72 6f 77 2e 6f 20 6c 63 61 73 65 2e 6f 20 6c 69 6e 65 63 6f 75 6e 74 2e 6f 20 6d 6b 62 72 61 6e ┆row.o lcase.o linecount.o mkbran┆ 0x04f200…09e600 63 68 2e 6f 20 6d 6f 72 65 2e 6f 20 6e 73 74 72 69 70 2e 6f 20 70 65 6f 70 65 6e 2e 6f 20 5c 0a ┆ch.o more.o nstrip.o peopen.o \ ┆ 0x04f200…09e600 09 70 72 65 66 69 78 2e 6f 20 70 72 6f 63 6f 70 74 73 2e 6f 20 72 65 67 65 78 70 2e 6f 20 73 61 ┆ prefix.o procopts.o regexp.o sa┆ 0x04f200…09e600 76 65 73 74 72 2e 6f 20 73 65 72 76 65 72 2e 6f 20 73 65 74 61 64 64 2e 6f 20 73 6c 69 73 74 2e ┆vestr.o server.o setadd.o slist.┆ 0x04f200…09e600 6f 20 5c 0a 09 73 70 61 77 6e 2e 6f 20 73 74 72 69 6e 64 65 78 2e 6f 20 76 6d 73 2e 6f 20 78 65 ┆o \ spawn.o strindex.o vms.o xe┆ 0x04f200…09e600 72 72 6f 72 2e 6f 0a 0a 6c 69 62 70 6f 72 74 2e 61 3a 20 24 28 4c 4f 42 4a 53 29 20 24 28 4d 41 ┆rror.o libport.a: $(LOBJS) $(MA┆ 0x04f200…09e600 4c 4c 4f 43 4f 42 4a 29 20 24 28 53 59 53 4f 42 4a 53 29 20 67 65 74 64 61 74 65 2e 6f 0a 09 61 ┆LLOCOBJ) $(SYSOBJS) getdate.o a┆ 0x04f200…09e600 72 20 6c 72 63 20 6c 69 62 70 6f 72 74 2e 61 20 24 3f 0a 09 2d 72 61 6e 6c 69 62 20 6c 69 62 70 ┆r lrc libport.a $? -ranlib libp┆ 0x04f200…09e600 6f 72 74 2e 61 0a 09 63 70 20 6c 69 62 70 6f 72 74 2e 61 20 6c 69 62 70 6f 72 74 6e 6d 2e 61 0a ┆ort.a cp libport.a libportnm.a ┆ 0x04f200…09e600 09 61 72 20 64 20 6c 69 62 70 6f 72 74 6e 6d 2e 61 20 24 28 4d 41 4c 4c 4f 43 4f 42 4a 29 0a 09 ┆ ar d libportnm.a $(MALLOCOBJ) ┆ 0x04f200…09e600 2d 72 61 6e 6c 69 62 20 6c 69 62 70 6f 72 74 6e 6d 2e 61 0a 23 50 52 4f 46 4c 49 42 20 09 28 63 ┆-ranlib libportnm.a #PROFLIB (c┆ 0x04f200…09e600 64 20 70 72 6f 66 69 6c 65 64 3b 20 61 72 20 6c 72 63 20 2e 2e 2f 6c 69 62 70 6f 72 74 5f 70 2e ┆d profiled; ar lrc ../libport_p.┆ 0x04f200…09e600 61 20 24 3f 29 0a 23 50 52 4f 46 4c 49 42 20 09 2d 72 61 6e 6c 69 62 20 6c 69 62 70 6f 72 74 5f ┆a $?) #PROFLIB -ranlib libport_┆ 0x04f200…09e600 70 2e 61 0a 20 20 0a 73 65 74 75 70 3a 0a 23 50 52 4f 46 4c 49 42 09 2d 6d 6b 64 69 72 20 70 72 ┆p.a setup: #PROFLIB -mkdir pr┆ 0x04f200…09e600 6f 66 69 6c 65 64 0a 0a 23 50 52 4f 46 4c 49 42 20 2e 63 2e 6f 3a 0a 23 50 52 4f 46 4c 49 42 20 ┆ofiled #PROFLIB .c.o: #PROFLIB ┆ 0x04f200…09e600 09 24 7b 43 43 7d 20 2d 70 20 24 7b 43 46 4c 41 47 53 7d 20 2d 63 20 24 2a 2e 63 0a 23 50 52 4f ┆ ${CC} -p ${CFLAGS} -c $*.c #PRO┆ 0x04f200…09e600 46 4c 49 42 20 09 6d 76 20 24 2a 2e 6f 20 70 72 6f 66 69 6c 65 64 2f 24 2a 2e 6f 0a 23 50 52 4f ┆FLIB mv $*.o profiled/$*.o #PRO┆ 0x04f200…09e600 46 4c 49 42 20 09 24 7b 43 43 7d 20 24 7b 43 46 4c 41 47 53 7d 20 2d 63 20 24 2a 2e 63 0a 0a 67 ┆FLIB ${CC} ${CFLAGS} -c $*.c g┆ 0x04f200…09e600 65 74 64 61 74 65 2e 63 3a 20 67 65 74 64 61 74 65 2e 79 20 24 28 4d 41 49 4e 44 49 52 29 2f 73 ┆etdate.c: getdate.y $(MAINDIR)/s┆ 0x04f200…09e600 79 73 74 65 6d 2e 68 20 24 28 4d 41 49 4e 44 49 52 29 2f 63 6f 6e 66 69 67 73 79 73 2e 68 0a 09 ┆ystem.h $(MAINDIR)/configsys.h ┆ 0x04f200…09e600 40 65 63 68 6f 20 22 65 78 70 65 63 74 20 38 20 73 68 69 66 74 2f 72 65 64 75 63 65 20 63 6f 6e ┆@echo "expect 8 shift/reduce con┆ 0x04f200…09e600 66 6c 69 63 74 73 22 0a 09 79 61 63 63 20 67 65 74 64 61 74 65 2e 79 0a 09 6d 76 20 79 2e 74 61 ┆flicts" yacc getdate.y mv y.ta┆ 0x04f200…09e600 62 2e 63 20 67 65 74 64 61 74 65 2e 63 0a 0a 65 78 70 6f 72 74 3a 20 73 65 74 75 70 20 6c 69 62 ┆b.c getdate.c export: setup lib┆ 0x04f200…09e600 70 6f 72 74 2e 61 0a 09 40 72 6d 20 2d 66 20 24 28 4c 49 42 53 44 49 52 29 2f 6c 69 62 70 6f 72 ┆port.a @rm -f $(LIBSDIR)/libpor┆ 0x04f200…09e600 74 2e 61 0a 09 2d 6c 6e 20 6c 69 62 70 6f 72 74 2e 61 20 24 28 4c 49 42 53 44 49 52 29 0a 09 40 ┆t.a -ln libport.a $(LIBSDIR) @┆ 0x04f200…09e600 72 6d 20 2d 66 20 24 28 4c 49 42 53 44 49 52 29 2f 6c 69 62 70 6f 72 74 6e 6d 2e 61 0a 09 2d 6c ┆rm -f $(LIBSDIR)/libportnm.a -l┆ 0x04f200…09e600 6e 20 6c 69 62 70 6f 72 74 6e 6d 2e 61 20 24 28 4c 49 42 53 44 49 52 29 0a 23 50 52 4f 46 4c 49 ┆n libportnm.a $(LIBSDIR) #PROFLI┆ 0x04f200…09e600 42 20 09 40 72 6d 20 2d 66 20 24 28 4c 49 42 53 44 49 52 29 2f 70 72 6f 66 69 6c 65 64 2f 6c 69 ┆B @rm -f $(LIBSDIR)/profiled/li┆ 0x04f200…09e600 62 70 6f 72 74 2e 61 0a 23 50 52 4f 46 4c 49 42 20 09 2d 6c 6e 20 6c 69 62 70 6f 72 74 5f 70 2e ┆bport.a #PROFLIB -ln libport_p.┆ 0x04f200…09e600 61 20 24 28 4c 49 42 53 44 49 52 29 2f 70 72 6f 66 69 6c 65 64 2f 6c 69 62 70 6f 72 74 2e 61 0a ┆a $(LIBSDIR)/profiled/libport.a ┆ 0x04f200…09e600 0a 4d 61 6b 65 66 69 6c 65 3a 20 4d 61 6b 65 66 69 6c 65 2e 64 73 74 0a 09 24 28 4d 41 49 4e 44 ┆ Makefile: Makefile.dst $(MAIND┆ 0x04f200…09e600 49 52 29 2f 47 65 6e 65 72 61 74 65 4d 61 6b 65 20 24 28 44 49 52 4c 49 53 54 29 0a 0a 23 20 2d ┆IR)/GenerateMake $(DIRLIST) # -┆ 0x04f200…09e600 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ┆--------------------------------┆ […0x1…] 0x04f200…09e600 2d 2d 2d 2d 2d 0a 23 20 4f 42 4a 45 43 54 20 41 55 54 4f 2d 44 45 50 45 4e 44 45 4e 43 49 45 53 ┆----- # OBJECT AUTO-DEPENDENCIES┆ 0x04f200…09e600 20 47 4f 20 41 46 54 45 52 20 54 48 49 53 20 4c 49 4e 45 20 2d 2d 20 44 4f 20 4e 4f 54 20 44 45 ┆ GO AFTER THIS LINE -- DO NOT DE┆ 0x04f200…09e600 4c 45 54 45 20 49 54 21 21 21 0a 23 0a 2e 53 55 46 46 49 58 45 53 3a 20 2e 6c 6e 0a 0a 2e 63 2e ┆LETE IT!!! # .SUFFIXES: .ln .c.┆ 0x04f200…09e600 6c 6e 3a 0a 23 4c 49 4e 54 4c 49 42 53 09 6c 69 6e 74 20 24 28 4c 49 4e 54 46 4c 41 47 53 29 20 ┆ln: #LINTLIBS lint $(LINTFLAGS) ┆ 0x04f200…09e600 2d 63 20 24 3c 0a 23 4e 4f 4c 49 4e 54 4c 49 42 53 09 6c 69 6e 74 20 24 28 4c 49 4e 54 46 4c 41 ┆-c $< #NOLINTLIBS lint $(LINTFLA┆ 0x04f200…09e600 47 53 29 20 2d 43 24 2a 20 24 3c 0a 0a 23 20 4c 49 4e 54 20 41 55 54 4f 2d 44 45 50 45 4e 44 45 ┆GS) -C$* $< # LINT AUTO-DEPENDE┆ 0x04f200…09e600 4e 43 49 45 53 20 47 4f 20 41 46 54 45 52 20 54 48 49 53 20 4c 49 4e 45 20 2d 2d 20 44 4f 20 4e ┆NCIES GO AFTER THIS LINE -- DO N┆ 0x04f200…09e600 4f 54 20 44 45 4c 45 54 45 20 49 54 21 21 21 0a 0a 6c 69 6e 74 6c 69 62 3a 20 24 28 4c 49 42 53 ┆OT DELETE IT!!! lintlib: $(LIBS┆ 0x04f200…09e600 44 49 52 29 2f 6c 6c 69 62 2d 6c 70 6f 72 74 2e 6c 6e 0a 0a 24 28 4c 49 42 53 44 49 52 29 2f 6c ┆DIR)/llib-lport.ln $(LIBSDIR)/l┆ 0x04f200…09e600 6c 69 62 2d 6c 70 6f 72 74 2e 6c 6e 3a 20 6c 6c 69 62 2d 6c 70 6f 72 74 2e 6c 6e 0a 09 63 70 20 ┆lib-lport.ln: llib-lport.ln cp ┆ 0x04f200…09e600 6c 6c 69 62 2d 6c 70 6f 72 74 2e 6c 6e 20 24 28 4c 49 42 53 44 49 52 29 0a 0a 23 4c 49 4e 54 4c ┆llib-lport.ln $(LIBSDIR) #LINTL┆ 0x04f200…09e600 49 42 53 20 6c 6c 69 62 2d 6c 70 6f 72 74 2e 6c 6e 3a 20 24 28 53 59 53 53 52 43 53 3a 2e 63 3d ┆IBS llib-lport.ln: $(SYSSRCS:.c=┆ 0x04f200…09e600 2e 6c 6e 29 20 24 28 4c 53 52 43 53 3a 2e 63 3d 2e 6c 6e 29 0a 23 4c 49 4e 54 4c 49 42 53 09 6c ┆.ln) $(LSRCS:.c=.ln) #LINTLIBS l┆ 0x04f200…09e600 69 6e 74 20 2d 78 20 2d 75 20 24 28 53 59 53 53 52 43 53 3a 2e 63 3d 2e 6c 6e 29 20 24 28 4c 53 ┆int -x -u $(SYSSRCS:.c=.ln) $(LS┆ 0x04f200…09e600 52 43 53 3a 2e 63 3d 2e 6c 6e 29 20 2d 6f 20 70 6f 72 74 0a 23 4e 4f 4c 49 4e 54 4c 49 42 53 20 ┆RCS:.c=.ln) -o port #NOLINTLIBS ┆ 0x04f200…09e600 6c 6c 69 62 2d 6c 70 6f 72 74 2e 6c 6e 3a 20 24 28 53 59 53 53 52 43 53 29 20 24 28 4c 53 52 43 ┆llib-lport.ln: $(SYSSRCS) $(LSRC┆ 0x04f200…09e600 53 29 0a 23 4e 4f 4c 49 4e 54 4c 49 42 53 09 6c 69 6e 74 20 24 28 4c 49 4e 54 46 4c 41 47 53 29 ┆S) #NOLINTLIBS lint $(LINTFLAGS)┆ 0x04f200…09e600 20 2d 43 70 6f 72 74 20 24 28 53 59 53 53 52 43 53 29 20 24 28 4c 53 52 43 53 29 0a 0a 23 0a 23 ┆ -Cport $(SYSSRCS) $(LSRCS) # #┆ 0x04f200…09e600 20 54 65 73 74 20 6d 6f 64 75 6c 65 73 0a 23 0a 54 45 53 54 45 52 53 20 3d 20 65 64 62 6d 20 61 ┆ Test modules # TESTERS = edbm a┆ 0x04f200…09e600 6c 69 73 74 20 73 6c 69 73 74 20 73 65 72 76 65 72 20 6d 6b 62 72 61 6e 63 68 0a 65 64 62 6d 3a ┆list slist server mkbranch edbm:┆ 0x04f200…09e600 20 65 64 62 6d 2e 63 20 65 64 62 6d 2e 68 0a 09 24 28 43 43 29 20 2d 44 4d 41 49 4e 20 2d 67 20 ┆ edbm.c edbm.h $(CC) -DMAIN -g ┆ 0x04f200…09e600 24 28 43 46 4c 41 47 53 29 20 24 28 4c 53 50 45 43 49 41 4c 29 20 65 64 62 6d 2e 63 20 2d 6f 20 ┆$(CFLAGS) $(LSPECIAL) edbm.c -o ┆ 0x04f200…09e600 65 64 62 6d 0a 0a 61 6c 69 73 74 3a 20 61 6c 69 73 74 2e 63 20 61 6c 69 73 74 2e 68 20 64 62 61 ┆edbm alist: alist.c alist.h dba┆ 0x04f200…09e600 6c 6c 6f 63 2e 68 20 6c 69 62 70 6f 72 74 2e 61 0a 09 24 28 43 43 29 20 2d 44 4d 41 49 4e 20 2d ┆lloc.h libport.a $(CC) -DMAIN -┆ 0x04f200…09e600 67 20 24 28 43 46 4c 41 47 53 29 20 24 28 4c 53 50 45 43 49 41 4c 29 20 61 6c 69 73 74 2e 63 20 ┆g $(CFLAGS) $(LSPECIAL) alist.c ┆ 0x04f200…09e600 6c 69 62 70 6f 72 74 2e 61 20 2d 6f 20 61 6c 69 73 74 0a 0a 73 6c 69 73 74 3a 20 73 6c 69 73 74 ┆libport.a -o alist slist: slist┆ 0x04f200…09e600 2e 63 20 73 6c 69 73 74 2e 68 20 6c 69 62 70 6f 72 74 2e 61 0a 09 24 28 43 43 29 20 2d 44 4d 41 ┆.c slist.h libport.a $(CC) -DMA┆ 0x04f200…09e600 49 4e 20 2d 67 20 24 28 43 46 4c 41 47 53 29 20 24 28 4c 53 50 45 43 49 41 4c 29 20 73 6c 69 73 ┆IN -g $(CFLAGS) $(LSPECIAL) slis┆ 0x04f200…09e600 74 2e 63 20 6c 69 62 70 6f 72 74 2e 61 20 2d 6f 20 73 6c 69 73 74 0a 0a 73 65 72 76 65 72 3a 20 ┆t.c libport.a -o slist server: ┆ 0x04f200…09e600 73 65 72 76 65 72 2e 63 20 6c 69 62 70 6f 72 74 2e 61 0a 09 24 28 43 43 29 20 2d 44 4d 41 49 4e ┆server.c libport.a $(CC) -DMAIN┆ 0x04f200…09e600 20 2d 67 20 24 28 43 46 4c 41 47 53 29 20 24 28 4c 53 50 45 43 49 41 4c 29 20 73 65 72 76 65 72 ┆ -g $(CFLAGS) $(LSPECIAL) server┆ 0x04f200…09e600 2e 63 20 6c 69 62 70 6f 72 74 2e 61 20 2d 6f 20 73 65 72 76 65 72 0a 0a 6d 6b 62 72 61 6e 63 68 ┆.c libport.a -o server mkbranch┆ 0x04f200…09e600 3a 20 6d 6b 64 69 72 2e 63 20 66 77 61 69 74 2e 6f 0a 09 24 28 43 43 29 20 2d 44 4d 41 49 4e 20 ┆: mkdir.c fwait.o $(CC) -DMAIN ┆ 0x04f200…09e600 2d 67 20 24 28 43 46 4c 41 47 53 29 20 24 28 4c 53 50 45 43 49 41 4c 29 20 6d 6b 64 69 72 2e 63 ┆-g $(CFLAGS) $(LSPECIAL) mkdir.c┆ 0x04f200…09e600 20 66 77 61 69 74 2e 6f 20 2d 6f 20 6d 6b 62 72 61 6e 63 68 0a 0a 73 65 74 61 64 64 3a 20 73 65 ┆ fwait.o -o mkbranch setadd: se┆ 0x04f200…09e600 74 61 64 64 2e 63 0a 09 24 28 43 43 29 20 2d 44 4d 41 49 4e 20 2d 67 20 24 28 43 46 4c 41 47 53 ┆tadd.c $(CC) -DMAIN -g $(CFLAGS┆ 0x04f200…09e600 29 20 24 28 4c 53 50 45 43 49 41 4c 29 20 73 65 74 61 64 64 2e 63 20 2d 6f 20 73 65 74 61 64 64 ┆) $(LSPECIAL) setadd.c -o setadd┆ 0x04f200…09e600 0a 0a 23 0a 23 20 52 61 6e 64 6f 6d 20 75 74 69 6c 69 74 79 20 70 72 6f 64 75 63 74 69 6f 6e 73 ┆ # # Random utility productions┆ 0x04f200…09e600 0a 23 0a 50 4f 52 54 53 52 43 53 20 3d 20 24 28 41 4c 4c 53 59 53 43 29 20 24 28 4c 48 44 52 53 ┆ # PORTSRCS = $(ALLSYSC) $(LHDRS┆ 0x04f200…09e600 29 20 24 28 4c 53 52 43 53 29 20 67 65 74 64 61 74 65 2e 79 0a 6d 61 6e 69 66 65 73 74 3a 0a 09 ┆) $(LSRCS) getdate.y manifest: ┆ 0x04f200…09e600 65 63 68 6f 20 4d 61 6b 65 66 69 6c 65 2e 64 73 74 20 4d 61 6b 65 66 69 6c 65 20 24 28 50 4f 52 ┆echo Makefile.dst Makefile $(POR┆ 0x04f200…09e600 54 53 52 43 53 29 0a 0a 64 69 73 74 63 6c 65 61 6e 3a 0a 09 72 6d 20 2d 66 20 24 28 54 45 53 54 ┆TSRCS) distclean: rm -f $(TEST┆ 0x04f200…09e600 45 52 53 29 0a 0a 63 6c 65 61 6e 3a 20 64 69 73 74 63 6c 65 61 6e 0a 09 72 6d 20 2d 66 20 2a 2e ┆ERS) clean: distclean rm -f *.┆ 0x04f200…09e600 6f 20 2a 2e 61 20 2a 2e 6c 6e 20 2a 7e 20 4d 61 6b 65 66 69 6c 65 20 67 65 74 64 61 74 65 2e 63 ┆o *.a *.ln *~ Makefile getdate.c┆ 0x04f200…09e600 0a 09 72 6d 20 2d 66 72 20 70 72 6f 66 69 6c 65 64 0a 0a 23 20 6c 69 62 70 6f 72 74 2e 61 20 4d ┆ rm -fr profiled # libport.a M┆ 0x04f200…09e600 61 6b 65 66 69 6c 65 20 65 6e 64 73 20 68 65 72 65 0a 0a 09 24 28 43 43 29 20 2d 44 4d 41 49 4e ┆akefile ends here $(CC) -DMAIN┆ 0x04f200…09e600 20 2d 67 20 24 28 43 46 4c 41 47 53 29 20 24 28 4c 53 50 45 43 49 41 4c 29 20 73 65 72 76 65 72 ┆ -g $(CFLAGS) $(LSPECIAL) server┆ 0x04f200…09e600 2e 63 20 6c 69 62 70 6f 72 74 2e 61 20 2d 6f 20 73 65 72 76 65 72 0a 0a 6d 6b 62 72 61 6e 63 68 ┆.c libport.a -o server mkbranch┆ 0x04f200…09e600 3a 20 6d 6b 64 69 72 2e 63 20 66 77 61 69 74 2e 6f 73 72 63 2f 44 2e 70 6f 72 74 2f 61 6c 69 73 ┆: mkdir.c fwait.osrc/D.port/alis┆ 0x04f200…09e600 74 2e 63 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆t.c ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆ ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 20 20 20 34 34 34 20 00 20 20 20 ┆ 444 ┆ 0x04f200…09e600 31 34 35 20 00 20 20 20 20 20 31 20 00 20 20 20 20 20 20 31 34 36 32 32 20 20 34 34 35 36 31 35 ┆145 1 14622 445615┆ 0x04f200…09e600 34 30 35 31 20 20 20 37 33 32 34 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆4051 7324 ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆ ┆ […0x9…] 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆ /**************┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆********************************┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a ┆******************************* ┆ 0x04f200…09e600 0a 4e 41 4d 45 0a 20 20 20 61 6c 69 73 74 2e 63 20 2d 2d 20 75 73 65 20 64 62 61 6c 6c 6f 63 20 ┆ NAME alist.c -- use dballoc ┆ 0x04f200…09e600 72 6f 75 74 69 6e 65 73 20 74 6f 20 6d 61 6e 61 67 65 20 61 73 73 6f 63 69 61 74 69 6f 6e 20 6c ┆routines to manage association l┆ 0x04f200…09e600 69 73 74 73 0a 0a 53 59 4e 4f 50 53 49 53 0a 20 20 20 23 69 6e 63 6c 75 64 65 20 22 64 62 61 6c ┆ists SYNOPSIS #include "dbal┆ 0x04f200…09e600 6c 6f 63 2e 68 22 0a 20 20 20 23 69 6e 63 6c 75 64 65 20 22 61 6c 69 73 74 2e 68 22 0a 0a 20 20 ┆loc.h" #include "alist.h" ┆ 0x04f200…09e600 20 69 6e 74 20 61 73 70 6c 69 74 28 61 73 2c 20 66 70 29 09 2d 2d 20 73 70 6c 69 74 20 74 68 65 ┆ int asplit(as, fp) -- split the┆ 0x04f200…09e600 20 67 69 76 65 6e 20 6c 69 6e 65 20 69 6e 74 6f 20 61 6e 20 61 73 73 6f 63 69 61 74 69 6f 6e 20 ┆ given line into an association ┆ 0x04f200…09e600 72 65 63 6f 72 64 0a 20 20 20 61 73 73 6f 63 20 2a 61 73 3b 20 46 49 4c 45 20 2a 66 70 3b 0a 20 ┆record assoc *as; FILE *fp; ┆ 0x04f200…09e600 0a 20 20 20 69 6e 74 20 61 64 75 6d 70 28 61 73 2c 20 66 70 29 09 2d 2d 20 77 72 69 74 65 20 74 ┆ int adump(as, fp) -- write t┆ 0x04f200…09e600 68 65 20 74 65 78 74 20 66 6f 72 6d 20 6f 66 20 61 20 72 65 63 6f 72 64 20 74 6f 20 61 20 66 69 ┆he text form of a record to a fi┆ 0x04f200…09e600 6c 65 20 70 6f 69 6e 74 65 72 0a 20 20 20 61 73 73 6f 63 20 2a 61 73 3b 20 46 49 4c 45 20 2a 66 ┆le pointer assoc *as; FILE *f┆ 0x04f200…09e600 70 3b 0a 0a 20 20 20 63 68 61 72 20 2a 61 6d 61 74 63 68 28 64 62 2c 20 6e 61 6d 65 2c 20 66 6e ┆p; char *amatch(db, name, fn┆ 0x04f200…09e600 29 09 2d 2d 20 72 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20 61 73 73 6f 63 69 61 74 65 64 ┆) -- return the value associated┆ 0x04f200…09e600 20 77 69 74 68 20 61 20 67 69 76 65 6e 20 6b 65 79 0a 20 20 20 64 62 64 65 66 5f 74 20 2a 64 62 ┆ with a given key dbdef_t *db┆ 0x04f200…09e600 3b 20 63 68 61 72 20 2a 6e 61 6d 65 3b 20 62 6f 6f 6c 20 28 2a 66 6e 29 28 29 3b 0a 0a 20 20 20 ┆; char *name; bool (*fn)(); ┆ 0x04f200…09e600 63 68 61 72 20 2a 61 66 69 6e 64 28 64 62 2c 6e 61 6d 65 29 09 2d 2d 20 72 65 74 75 72 6e 20 74 ┆char *afind(db,name) -- return t┆ 0x04f200…09e600 68 65 20 76 61 6c 75 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20 67 69 76 65 6e ┆he value associated with a given┆ 0x04f200…09e600 20 6b 65 79 0a 20 20 20 64 62 64 65 66 5f 74 20 2a 64 62 3b 20 63 68 61 72 20 2a 6e 61 6d 65 3b ┆ key dbdef_t *db; char *name;┆ 0x04f200…09e600 0a 0a 20 20 20 76 6f 69 64 20 61 65 6e 74 65 72 28 64 62 2c 20 6b 65 79 2c 20 76 61 6c 29 09 2d ┆ void aenter(db, key, val) -┆ 0x04f200…09e600 2d 20 65 6e 74 65 72 20 61 20 76 61 6c 75 65 20 66 6f 72 20 61 20 6e 65 77 20 6b 65 79 0a 20 20 ┆- enter a value for a new key ┆ 0x04f200…09e600 20 64 62 64 65 66 5f 74 20 2a 64 62 3b 20 63 68 61 72 20 2a 6b 65 79 2c 20 2a 76 61 6c 3b 0a 0a ┆ dbdef_t *db; char *key, *val; ┆ 0x04f200…09e600 20 20 20 63 68 61 72 20 2a 61 72 65 70 6c 61 63 65 28 64 62 2c 20 6e 65 77 76 61 6c 29 09 2d 2d ┆ char *areplace(db, newval) --┆ 0x04f200…09e600 20 63 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 65 ┆ change the value of the selecte┆ 0x04f200…09e600 64 20 6b 65 79 0a 20 20 20 64 62 64 65 66 5f 74 20 2a 64 62 3b 20 63 68 61 72 20 2a 6e 65 77 76 ┆d key dbdef_t *db; char *newv┆ 0x04f200…09e600 61 6c 3b 0a 0a 20 20 20 63 68 61 72 20 2a 61 64 65 6c 65 74 65 28 64 62 29 09 09 2d 2d 20 64 65 ┆al; char *adelete(db) -- de┆ 0x04f200…09e600 6c 65 74 65 20 74 68 65 20 67 69 76 65 6e 20 70 61 69 72 0a 20 20 20 64 62 64 65 66 5f 74 20 2a ┆lete the given pair dbdef_t *┆ 0x04f200…09e600 64 62 3b 0a 0a 44 45 53 43 52 49 50 54 49 4f 4e 0a 20 20 20 54 68 69 73 20 63 6f 64 65 20 68 61 ┆db; DESCRIPTION This code ha┆ 0x04f200…09e600 6e 64 6c 65 73 20 61 73 73 6f 63 69 61 74 69 6f 6e 20 6c 69 73 74 73 2e 20 41 6e 20 61 73 73 6f ┆ndles association lists. An asso┆ 0x04f200…09e600 63 69 61 74 69 6f 6e 20 6c 69 73 74 20 69 73 20 72 65 70 72 65 73 65 6e 74 65 64 20 62 79 0a 61 ┆ciation list is represented by a┆ 0x04f200…09e600 20 66 69 6c 65 20 6f 66 20 6c 69 6e 65 73 20 65 61 63 68 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 ┆ file of lines each containing t┆ 0x04f200…09e600 77 6f 20 66 69 65 6c 64 73 20 73 65 70 61 72 61 74 65 64 20 62 79 20 77 72 69 74 65 73 70 61 63 ┆wo fields separated by writespac┆ 0x04f200…09e600 65 20 28 6c 69 6e 65 73 0a 62 65 67 69 6e 6e 69 6e 67 20 77 69 74 68 20 23 20 61 72 65 20 63 6f ┆e (lines beginning with # are co┆ 0x04f200…09e600 6e 73 64 69 64 65 72 65 64 20 63 6f 6d 6d 65 6e 74 73 20 61 6e 64 20 69 67 6e 6f 72 65 64 29 2e ┆nsdidered comments and ignored).┆ 0x04f200…09e600 20 45 6e 74 72 79 20 70 6f 69 6e 74 73 20 61 72 65 20 67 69 76 65 6e 0a 74 6f 20 72 65 61 64 20 ┆ Entry points are given to read ┆ 0x04f200…09e600 69 6e 20 61 20 66 69 6c 65 20 6f 66 20 61 73 73 6f 63 69 61 74 69 6f 6e 73 20 61 6e 64 20 74 6f ┆in a file of associations and to┆ 0x04f200…09e600 20 64 6f 20 6c 6f 6f 6b 75 70 20 6f 6e 20 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 20 61 6e ┆ do lookup on the first field an┆ 0x04f200…09e600 64 0a 72 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 73 65 63 6f 6e 64 ┆d return the value of the second┆ 0x04f200…09e600 2e 20 49 74 20 75 73 65 73 20 74 68 65 20 64 62 61 6c 6c 6f 63 2e 63 20 72 6f 75 74 69 6e 65 73 ┆. It uses the dballoc.c routines┆ 0x04f200…09e600 2e 0a 0a 42 55 47 53 0a 20 20 20 61 64 65 6c 65 74 65 28 29 20 64 6f 65 73 6e 27 74 20 72 65 63 ┆. BUGS adelete() doesn't rec┆ 0x04f200…09e600 6c 61 69 6d 20 74 68 65 20 74 61 62 6c 65 20 73 6c 6f 74 20 69 74 20 74 68 65 6f 72 65 74 69 63 ┆laim the table slot it theoretic┆ 0x04f200…09e600 61 6c 6c 79 20 66 72 65 65 73 20 75 70 2e 20 41 6c 73 6f 2c 0a 64 62 61 6e 65 78 74 28 29 20 77 ┆ally frees up. Also, dbanext() w┆ 0x04f200…09e600 69 6c 6c 20 73 74 69 6c 6c 20 66 69 6e 64 20 61 20 64 65 6c 65 74 65 64 20 6b 65 79 20 77 69 74 ┆ill still find a deleted key wit┆ 0x04f200…09e600 68 20 76 61 6c 75 65 20 4e 55 4c 4c 2c 20 61 6e 64 20 61 20 66 6f 6c 6c 6f 77 69 6e 67 0a 61 65 ┆h value NULL, and a following ae┆ 0x04f200…09e600 6e 74 65 72 28 29 20 77 6f 75 6c 64 20 6c 65 61 76 65 20 74 77 6f 20 69 6e 73 74 61 6e 63 65 73 ┆nter() would leave two instances┆ 0x04f200…09e600 20 6f 66 20 74 68 65 20 6b 65 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 20 0a 4e 4f 54 45 ┆ of the key in the table. NOTE┆ 0x04f200…09e600 0a 20 20 20 43 6f 6d 70 69 6c 69 6e 67 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 77 69 74 68 20 2d ┆ Compiling this module with -┆ 0x04f200…09e600 44 4d 41 49 4e 20 77 69 6c 6c 20 70 72 6f 64 75 63 65 20 61 6e 20 69 6e 74 65 72 61 63 74 69 76 ┆DMAIN will produce an interactiv┆ 0x04f200…09e600 65 20 74 65 73 74 65 72 20 66 6f 72 0a 74 68 65 73 65 20 72 6f 75 74 69 6e 65 73 2e 0a 0a 41 55 ┆e tester for these routines. AU┆ 0x04f200…09e600 54 48 4f 52 0a 20 20 20 45 72 69 63 20 53 2e 20 52 61 79 6d 6f 6e 64 0a 20 20 20 54 68 69 73 20 ┆THOR Eric S. Raymond This ┆ 0x04f200…09e600 73 6f 66 74 77 61 72 65 20 69 73 20 43 6f 70 79 72 69 67 68 74 20 28 43 29 20 31 39 38 39 20 62 ┆software is Copyright (C) 1989 b┆ 0x04f200…09e600 79 20 45 72 69 63 20 53 2e 20 52 61 79 6d 6f 6e 64 20 66 6f 72 20 74 68 65 20 73 6f 6c 65 20 70 ┆y Eric S. Raymond for the sole p┆ 0x04f200…09e600 75 72 70 6f 73 65 0a 6f 66 20 70 72 6f 74 65 63 74 69 6e 67 20 66 72 65 65 20 72 65 64 69 73 74 ┆urpose of protecting free redist┆ 0x04f200…09e600 72 69 62 75 74 69 6f 6e 3b 20 73 65 65 20 74 68 65 20 4c 49 43 45 4e 53 45 20 66 69 6c 65 20 66 ┆ribution; see the LICENSE file f┆ 0x04f200…09e600 6f 72 20 64 65 74 61 69 6c 73 2e 0a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆or details. *******************┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆********************************┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 20 4c ┆**************************/ /* L┆ 0x04f200…09e600 49 4e 54 4c 49 42 52 41 52 59 20 2a 2f 0a 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 69 6f 2e 68 ┆INTLIBRARY */ #include <stdio.h┆ 0x04f200…09e600 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 63 74 79 70 65 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 22 6c ┆> #include <ctype.h> #include "l┆ 0x04f200…09e600 69 62 70 6f 72 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 64 62 61 6c 6c 6f 63 2e 68 22 0a 23 ┆ibport.h" #include "dballoc.h" #┆ 0x04f200…09e600 69 6e 63 6c 75 64 65 20 22 61 6c 69 73 74 2e 68 22 0a 0a 23 69 66 6e 64 65 66 20 42 55 46 4c 45 ┆include "alist.h" #ifndef BUFLE┆ 0x04f200…09e600 4e 0a 23 64 65 66 69 6e 65 20 42 55 46 4c 45 4e 09 35 31 32 09 2f 2a 20 73 6f 20 61 73 20 6e 6f ┆N #define BUFLEN 512 /* so as no┆ 0x04f200…09e600 74 20 74 6f 20 6e 65 65 64 20 6e 65 77 73 2e 68 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 69 6e 74 20 ┆t to need news.h */ #endif int ┆ 0x04f200…09e600 61 73 70 6c 69 74 28 61 73 2c 20 66 70 29 0a 2f 2a 20 73 70 6c 69 74 20 74 68 65 20 67 69 76 65 ┆asplit(as, fp) /* split the give┆ 0x04f200…09e600 6e 20 6c 69 6e 65 20 69 6e 74 6f 20 61 6e 20 61 73 73 6f 63 69 61 74 69 6f 6e 20 72 65 63 6f 72 ┆n line into an association recor┆ 0x04f200…09e600 64 20 2a 2f 0a 61 73 73 6f 63 09 2a 61 73 3b 0a 46 49 4c 45 09 2a 66 70 3b 0a 7b 0a 20 20 20 20 ┆d */ assoc *as; FILE *fp; { ┆ 0x04f200…09e600 63 68 61 72 20 20 20 20 6c 69 6e 65 5b 42 55 46 4c 45 4e 5d 2c 20 2a 70 3b 0a 0a 20 20 20 20 69 ┆char line[BUFLEN], *p; i┆ 0x04f200…09e600 66 20 28 66 67 65 74 73 28 6c 69 6e 65 2c 20 73 69 7a 65 6f 66 28 6c 69 6e 65 29 2c 20 66 70 29 ┆f (fgets(line, sizeof(line), fp)┆ 0x04f200…09e600 20 3d 3d 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 0a 09 72 65 74 75 72 6e 28 46 41 49 4c 29 3b ┆ == (char *)NULL) return(FAIL);┆ 0x04f200…09e600 0a 20 20 20 20 69 66 20 28 6c 69 6e 65 5b 30 5d 20 3d 3d 20 27 23 27 29 0a 09 72 65 74 75 72 6e ┆ if (line[0] == '#') return┆ 0x04f200…09e600 28 43 4f 4d 4d 45 4e 54 29 3b 0a 0a 20 20 20 20 28 76 6f 69 64 29 20 6e 73 74 72 69 70 28 6c 69 ┆(COMMENT); (void) nstrip(li┆ 0x04f200…09e600 6e 65 29 3b 0a 20 20 20 20 66 6f 72 20 28 70 20 3d 20 6c 69 6e 65 3b 20 2a 70 20 26 26 20 28 69 ┆ne); for (p = line; *p && (i┆ 0x04f200…09e600 73 61 6c 6e 75 6d 28 2a 70 29 20 7c 7c 20 69 73 70 75 6e 63 74 28 2a 70 29 29 3b 20 70 2b 2b 29 ┆salnum(*p) || ispunct(*p)); p++)┆ 0x04f200…09e600 0a 09 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 2a 70 2b 2b 20 3d 20 30 3b 0a 20 20 ┆ continue; *p++ = 0; ┆ 0x04f200…09e600 20 20 66 6f 72 20 28 3b 20 2a 70 20 26 26 20 69 73 73 70 61 63 65 28 2a 70 29 3b 20 70 2b 2b 29 ┆ for (; *p && isspace(*p); p++)┆ 0x04f200…09e600 0a 09 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 2d 3e 6b 65 79 20 3d 20 73 61 ┆ continue; as->key = sa┆ 0x04f200…09e600 76 65 73 74 72 28 6c 69 6e 65 29 3b 0a 20 20 20 20 61 73 2d 3e 76 61 6c 75 65 20 3d 20 73 61 76 ┆vestr(line); as->value = sav┆ 0x04f200…09e600 65 73 74 72 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 28 53 55 43 43 45 45 44 29 3b 0a 7d 0a ┆estr(p); return(SUCCEED); } ┆ 0x04f200…09e600 0a 69 6e 74 20 61 64 75 6d 70 28 61 73 2c 20 66 70 29 0a 2f 2a 20 77 72 69 74 65 20 74 68 65 20 ┆ int adump(as, fp) /* write the ┆ 0x04f200…09e600 65 78 74 65 72 6e 61 6c 20 66 6f 72 6d 20 6f 66 20 61 20 72 65 63 6f 72 64 20 74 6f 20 61 20 66 ┆external form of a record to a f┆ 0x04f200…09e600 69 6c 65 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 61 73 73 6f 63 09 2a 61 73 3b 0a 46 49 4c 45 09 2a ┆ile pointer */ assoc *as; FILE *┆ 0x04f200…09e600 66 70 3b 0a 7b 0a 20 20 20 20 69 66 20 28 61 73 2d 3e 76 61 6c 75 65 29 0a 09 28 76 6f 69 64 29 ┆fp; { if (as->value) (void)┆ 0x04f200…09e600 20 66 70 72 69 6e 74 66 28 66 70 2c 20 22 25 73 5c 74 25 73 5c 6e 22 2c 20 61 73 2d 3e 6b 65 79 ┆ fprintf(fp, "%s\t%s\n", as->key┆ 0x04f200…09e600 2c 20 61 73 2d 3e 76 61 6c 75 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 28 53 55 43 43 45 45 44 ┆, as->value); return(SUCCEED┆ 0x04f200…09e600 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 6c 69 6e 74 0a 2f 2a 41 52 47 53 55 53 45 44 30 2a 2f 0a ┆); } #ifdef lint /*ARGSUSED0*/ ┆ 0x04f200…09e600 23 65 6e 64 69 66 20 2f 2a 20 6c 69 6e 74 20 2a 2f 0a 63 68 61 72 20 2a 61 6d 61 74 63 68 28 64 ┆#endif /* lint */ char *amatch(d┆ 0x04f200…09e600 62 2c 20 6e 61 6d 65 2c 20 63 6d 70 66 75 6e 29 0a 2f 2a 20 72 65 74 75 72 6e 20 74 68 65 20 76 ┆b, name, cmpfun) /* return the v┆ 0x04f200…09e600 61 6c 75 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20 67 69 76 65 6e 20 6b 65 79 ┆alue associated with a given key┆ 0x04f200…09e600 2c 20 4e 55 4c 4c 20 69 66 20 6e 6f 6e 65 20 2a 2f 0a 64 62 64 65 66 5f 74 09 2a 64 62 3b 0a 63 ┆, NULL if none */ dbdef_t *db; c┆ 0x04f200…09e600 68 61 72 09 2a 6e 61 6d 65 3b 0a 62 6f 6f 6c 09 28 2a 63 6d 70 66 75 6e 29 28 29 3b 0a 7b 0a 23 ┆har *name; bool (*cmpfun)(); { #┆ 0x04f200…09e600 69 66 6e 64 65 66 20 6c 69 6e 74 0a 20 20 20 20 61 73 73 6f 63 20 20 20 2a 61 73 20 3d 20 28 61 ┆ifndef lint assoc *as = (a┆ 0x04f200…09e600 73 73 6f 63 20 2a 29 20 64 62 61 66 69 6e 64 28 64 62 2c 20 6e 61 6d 65 2c 20 63 6d 70 66 75 6e ┆ssoc *) dbafind(db, name, cmpfun┆ 0x04f200…09e600 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 61 73 73 6f 63 20 20 20 2a 61 73 20 3d 20 28 61 73 73 6f ┆); #else assoc *as = (asso┆ 0x04f200…09e600 63 20 2a 29 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 6c 69 6e 74 20 2a 2f 0a 0a 20 20 20 ┆c *)NULL; #endif /* lint */ ┆ 0x04f200…09e600 20 69 66 20 28 61 73 20 3d 3d 20 28 61 73 73 6f 63 20 2a 29 20 30 29 0a 09 72 65 74 75 72 6e 28 ┆ if (as == (assoc *) 0) return(┆ 0x04f200…09e600 28 63 68 61 72 20 2a 29 20 30 29 3b 0a 20 20 20 20 65 6c 73 65 0a 09 72 65 74 75 72 6e 28 61 73 ┆(char *) 0); else return(as┆ 0x04f200…09e600 2d 3e 76 61 6c 75 65 29 3b 0a 7d 0a 0a 63 68 61 72 20 2a 61 66 69 6e 64 28 64 62 2c 20 6e 61 6d ┆->value); } char *afind(db, nam┆ 0x04f200…09e600 65 29 0a 2f 2a 20 72 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20 61 73 73 6f 63 69 61 74 65 ┆e) /* return the value associate┆ 0x04f200…09e600 64 20 77 69 74 68 20 61 20 67 69 76 65 6e 20 6b 65 79 2c 20 4e 55 4c 4c 20 69 66 20 6e 6f 6e 65 ┆d with a given key, NULL if none┆ 0x04f200…09e600 20 2a 2f 0a 64 62 64 65 66 5f 74 09 2a 64 62 3b 0a 63 68 61 72 09 2a 6e 61 6d 65 3b 0a 7b 0a 20 ┆ */ dbdef_t *db; char *name; { ┆ 0x04f200…09e600 20 20 20 72 65 74 75 72 6e 28 61 6d 61 74 63 68 28 64 62 2c 20 6e 61 6d 65 2c 20 73 74 72 65 71 ┆ return(amatch(db, name, streq┆ 0x04f200…09e600 29 29 3b 0a 7d 0a 0a 2f 2a 41 52 47 53 55 53 45 44 2a 2f 0a 76 6f 69 64 20 61 65 6e 74 65 72 28 ┆)); } /*ARGSUSED*/ void aenter(┆ 0x04f200…09e600 64 62 2c 20 6b 65 79 2c 20 76 61 6c 29 0a 2f 2a 20 65 6e 74 65 72 20 61 20 76 61 6c 75 65 20 66 ┆db, key, val) /* enter a value f┆ 0x04f200…09e600 6f 72 20 61 20 6e 65 77 20 6b 65 79 20 2a 2f 0a 64 62 64 65 66 5f 74 20 2a 64 62 3b 20 63 68 61 ┆or a new key */ dbdef_t *db; cha┆ 0x04f200…09e600 72 20 2a 6b 65 79 2c 20 2a 76 61 6c 3b 0a 7b 0a 23 69 66 6e 64 65 66 20 6c 69 6e 74 0a 20 20 20 ┆r *key, *val; { #ifndef lint ┆ 0x04f200…09e600 20 61 73 73 6f 63 20 20 20 2a 61 70 20 3d 20 28 61 73 73 6f 63 20 2a 29 20 64 62 61 6c 6c 6f 63 ┆ assoc *ap = (assoc *) dballoc┆ 0x04f200…09e600 28 64 62 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 61 73 73 6f 63 20 20 20 2a 61 70 20 3d 20 28 61 ┆(db); #else assoc *ap = (a┆ 0x04f200…09e600 73 73 6f 63 20 2a 29 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 6c 69 6e 74 20 2a 2f 0a 20 ┆ssoc *)NULL; #endif /* lint */ ┆ 0x04f200…09e600 20 20 20 61 70 2d 3e 6b 65 79 20 3d 20 73 61 76 65 73 74 72 28 6b 65 79 29 3b 0a 20 20 20 20 61 ┆ ap->key = savestr(key); a┆ 0x04f200…09e600 70 2d 3e 76 61 6c 75 65 20 3d 20 73 61 76 65 73 74 72 28 76 61 6c 29 3b 0a 7d 0a 0a 23 69 66 64 ┆p->value = savestr(val); } #ifd┆ 0x04f200…09e600 65 66 20 6c 69 6e 74 0a 2f 2a 41 52 47 53 55 53 45 44 2a 2f 0a 23 65 6e 64 69 66 0a 76 6f 69 64 ┆ef lint /*ARGSUSED*/ #endif void┆ 0x04f200…09e600 20 61 72 65 70 6c 61 63 65 28 64 62 2c 20 73 74 72 29 0a 2f 2a 20 72 65 70 6c 61 63 65 20 32 6e ┆ areplace(db, str) /* replace 2n┆ 0x04f200…09e600 64 20 70 61 72 74 20 6f 66 20 63 75 72 72 65 6e 74 6c 79 20 73 65 6c 65 63 74 65 64 20 61 73 73 ┆d part of currently selected ass┆ 0x04f200…09e600 6f 63 69 61 74 69 6f 6e 20 77 74 68 20 61 20 63 6f 70 79 20 6f 66 20 73 74 72 20 2a 2f 0a 64 62 ┆ociation wth a copy of str */ db┆ 0x04f200…09e600 64 65 66 5f 74 09 2a 64 62 3b 09 2f 2a 20 61 6c 69 73 74 20 74 6f 20 6d 6f 64 69 66 79 20 2a 2f ┆def_t *db; /* alist to modify */┆ 0x04f200…09e600 0a 63 68 61 72 09 2a 73 74 72 3b 09 2f 2a 20 74 65 78 74 20 64 61 74 61 20 2a 2f 0a 7b 0a 23 69 ┆ char *str; /* text data */ { #i┆ 0x04f200…09e600 66 6e 64 65 66 20 6c 69 6e 74 0a 20 20 20 20 61 73 73 6f 63 20 20 20 2a 61 73 20 3d 20 28 61 73 ┆fndef lint assoc *as = (as┆ 0x04f200…09e600 73 6f 63 20 2a 29 20 64 62 2d 3e 63 70 3b 0a 23 65 6c 73 65 0a 20 20 20 20 61 73 73 6f 63 20 20 ┆soc *) db->cp; #else assoc ┆ 0x04f200…09e600 20 2a 61 73 20 3d 20 28 61 73 73 6f 63 20 2a 29 4e 55 4c 4c 3b 0a 20 20 20 20 64 62 20 3d 20 64 ┆ *as = (assoc *)NULL; db = d┆ 0x04f200…09e600 62 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 6c 69 6e 74 20 2a 2f 0a 20 20 20 20 28 76 6f 69 64 29 20 ┆b; #endif /* lint */ (void) ┆ 0x04f200…09e600 66 72 65 65 28 61 73 2d 3e 76 61 6c 75 65 29 3b 0a 20 20 20 20 69 66 20 28 73 74 72 29 0a 09 61 ┆free(as->value); if (str) a┆ 0x04f200…09e600 73 2d 3e 76 61 6c 75 65 20 3d 20 73 61 76 65 73 74 72 28 73 74 72 29 3b 0a 20 20 20 20 65 6c 73 ┆s->value = savestr(str); els┆ 0x04f200…09e600 65 0a 09 61 73 2d 3e 76 61 6c 75 65 20 3d 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 3b 0a 7d 0a 0a ┆e as->value = (char *)NULL; } ┆ 0x04f200…09e600 23 69 66 64 65 66 20 4d 41 49 4e 0a 0a 23 69 66 64 65 66 20 5f 5f 46 4f 4f 5f 5f 0a 64 62 64 65 ┆#ifdef MAIN #ifdef __FOO__ dbde┆ 0x04f200…09e600 66 5f 74 20 61 6c 69 73 74 20 3d 0a 7b 0a 20 20 20 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 2c 09 ┆f_t alist = { (char *)NULL, ┆ 0x04f200…09e600 2f 2a 20 6e 6f 20 66 69 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 2a 2f 0a 20 20 20 20 73 69 7a ┆/* no file associated */ siz┆ 0x04f200…09e600 65 6f 66 28 61 73 73 6f 63 29 2c 20 09 2f 2a 20 72 65 63 6f 72 64 73 20 61 72 65 20 63 68 61 72 ┆eof(assoc), /* records are char┆ 0x04f200…09e600 61 63 74 65 72 20 70 6f 69 6e 74 65 72 73 20 2a 2f 0a 20 20 20 20 32 30 2c 09 09 09 2f 2a 20 69 ┆acter pointers */ 20, /* i┆ 0x04f200…09e600 6e 69 74 69 61 6c 6c 79 2c 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 32 30 20 ┆nitially, allocate space for 20 ┆ 0x04f200…09e600 72 65 63 6f 72 64 73 20 2a 2f 0a 20 20 20 20 31 30 2c 09 09 09 2f 2a 20 61 6c 6c 6f 63 61 74 65 ┆records */ 10, /* allocate┆ 0x04f200…09e600 20 31 30 20 72 65 63 6f 72 64 73 20 61 74 20 61 20 74 69 6d 65 20 77 68 65 6e 20 77 65 20 72 75 ┆ 10 records at a time when we ru┆ 0x04f200…09e600 6e 20 6f 75 74 20 2a 2f 0a 20 20 20 20 61 73 70 6c 69 74 2c 09 09 2f 2a 20 75 73 65 20 74 68 69 ┆n out */ asplit, /* use thi┆ 0x04f200…09e600 73 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 63 6f 6e 76 65 72 74 20 72 65 63 6f 72 64 73 20 2a 2f ┆s function to convert records */┆ 0x04f200…09e600 0a 20 20 20 20 61 64 75 6d 70 2c 09 09 2f 2a 20 75 73 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f ┆ adump, /* use this functio┆ 0x04f200…09e600 6e 20 74 6f 20 77 72 69 74 65 20 6f 75 74 20 72 65 63 6f 72 64 73 20 2a 2f 0a 7d 3b 0a 23 65 6c ┆n to write out records */ }; #el┆ 0x04f200…09e600 73 65 0a 41 4c 49 53 54 28 61 6c 69 73 74 2c 20 32 30 2c 20 31 30 29 0a 23 65 6e 64 69 66 0a 0a ┆se ALIST(alist, 20, 10) #endif ┆ 0x04f200…09e600 2f 2a 0a 20 2a 20 41 6e 20 65 78 65 72 63 69 73 65 72 20 66 6f 72 20 74 68 65 73 65 20 66 75 6e ┆/* * An exerciser for these fun┆ 0x04f200…09e600 63 74 69 6f 6e 73 2e 0a 20 2a 2f 0a 63 68 61 72 09 2a 50 72 6f 67 6e 61 6d 65 20 3d 20 22 61 6c ┆ctions. */ char *Progname = "al┆ 0x04f200…09e600 69 73 74 22 3b 0a 0a 6d 61 69 6e 28 29 0a 7b 0a 20 20 20 20 63 68 61 72 20 20 20 20 63 6d 64 6c ┆ist"; main() { char cmdl┆ 0x04f200…09e600 69 6e 65 5b 31 30 30 5d 2c 20 73 74 72 76 5b 31 30 30 5d 2c 20 73 74 72 76 32 5b 31 30 30 5d 3b ┆ine[100], strv[100], strv2[100];┆ 0x04f200…09e600 0a 20 20 20 20 69 6e 74 09 20 20 20 20 6e 76 3b 0a 0a 20 20 20 20 28 76 6f 69 64 29 20 70 72 69 ┆ int nv; (void) pri┆ 0x04f200…09e600 6e 74 66 28 22 54 68 69 73 20 69 73 20 74 68 65 20 61 2d 6c 69 73 74 20 63 6f 64 65 20 74 65 73 ┆ntf("This is the a-list code tes┆ 0x04f200…09e600 74 65 72 2c 20 74 79 70 65 20 3f 20 66 6f 72 20 68 65 6c 70 5c 6e 22 29 3b 0a 20 20 20 20 77 68 ┆ter, type ? for help\n"); wh┆ 0x04f200…09e600 69 6c 65 20 28 66 70 75 74 73 28 22 2a 20 22 2c 20 73 74 64 6f 75 74 29 2c 20 67 65 74 73 28 63 ┆ile (fputs("* ", stdout), gets(c┆ 0x04f200…09e600 6d 64 6c 69 6e 65 29 20 21 3d 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 0a 20 20 20 20 7b 0a 09 ┆mdline) != (char *)NULL) { ┆ 0x04f200…09e600 28 76 6f 69 64 29 20 6e 73 74 72 69 70 28 63 6d 64 6c 69 6e 65 29 3b 0a 0a 09 69 66 20 28 73 73 ┆(void) nstrip(cmdline); if (ss┆ 0x04f200…09e600 63 61 6e 66 28 63 6d 64 6c 69 6e 65 2c 20 22 61 20 25 73 22 2c 20 73 74 72 76 29 20 3d 3d 20 31 ┆canf(cmdline, "a %s", strv) == 1┆ 0x04f200…09e600 29 0a 09 7b 0a 09 20 20 20 20 28 76 6f 69 64 29 20 70 72 69 6e 74 66 28 22 52 65 61 64 69 6e 67 ┆) { (void) printf("Reading┆ 0x04f200…09e600 20 73 70 65 63 69 66 69 65 64 20 61 6c 69 73 74 2d 66 6f 72 6d 61 74 20 66 69 6c 65 5c 6e 22 29 ┆ specified alist-format file\n")┆ 0x04f200…09e600 3b 0a 09 20 20 20 20 61 6c 69 73 74 2e 66 69 6c 65 20 3d 20 73 61 76 65 73 74 72 28 73 74 72 76 ┆; alist.file = savestr(strv┆ 0x04f200…09e600 29 3b 0a 09 20 20 20 20 28 76 6f 69 64 29 20 70 72 69 6e 74 66 28 22 54 68 65 72 65 20 77 65 72 ┆); (void) printf("There wer┆ 0x04f200…09e600 65 20 25 64 20 72 65 63 6f 72 64 73 5c 6e 22 2c 20 64 62 61 72 65 61 64 28 26 61 6c 69 73 74 29 ┆e %d records\n", dbaread(&alist)┆ 0x04f200…09e600 29 3b 0a 09 7d 0a 09 65 6c 73 65 20 69 66 20 28 63 6d 64 6c 69 6e 65 5b 30 5d 20 3d 3d 20 27 41 ┆); } else if (cmdline[0] == 'A┆ 0x04f200…09e600 27 29 0a 09 7b 0a 09 20 20 20 20 28 76 6f 69 64 29 20 70 72 69 6e 74 66 28 22 52 65 61 64 69 6e ┆') { (void) printf("Readin┆ 0x04f200…09e600 67 20 64 65 66 61 75 6c 74 20 61 6c 69 73 74 2d 66 6f 72 6d 61 74 20 66 69 6c 65 5c 6e 22 29 3b ┆g default alist-format file\n");┆ 0x04f200…09e600 0a 09 20 20 20 20 61 6c 69 73 74 2e 66 69 6c 65 20 3d 20 73 61 76 65 73 74 72 28 22 2f 75 73 72 ┆ alist.file = savestr("/usr┆ 0x04f200…09e600 2f 6c 69 62 2f 6e 65 77 73 2f 61 6c 69 61 73 65 73 22 29 3b 0a 09 20 20 20 20 28 76 6f 69 64 29 ┆/lib/news/aliases"); (void)┆ 0x04f200…09e600 20 70 72 69 6e 74 66 28 22 54 68 65 72 65 20 77 65 72 65 20 25 64 20 72 65 63 6f 72 64 73 5c 6e ┆ printf("There were %d records\n┆ 0x04f200…09e600 22 2c 20 64 62 61 72 65 61 64 28 26 61 6c 69 73 74 29 29 3b 0a 09 7d 0a 09 65 6c 73 65 20 69 66 ┆", dbaread(&alist)); } else if┆ 0x04f200…09e600 20 28 73 73 63 61 6e 66 28 63 6d 64 6c 69 6e 65 2c 20 22 67 20 25 73 22 2c 20 73 74 72 76 29 20 ┆ (sscanf(cmdline, "g %s", strv) ┆ 0x04f200…09e600 3d 3d 20 31 29 0a 09 7b 0a 09 20 20 20 20 63 68 61 72 20 2a 6e 67 70 20 3d 20 61 66 69 6e 64 28 ┆== 1) { char *ngp = afind(┆ 0x04f200…09e600 26 61 6c 69 73 74 2c 20 73 74 72 76 29 3b 0a 0a 09 20 20 20 20 69 66 20 28 6e 67 70 20 3d 3d 20 ┆&alist, strv); if (ngp == ┆ 0x04f200…09e600 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 0a 09 09 28 76 6f 69 64 29 20 70 72 69 6e 74 66 28 22 25 ┆(char *)NULL) (void) printf("%┆ 0x04f200…09e600 73 3a 20 6e 6f 20 73 75 63 68 20 6b 65 79 5c 6e 22 2c 20 73 74 72 76 29 3b 0a 09 20 20 20 20 65 ┆s: no such key\n", strv); e┆ 0x04f200…09e600 6c 73 65 0a 09 09 28 76 6f 69 64 29 20 70 72 69 6e 74 66 28 22 25 73 3a 20 76 61 6c 75 65 20 69 ┆lse (void) printf("%s: value i┆ 0x04f200…09e600 73 20 25 73 5c 6e 22 2c 20 73 74 72 76 2c 20 6e 67 70 29 3b 0a 09 7d 0a 09 65 6c 73 65 20 69 66 ┆s %s\n", strv, ngp); } else if┆ 0x04f200…09e600 20 28 73 73 63 61 6e 66 28 63 6d 64 6c 69 6e 65 2c 20 22 65 20 25 73 20 25 73 22 2c 20 73 74 72 ┆ (sscanf(cmdline, "e %s %s", str┆ 0x04f200…09e600 76 2c 20 73 74 72 76 32 29 20 3d 3d 20 32 29 0a 09 20 20 20 20 28 76 6f 69 64 29 20 61 72 65 70 ┆v, strv2) == 2) (void) arep┆ 0x04f200…09e600 6c 61 63 65 28 26 61 6c 69 73 74 2c 20 73 74 72 76 2c 20 73 74 72 76 32 29 3b 0a 09 65 6c 73 65 ┆lace(&alist, strv, strv2); else┆ 0x04f200…09e600 20 69 66 20 28 73 73 63 61 6e 66 28 63 6d 64 6c 69 6e 65 2c 20 22 72 20 25 73 22 2c 20 73 74 72 ┆ if (sscanf(cmdline, "r %s", str┆ 0x04f200…09e600 76 29 20 3d 3d 20 31 29 0a 09 20 20 20 20 28 76 6f 69 64 29 20 61 72 65 70 6c 61 63 65 28 26 61 ┆v) == 1) (void) areplace(&a┆ 0x04f200…09e600 6c 69 73 74 2c 20 73 74 72 76 29 3b 0a 09 65 6c 73 65 20 69 66 20 28 63 6d 64 6c 69 6e 65 5b 30 ┆list, strv); else if (cmdline[0┆ 0x04f200…09e600 5d 20 3d 3d 20 27 64 27 29 0a 09 20 20 20 20 28 76 6f 69 64 29 20 61 64 65 6c 65 74 65 28 26 61 ┆] == 'd') (void) adelete(&a┆ 0x04f200…09e600 6c 69 73 74 29 3b 0a 09 65 6c 73 65 20 69 66 20 28 63 6d 64 6c 69 6e 65 5b 30 5d 20 3d 3d 20 27 ┆list); else if (cmdline[0] == '┆ 0x04f200…09e600 77 27 29 0a 09 20 20 20 20 28 76 6f 69 64 29 20 64 62 61 64 75 6d 70 28 26 61 6c 69 73 74 2c 20 ┆w') (void) dbadump(&alist, ┆ 0x04f200…09e600 73 74 64 6f 75 74 29 3b 0a 09 65 6c 73 65 20 69 66 20 28 63 6d 64 6c 69 6e 65 5b 30 5d 20 3d 3d ┆stdout); else if (cmdline[0] ==┆ 0x04f200…09e600 20 27 78 27 29 0a 09 20 20 20 20 65 78 69 74 28 30 29 3b 0a 09 65 6c 73 65 20 69 66 20 28 63 6d ┆ 'x') exit(0); else if (cm┆ 0x04f200…09e600 64 6c 69 6e 65 5b 30 5d 20 3d 3d 20 27 21 27 29 0a 09 20 20 20 20 73 79 73 74 65 6d 28 63 6d 64 ┆dline[0] == '!') system(cmd┆ 0x04f200…09e600 6c 69 6e 65 20 2b 20 31 29 3b 0a 09 65 6c 73 65 20 69 66 20 28 63 6d 64 6c 69 6e 65 5b 30 5d 20 ┆line + 1); else if (cmdline[0] ┆ 0x04f200…09e600 3d 3d 20 27 3f 27 29 0a 09 7b 0a 09 20 20 20 20 28 76 6f 69 64 29 70 72 69 6e 74 66 28 22 61 20 ┆== '?') { (void)printf("a ┆ 0x04f200…09e600 66 69 6c 65 20 20 20 20 20 2d 2d 20 72 65 61 64 20 73 70 65 63 69 66 69 65 64 20 61 6c 69 73 74 ┆file -- read specified alist┆ 0x04f200…09e600 2d 66 6f 72 6d 61 74 20 66 69 6c 65 5c 6e 22 29 3b 0a 09 20 20 20 20 28 76 6f 69 64 29 70 72 69 ┆-format file\n"); (void)pri┆ 0x04f200…09e600 6e 74 66 28 22 41 20 66 69 6c 65 20 20 20 20 20 2d 2d 20 72 65 61 64 20 64 65 66 61 75 6c 74 20 ┆ntf("A file -- read default ┆ 0x04f200…09e600 61 6c 69 73 74 2d 66 6f 72 6d 61 74 20 66 69 6c 65 5c 6e 22 29 3b 0a 09 20 20 20 20 28 76 6f 69 ┆alist-format file\n"); (voi┆ 0x04f200…09e600 64 29 70 72 69 6e 74 66 28 22 67 20 6e 61 6d 65 20 20 20 20 20 2d 2d 20 73 65 65 20 76 61 6c 75 ┆d)printf("g name -- see valu┆ 0x04f200…09e600 65 20 6f 66 20 6e 61 6d 65 20 3c 6e 61 6d 65 3e 5c 6e 22 29 3b 0a 09 20 20 20 20 28 76 6f 69 64 ┆e of name <name>\n"); (void┆ 0x04f200…09e600 29 70 72 69 6e 74 66 28 22 65 20 6b 65 79 20 76 61 6c 20 20 2d 2d 20 65 6e 74 65 72 20 76 61 6c ┆)printf("e key val -- enter val┆ 0x04f200…09e600 75 65 20 6f 66 20 73 65 6c 65 63 74 65 64 20 70 61 69 72 5c 6e 22 29 3b 0a 09 20 20 20 20 28 76 ┆ue of selected pair\n"); (v┆ 0x04f200…09e600 6f 69 64 29 70 72 69 6e 74 66 28 22 72 20 6e 65 77 76 61 6c 20 20 20 2d 2d 20 72 65 70 6c 61 63 ┆oid)printf("r newval -- replac┆ 0x04f200…09e600 65 20 76 61 6c 75 65 20 6f 66 20 73 65 6c 65 63 74 65 64 20 70 61 69 72 5c 6e 22 29 3b 0a 09 20 ┆e value of selected pair\n"); ┆ 0x04f200…09e600 20 20 20 28 76 6f 69 64 29 70 72 69 6e 74 66 28 22 64 20 20 20 20 20 20 20 20 20 20 2d 2d 20 64 ┆ (void)printf("d -- d┆ 0x04f200…09e600 65 6c 65 74 65 20 73 65 6c 65 63 74 65 64 20 70 61 69 72 5c 6e 22 29 3b 0a 09 20 20 20 20 28 76 ┆elete selected pair\n"); (v┆ 0x04f200…09e600 6f 69 64 29 70 72 69 6e 74 66 28 22 77 20 20 20 20 20 20 20 20 20 20 2d 2d 20 64 75 6d 70 20 61 ┆oid)printf("w -- dump a┆ 0x04f200…09e600 6c 6c 20 72 65 63 6f 72 64 73 20 74 6f 20 73 74 64 6f 75 74 5c 6e 22 29 3b 0a 0a 09 20 20 20 20 ┆ll records to stdout\n"); ┆ 0x04f200…09e600 28 76 6f 69 64 29 70 72 69 6e 74 66 28 22 78 20 20 20 20 20 20 20 20 20 20 2d 2d 20 65 78 69 74 ┆(void)printf("x -- exit┆ 0x04f200…09e600 5c 6e 5c 6e 22 29 3b 0a 0a 09 20 20 20 20 28 76 6f 69 64 29 70 72 69 6e 74 66 28 22 21 20 63 6d ┆\n\n"); (void)printf("! cm┆ 0x04f200…09e600 64 20 20 20 20 20 20 2d 2d 20 65 78 65 63 75 74 65 20 73 68 65 6c 6c 20 63 6f 6d 6d 61 6e 64 5c ┆d -- execute shell command\┆ 0x04f200…09e600 6e 22 29 3b 0a 09 20 20 20 20 28 76 6f 69 64 29 70 72 69 6e 74 66 28 22 3f 20 20 20 20 20 20 20 ┆n"); (void)printf("? ┆ 0x04f200…09e600 20 20 20 2d 2d 20 70 72 69 6e 74 20 74 68 69 73 20 68 65 6c 70 20 6d 65 73 73 61 67 65 5c 6e 22 ┆ -- print this help message\n"┆ 0x04f200…09e600 29 3b 0a 09 7d 0a 09 65 6c 73 65 0a 09 20 20 20 20 28 76 6f 69 64 29 70 72 69 6e 74 66 28 22 49 ┆); } else (void)printf("I┆ 0x04f200…09e600 6c 6c 65 67 61 6c 20 63 6f 6d 6d 61 6e 64 20 2d 2d 20 74 79 70 65 20 3f 20 66 6f 72 20 68 65 6c ┆llegal command -- type ? for hel┆ 0x04f200…09e600 70 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0a 63 61 74 63 68 5f 74 20 78 78 69 74 28 6e 29 0a ┆p\n"); } } catch_t xxit(n) ┆ 0x04f200…09e600 69 6e 74 09 6e 3b 0a 7b 0a 20 20 20 20 65 78 69 74 28 6e 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f ┆int n; { exit(n); } #endif /┆ 0x04f200…09e600 2a 20 4d 41 49 4e 20 2a 2f 0a 0a 2f 2a 20 61 6c 69 73 74 2e 63 20 65 6e 64 73 20 68 65 72 65 20 ┆* MAIN */ /* alist.c ends here ┆ 0x04f200…09e600 2a 2f 0a 29 70 72 69 6e 74 66 28 22 72 20 6e 65 77 76 61 6c 20 20 20 2d 2d 20 72 65 70 6c 61 63 ┆*/ )printf("r newval -- replac┆ 0x04f200…09e600 65 20 76 61 6c 75 65 20 6f 66 20 73 65 6c 65 63 74 65 64 20 70 61 69 72 5c 6e 22 29 3b 0a 09 20 ┆e value of selected pair\n"); ┆ 0x04f200…09e600 20 20 20 28 76 6f 69 64 29 70 72 69 6e 74 66 28 22 64 20 20 20 20 20 20 20 20 20 20 2d 2d 20 64 ┆ (void)printf("d -- d┆ 0x04f200…09e600 65 6c 65 74 65 20 73 65 6c 65 63 74 65 64 20 70 61 73 72 63 2f 44 2e 70 6f 72 74 2f 61 6c 69 73 ┆elete selected pasrc/D.port/alis┆ 0x04f200…09e600 74 2e 68 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆t.h ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆ ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 20 20 20 34 34 34 20 00 20 20 20 ┆ 444 ┆ 0x04f200…09e600 31 34 35 20 00 20 20 20 20 20 31 20 00 20 20 20 20 20 20 20 31 35 32 35 20 20 34 34 35 36 31 35 ┆145 1 1525 445615┆ 0x04f200…09e600 34 30 35 30 20 20 20 37 33 30 36 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆4050 7306 ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆ ┆ […0x9…] 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 2f 2a 20 61 6c 69 73 74 2e 68 20 2d 2d 20 64 ┆ /* alist.h -- d┆ 0x04f200…09e600 65 66 69 6e 69 74 69 6f 6e 73 20 66 6f 72 20 6d 61 6e 69 70 75 6c 61 74 69 6e 67 20 61 6c 6c 6f ┆efinitions for manipulating allo┆ 0x04f200…09e600 63 61 74 65 64 20 61 73 73 6f 63 69 61 74 69 6f 6e 20 6c 69 73 74 73 20 2a 2f 0a 0a 74 79 70 65 ┆cated association lists */ type┆ 0x04f200…09e600 64 65 66 20 73 74 72 75 63 74 0a 7b 0a 20 20 20 20 63 68 61 72 20 20 20 20 2a 6b 65 79 3b 09 2f ┆def struct { char *key; /┆ 0x04f200…09e600 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6b 65 79 20 76 61 6c 75 65 20 2a 2f 0a 20 20 ┆* pointer to the key value */ ┆ 0x04f200…09e600 20 20 63 68 61 72 20 20 20 20 2a 76 61 6c 75 65 3b 09 2f 2a 20 74 68 65 20 61 73 73 6f 63 69 61 ┆ char *value; /* the associa┆ 0x04f200…09e600 74 65 64 20 76 61 6c 75 65 20 74 65 78 74 20 2a 2f 0a 7d 0a 61 73 73 6f 63 3b 0a 0a 65 78 74 65 ┆ted value text */ } assoc; exte┆ 0x04f200…09e600 72 6e 20 69 6e 74 20 61 73 70 6c 69 74 28 29 2c 20 61 64 75 6d 70 28 29 3b 0a 2f 2a 0a 20 2a 20 ┆rn int asplit(), adump(); /* * ┆ 0x04f200…09e600 44 65 63 6c 61 72 65 20 74 68 65 20 63 6f 6e 74 72 6f 6c 20 73 74 72 75 63 74 75 72 65 20 66 6f ┆Declare the control structure fo┆ 0x04f200…09e600 72 20 61 6e 20 61 6c 69 73 74 20 6c 6f 6f 6b 75 70 2e 0a 20 2a 20 53 65 65 20 64 62 61 6c 6c 6f ┆r an alist lookup. * See dballo┆ 0x04f200…09e600 63 2e 63 20 66 6f 72 20 64 65 74 61 69 6c 73 20 6f 6e 20 77 68 61 74 20 74 68 69 73 20 69 73 20 ┆c.c for details on what this is ┆ 0x04f200…09e600 61 63 74 75 61 6c 6c 79 20 64 6f 69 6e 67 2e 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 ┆actually doing. The expression ┆ 0x04f200…09e600 2a 20 73 69 7a 65 6f 66 28 61 73 73 6f 63 5b 31 5d 29 20 69 73 20 69 6e 74 65 6e 64 65 64 20 74 ┆* sizeof(assoc[1]) is intended t┆ 0x04f200…09e600 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 61 6e 20 61 73 73 6f 63 20 72 ┆o compute the size of an assoc r┆ 0x04f200…09e600 65 63 6f 72 64 0a 20 2a 20 73 6c 6f 74 20 69 6e 20 61 6e 20 61 72 72 61 79 20 28 69 2e 65 2e 20 ┆ecord * slot in an array (i.e. ┆ 0x04f200…09e600 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61 73 73 6f 63 20 70 6c 75 73 20 77 68 61 74 65 ┆the size of the assoc plus whate┆ 0x04f200…09e600 76 65 72 20 74 72 61 69 6c 69 6e 67 20 70 61 64 0a 20 2a 20 74 68 65 20 6d 61 63 68 69 6e 65 20 ┆ver trailing pad * the machine ┆ 0x04f200…09e600 61 72 63 68 69 74 65 63 74 75 72 65 20 72 65 71 75 69 72 65 73 29 2e 0a 20 2a 2f 0a 23 64 65 66 ┆architecture requires). */ #def┆ 0x04f200…09e600 69 6e 65 20 41 4c 49 53 54 28 78 2c 69 2c 6a 29 20 20 20 20 64 62 64 65 66 5f 74 20 78 20 3d 20 ┆ine ALIST(x,i,j) dbdef_t x = ┆ 0x04f200…09e600 7b 4e 55 4c 4c 2c 73 69 7a 65 6f 66 28 61 73 73 6f 63 5b 31 5d 29 2c 69 2c 6a 2c 61 73 70 6c 69 ┆{NULL,sizeof(assoc[1]),i,j,aspli┆ 0x04f200…09e600 74 2c 61 64 75 6d 70 7d 3b 0a 0a 76 6f 69 64 20 61 65 6e 74 65 72 28 29 2c 20 61 72 65 70 6c 61 ┆t,adump}; void aenter(), arepla┆ 0x04f200…09e600 63 65 28 29 3b 0a 63 68 61 72 20 2a 61 66 69 6e 64 28 29 2c 20 2a 61 6d 61 74 63 68 28 29 3b 0a ┆ce(); char *afind(), *amatch(); ┆ 0x04f200…09e600 23 64 65 66 69 6e 65 20 61 6b 65 79 28 64 62 29 09 28 28 61 73 73 6f 63 20 2a 29 20 28 28 64 62 ┆#define akey(db) ((assoc *) ((db┆ 0x04f200…09e600 29 2d 3e 63 70 29 29 2d 3e 6b 65 79 0a 23 64 65 66 69 6e 65 20 61 76 61 6c 75 65 28 64 62 29 09 ┆)->cp))->key #define avalue(db) ┆ 0x04f200…09e600 28 28 61 73 73 6f 63 20 2a 29 20 28 28 64 62 29 2d 3e 63 70 29 29 2d 3e 76 61 6c 75 65 0a 23 64 ┆((assoc *) ((db)->cp))->value #d┆ 0x04f200…09e600 65 66 69 6e 65 20 61 64 65 6c 65 74 65 28 64 62 29 09 61 72 65 70 6c 61 63 65 28 64 62 2c 20 28 ┆efine adelete(db) areplace(db, (┆ 0x04f200…09e600 63 68 61 72 20 2a 29 4e 55 4c 4c 29 0a 0a 2f 2a 20 61 6c 69 73 74 2e 68 20 65 6e 64 73 20 68 65 ┆char *)NULL) /* alist.h ends he┆ 0x04f200…09e600 72 65 20 2a 2f 0a 6c 79 20 64 6f 69 6e 67 2e 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 ┆re */ ly doing. The expression ┆ 0x04f200…09e600 2a 20 73 69 7a 65 6f 66 28 61 73 73 6f 63 5b 31 5d 29 20 69 73 20 69 6e 74 65 6e 64 65 64 20 74 ┆* sizeof(assoc[1]) is intended t┆ 0x04f200…09e600 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 61 6e 20 61 73 73 6f 63 20 72 ┆o compute the size of an assoc r┆ 0x04f200…09e600 65 63 6f 72 64 0a 20 2a 20 73 6c 6f 74 20 69 6e 20 61 6e 20 61 72 72 61 79 20 28 69 2e 65 2e 20 ┆ecord * slot in an array (i.e. ┆ 0x04f200…09e600 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61 73 73 6f 63 20 70 6c 75 73 20 77 68 61 74 65 ┆the size of the assoc plus whate┆ 0x04f200…09e600 76 65 72 20 74 72 61 69 6c 69 6e 67 20 70 61 64 0a 73 72 63 2f 44 2e 70 6f 72 74 2f 61 72 70 61 ┆ver trailing pad src/D.port/arpa┆ 0x04f200…09e600 64 61 74 65 2e 63 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆date.c ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆ ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 20 20 20 34 34 34 20 00 20 20 20 ┆ 444 ┆ 0x04f200…09e600 31 34 35 20 00 20 20 20 20 20 31 20 00 20 20 20 20 20 20 20 32 33 37 34 20 20 34 34 35 36 31 35 ┆145 1 2374 445615┆ 0x04f200…09e600 34 30 35 31 20 20 20 37 37 35 32 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆4051 7752 ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆ ┆ […0x9…] 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 2f 2a 20 61 72 70 61 64 61 74 65 2e 63 20 2d ┆ /* arpadate.c -┆ 0x04f200…09e600 2d 20 63 6f 6e 76 65 72 74 20 74 69 6d 65 73 74 61 6d 70 20 74 6f 20 41 52 50 41 4e 45 54 20 64 ┆- convert timestamp to ARPANET d┆ 0x04f200…09e600 61 74 65 20 66 6f 72 6d 61 74 20 2a 2f 0a 2f 2a 20 4c 49 4e 54 4c 49 42 52 41 52 59 20 2a 2f 0a ┆ate format */ /* LINTLIBRARY */ ┆ 0x04f200…09e600 23 69 6e 63 6c 75 64 65 20 22 73 79 73 74 65 6d 2e 68 22 0a 0a 63 68 61 72 20 2a 61 72 70 61 64 ┆#include "system.h" char *arpad┆ 0x04f200…09e600 61 74 65 28 6c 6f 6e 67 74 69 6d 65 29 0a 2f 2a 0a 20 2a 20 61 72 70 61 64 61 74 65 28 29 20 69 ┆ate(longtime) /* * arpadate() i┆ 0x04f200…09e600 73 20 6c 69 6b 65 20 63 74 69 6d 65 28 33 29 20 65 78 63 65 70 74 20 74 68 61 74 20 74 68 65 20 ┆s like ctime(3) except that the ┆ 0x04f200…09e600 74 69 6d 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 6e 0a 20 2a 20 61 6e 20 61 63 63 65 70 74 ┆time is returned in * an accept┆ 0x04f200…09e600 61 62 6c 65 20 41 52 50 41 4e 45 54 20 74 69 6d 65 20 66 6f 72 6d 61 74 20 69 6e 73 74 65 61 64 ┆able ARPANET time format instead┆ 0x04f200…09e600 20 6f 66 20 63 74 69 6d 65 20 66 6f 72 6d 61 74 2e 0a 20 2a 2f 0a 74 69 6d 65 5f 74 20 2a 6c 6f ┆ of ctime format. */ time_t *lo┆ 0x04f200…09e600 6e 67 74 69 6d 65 3b 0a 7b 0a 20 20 20 20 72 65 67 69 73 74 65 72 20 63 68 61 72 20 20 2a 70 2c ┆ngtime; { register char *p,┆ 0x04f200…09e600 20 2a 71 2c 20 2a 75 64 3b 0a 20 20 20 20 72 65 67 69 73 74 65 72 20 69 6e 74 20 20 20 20 69 3b ┆ *q, *ud; register int i;┆ 0x04f200…09e600 0a 20 20 20 20 73 74 61 74 69 63 20 63 68 61 72 20 62 5b 34 30 5d 3b 0a 0a 20 20 20 20 2f 2a 20 ┆ static char b[40]; /* ┆ 0x04f200…09e600 20 47 65 74 20 63 75 72 72 65 6e 74 20 74 69 6d 65 2e 20 54 68 69 73 20 77 69 6c 6c 20 62 65 20 ┆ Get current time. This will be ┆ 0x04f200…09e600 75 73 65 64 20 72 65 73 6f 6c 76 65 20 74 68 65 20 74 69 6d 65 7a 6f 6e 65 2e 20 2a 2f 0a 20 20 ┆used resolve the timezone. */ ┆ 0x04f200…09e600 20 20 75 64 20 3d 20 61 73 63 74 69 6d 65 28 67 6d 74 69 6d 65 20 28 6c 6f 6e 67 74 69 6d 65 29 ┆ ud = asctime(gmtime (longtime)┆ 0x04f200…09e600 29 3b 0a 0a 20 20 20 20 2f 2a 20 20 43 72 61 63 6b 20 74 68 65 20 55 4e 49 58 20 64 61 74 65 20 ┆); /* Crack the UNIX date ┆ 0x04f200…09e600 6c 69 6e 65 20 69 6e 20 61 20 73 69 6e 67 75 6c 61 72 6c 79 20 75 6e 6f 72 69 67 69 6e 61 6c 20 ┆line in a singularly unoriginal ┆ 0x04f200…09e600 77 61 79 2e 20 2a 2f 0a 20 20 20 20 71 20 3d 20 62 3b 0a 0a 23 69 66 64 65 66 20 6e 6f 74 64 65 ┆way. */ q = b; #ifdef notde┆ 0x04f200…09e600 66 0a 2f 2a 20 75 6e 74 69 6c 20 65 76 65 72 79 20 73 69 74 65 20 69 6e 73 74 61 6c 6c 73 20 74 ┆f /* until every site installs t┆ 0x04f200…09e600 68 65 20 66 69 78 20 74 6f 20 67 65 74 64 61 74 65 2e 79 2c 20 74 68 65 20 64 61 79 0a 20 20 20 ┆he fix to getdate.y, the day ┆ 0x04f200…09e600 6f 66 20 74 68 65 20 77 65 65 6b 20 63 61 6e 20 63 61 75 73 65 20 74 69 6d 65 20 77 61 72 70 73 ┆of the week can cause time warps┆ 0x04f200…09e600 20 2a 2f 0a 20 20 20 20 70 20 3d 20 26 75 64 5b 30 5d 3b 09 09 09 2f 2a 20 4d 6f 6e 20 2a 2f 0a ┆ */ p = &ud[0]; /* Mon */ ┆ 0x04f200…09e600 20 20 20 20 2a 71 2b 2b 20 3d 20 2a 70 2b 2b 3b 0a 20 20 20 20 2a 71 2b 2b 20 3d 20 2a 70 2b 2b ┆ *q++ = *p++; *q++ = *p++┆ 0x04f200…09e600 3b 0a 20 20 20 20 2a 71 2b 2b 20 3d 20 2a 70 2b 2b 3b 0a 20 20 20 20 2a 71 2b 2b 20 3d 20 27 2c ┆; *q++ = *p++; *q++ = ',┆ 0x04f200…09e600 27 3b 0a 20 20 20 20 2a 71 2b 2b 20 3d 20 27 20 27 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 70 ┆'; *q++ = ' '; #endif p┆ 0x04f200…09e600 20 3d 20 26 75 64 5b 38 5d 3b 09 09 09 2f 2a 20 31 36 20 2a 2f 0a 20 20 20 20 69 66 20 28 2a 70 ┆ = &ud[8]; /* 16 */ if (*p┆ 0x04f200…09e600 20 3d 3d 20 27 20 27 29 0a 09 70 2b 2b 3b 0a 20 20 20 20 65 6c 73 65 0a 09 2a 71 2b 2b 20 3d 20 ┆ == ' ') p++; else *q++ = ┆ 0x04f200…09e600 2a 70 2b 2b 3b 0a 20 20 20 20 2a 71 2b 2b 20 3d 20 2a 70 2b 2b 3b 0a 20 20 20 20 2a 71 2b 2b 20 ┆*p++; *q++ = *p++; *q++ ┆ 0x04f200…09e600 3d 20 27 20 27 3b 0a 0a 20 20 20 20 70 20 3d 20 26 75 64 5b 34 5d 3b 09 09 09 2f 2a 20 53 65 70 ┆= ' '; p = &ud[4]; /* Sep┆ 0x04f200…09e600 20 2a 2f 0a 20 20 20 20 2a 71 2b 2b 20 3d 20 2a 70 2b 2b 3b 0a 20 20 20 20 2a 71 2b 2b 20 3d 20 ┆ */ *q++ = *p++; *q++ = ┆ 0x04f200…09e600 2a 70 2b 2b 3b 0a 20 20 20 20 2a 71 2b 2b 20 3d 20 2a 70 2b 2b 3b 0a 20 20 20 20 2a 71 2b 2b 20 ┆*p++; *q++ = *p++; *q++ ┆ 0x04f200…09e600 3d 20 27 20 27 3b 0a 0a 20 20 20 20 70 20 3d 20 26 75 64 5b 32 32 5d 3b 09 09 2f 2a 20 31 39 37 ┆= ' '; p = &ud[22]; /* 197┆ 0x04f200…09e600 39 20 2a 2f 0a 20 20 20 20 2a 71 2b 2b 20 3d 20 2a 70 2b 2b 3b 0a 20 20 20 20 2a 71 2b 2b 20 3d ┆9 */ *q++ = *p++; *q++ =┆ 0x04f200…09e600 20 2a 70 2b 2b 3b 0a 20 20 20 20 2a 71 2b 2b 20 3d 20 27 20 27 3b 0a 0a 20 20 20 20 70 20 3d 20 ┆ *p++; *q++ = ' '; p = ┆ 0x04f200…09e600 26 75 64 5b 31 31 5d 3b 09 09 2f 2a 20 30 31 3a 30 33 3a 35 32 20 2a 2f 0a 20 20 20 20 66 6f 72 ┆&ud[11]; /* 01:03:52 */ for┆ 0x04f200…09e600 20 28 69 20 3d 20 38 3b 20 69 20 3e 20 30 3b 20 69 2d 2d 29 0a 09 2a 71 2b 2b 20 3d 20 2a 70 2b ┆ (i = 8; i > 0; i--) *q++ = *p+┆ 0x04f200…09e600 2b 3b 0a 0a 20 20 20 20 2a 71 2b 2b 20 3d 20 27 20 27 3b 0a 20 20 20 20 2a 71 2b 2b 20 3d 20 27 ┆+; *q++ = ' '; *q++ = '┆ 0x04f200…09e600 47 27 3b 09 09 09 2f 2a 20 47 4d 54 20 2a 2f 0a 20 20 20 20 2a 71 2b 2b 20 3d 20 27 4d 27 3b 0a ┆G'; /* GMT */ *q++ = 'M'; ┆ 0x04f200…09e600 20 20 20 20 2a 71 2b 2b 20 3d 20 27 54 27 3b 0a 20 20 20 20 2a 71 20 3d 20 27 5c 30 27 3b 0a 0a ┆ *q++ = 'T'; *q = '\0'; ┆ 0x04f200…09e600 20 20 20 20 72 65 74 75 72 6e 28 62 29 3b 0a 7d 0a 0a 2f 2a 20 61 72 70 61 64 61 74 65 2e 63 20 ┆ return(b); } /* arpadate.c ┆ 0x04f200…09e600 65 6e 64 73 20 68 65 72 65 20 2a 2f 0a 20 27 20 27 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 70 ┆ends here */ ' '; #endif p┆ 0x04f200…09e600 20 3d 20 26 75 64 5b 38 5d 3b 09 09 09 2f 2a 20 31 36 20 2a 2f 0a 20 20 20 20 69 66 20 28 2a 70 ┆ = &ud[8]; /* 16 */ if (*p┆ 0x04f200…09e600 20 3d 3d 20 27 20 27 29 0a 09 70 2b 2b 3b 0a 20 20 20 20 65 6c 73 65 0a 09 2a 71 2b 2b 20 3d 20 ┆ == ' ') p++; else *q++ = ┆ 0x04f200…09e600 2a 70 2b 2b 3b 0a 20 20 20 20 2a 71 2b 2b 20 3d 20 2a 70 2b 2b 3b 0a 20 20 20 20 2a 71 2b 2b 20 ┆*p++; *q++ = *p++; *q++ ┆ 0x04f200…09e600 3d 20 27 20 27 3b 0a 0a 20 20 20 20 70 20 3d 20 26 75 64 5b 34 5d 3b 09 09 09 2f 2a 20 53 65 70 ┆= ' '; p = &ud[4]; /* Sep┆ 0x04f200…09e600 20 2a 2f 0a 20 20 20 20 2a 71 2b 2b 20 3d 20 2a 70 2b 2b 3b 0a 20 20 20 20 2a 71 2b 2b 20 3d 20 ┆ */ *q++ = *p++; *q++ = ┆ 0x04f200…09e600 2a 70 2b 2b 3b 0a 20 20 20 20 2a 71 2b 2b 20 3d 20 2a 70 2b 2b 3b 0a 20 20 20 20 2a 71 2b 2b 20 ┆*p++; *q++ = *p++; *q++ ┆ 0x04f200…09e600 3d 20 27 20 27 3b 0a 0a 20 20 20 20 70 20 3d 20 26 75 64 5b 32 32 5d 3b 09 09 2f 2a 20 31 39 37 ┆= ' '; p = &ud[22]; /* 197┆ 0x04f200…09e600 39 20 2a 2f 0a 20 20 20 20 2a 71 2b 2b 20 3d 20 2a 73 72 63 2f 44 2e 70 6f 72 74 2f 62 61 63 6b ┆9 */ *q++ = *src/D.port/back┆ 0x04f200…09e600 71 75 6f 74 65 2e 63 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆quote.c ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆ ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 20 20 20 34 34 34 20 00 20 20 20 ┆ 444 ┆ 0x04f200…09e600 31 34 35 20 00 20 20 20 20 20 31 20 00 20 20 20 20 20 20 20 33 34 32 31 20 20 34 34 35 36 31 35 ┆145 1 3421 445615┆ 0x04f200…09e600 34 30 35 31 20 20 31 30 31 34 31 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆4051 10141 ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆ ┆ […0x9…] 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆ /**************┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆********************************┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a ┆******************************* ┆ 0x04f200…09e600 0a 4e 41 4d 45 0a 20 20 20 62 61 63 6b 71 75 6f 74 65 2e 63 20 2d 2d 20 72 65 61 64 20 6f 75 74 ┆ NAME backquote.c -- read out┆ 0x04f200…09e600 70 75 74 20 6f 66 20 61 20 73 68 65 6c 6c 20 63 6f 6d 6d 61 6e 64 20 69 6e 74 6f 20 61 20 67 69 ┆put of a shell command into a gi┆ 0x04f200…09e600 76 65 6e 20 62 75 66 66 65 72 0a 0a 53 59 4e 4f 50 53 49 53 0a 20 20 20 63 68 61 72 20 2a 62 61 ┆ven buffer SYNOPSIS char *ba┆ 0x04f200…09e600 63 6b 71 75 6f 74 65 28 63 6d 64 2c 20 62 75 66 2c 20 6c 65 6e 29 0a 20 20 20 63 68 61 72 20 2a ┆ckquote(cmd, buf, len) char *┆ 0x04f200…09e600 63 6d 64 2c 20 2a 62 75 66 3b 20 69 6e 74 20 6c 65 6e 3b 0a 0a 44 45 53 43 52 49 50 54 49 4f 4e ┆cmd, *buf; int len; DESCRIPTION┆ 0x04f200…09e600 0a 20 20 20 52 65 61 64 20 74 68 65 20 6f 75 74 70 75 74 20 6f 66 20 61 20 73 68 65 6c 6c 20 63 ┆ Read the output of a shell c┆ 0x04f200…09e600 6f 6d 6d 61 6e 64 20 28 76 69 61 20 70 6f 70 65 6e 28 33 29 29 20 69 6e 74 6f 20 61 20 67 69 76 ┆ommand (via popen(3)) into a giv┆ 0x04f200…09e600 65 6e 20 62 75 66 66 65 72 2e 0a 52 65 74 75 72 6e 20 53 55 43 43 45 45 44 20 69 66 20 65 76 65 ┆en buffer. Return SUCCEED if eve┆ 0x04f200…09e600 72 79 74 68 69 6e 67 20 67 6f 65 73 20 4f 4b 2c 20 6f 74 68 65 72 77 69 73 65 20 46 41 49 4c 20 ┆rything goes OK, otherwise FAIL ┆ 0x04f200…09e600 2d 2d 20 65 72 72 6e 6f 20 77 69 6c 6c 20 62 65 20 45 49 4e 56 41 4c 0a 69 66 20 6c 65 6e 20 77 ┆-- errno will be EINVAL if len w┆ 0x04f200…09e600 61 73 20 30 2c 20 45 52 41 4e 47 45 20 69 66 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 72 65 74 75 ┆as 0, ERANGE if the command retu┆ 0x04f200…09e600 72 6e 65 64 20 6d 6f 72 65 20 74 68 61 6e 20 6c 65 6e 20 63 68 61 72 61 63 74 65 72 73 2c 0a 6f ┆rned more than len characters, o┆ 0x04f200…09e600 74 68 65 72 77 69 73 65 20 77 68 61 74 65 76 65 72 20 77 61 73 20 73 65 74 20 62 79 20 70 6f 70 ┆therwise whatever was set by pop┆ 0x04f200…09e600 65 6e 28 33 29 20 61 6e 64 20 74 68 65 20 63 6f 6d 6d 61 6e 64 2e 0a 20 20 20 49 66 20 74 68 65 ┆en(3) and the command. If the┆ 0x04f200…09e600 20 63 6f 6d 6d 61 6e 64 20 67 69 76 65 6e 20 65 6e 64 65 64 20 69 6e 20 5c 63 2c 20 61 6e 79 20 ┆ command given ended in \c, any ┆ 0x04f200…09e600 74 72 61 69 6c 69 6e 67 20 6e 65 77 6c 69 6e 65 20 6f 6e 20 74 68 65 20 6f 75 74 70 75 74 20 77 ┆trailing newline on the output w┆ 0x04f200…09e600 69 6c 6c 0a 62 65 20 73 74 72 69 70 70 65 64 20 6f 66 66 2e 0a 0a 41 55 54 48 4f 52 0a 20 20 20 ┆ill be stripped off. AUTHOR ┆ 0x04f200…09e600 45 72 69 63 20 53 2e 20 52 61 79 6d 6f 6e 64 0a 20 20 20 54 68 69 73 20 73 6f 66 74 77 61 72 65 ┆Eric S. Raymond This software┆ 0x04f200…09e600 20 69 73 20 43 6f 70 79 72 69 67 68 74 20 28 43 29 20 31 39 38 39 20 62 79 20 45 72 69 63 20 53 ┆ is Copyright (C) 1989 by Eric S┆ 0x04f200…09e600 2e 20 52 61 79 6d 6f 6e 64 20 66 6f 72 20 74 68 65 20 73 6f 6c 65 20 70 75 72 70 6f 73 65 0a 6f ┆. Raymond for the sole purpose o┆ 0x04f200…09e600 66 20 70 72 6f 74 65 63 74 69 6e 67 20 66 72 65 65 20 72 65 64 69 73 74 72 69 62 75 74 69 6f 6e ┆f protecting free redistribution┆ 0x04f200…09e600 3b 20 73 65 65 20 74 68 65 20 4c 49 43 45 4e 53 45 20 66 69 6c 65 20 66 6f 72 20 64 65 74 61 69 ┆; see the LICENSE file for detai┆ 0x04f200…09e600 6c 73 2e 0a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆ls. ***************************┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆********************************┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 20 4c 49 4e 54 4c 49 42 52 41 ┆******************/ /* LINTLIBRA┆ 0x04f200…09e600 52 59 20 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 6c 69 62 70 6f 72 74 2e 68 22 0a 0a 63 68 61 72 ┆RY */ #include "libport.h" char┆ 0x04f200…09e600 20 2a 62 61 63 6b 71 75 6f 74 65 28 63 6d 64 2c 20 62 75 66 2c 20 6c 65 6e 29 0a 63 68 61 72 09 ┆ *backquote(cmd, buf, len) char ┆ 0x04f200…09e600 2a 63 6d 64 2c 20 2a 62 75 66 3b 0a 69 6e 74 09 6c 65 6e 3b 0a 7b 0a 20 20 20 20 46 49 4c 45 09 ┆*cmd, *buf; int len; { FILE ┆ 0x04f200…09e600 2a 70 66 70 3b 0a 20 20 20 20 63 68 61 72 09 2a 63 70 2c 20 62 66 72 5b 42 55 46 53 49 5a 5d 3b ┆*pfp; char *cp, bfr[BUFSIZ];┆ 0x04f200…09e600 0a 20 20 20 20 69 6e 74 09 09 63 3b 0a 20 20 20 20 62 6f 6f 6c 09 73 74 72 69 70 3b 0a 0a 20 20 ┆ int c; bool strip; ┆ 0x04f200…09e600 20 20 69 66 20 28 6c 65 6e 20 3c 3d 20 30 29 0a 20 20 20 20 7b 0a 09 65 72 72 6e 6f 20 3d 20 45 ┆ if (len <= 0) { errno = E┆ 0x04f200…09e600 49 4e 56 41 4c 3b 0a 09 72 65 74 75 72 6e 28 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 20 20 ┆INVAL; return((char *)NULL); ┆ 0x04f200…09e600 20 20 7d 0a 20 20 20 20 65 6c 73 65 20 69 66 20 28 62 75 66 20 3d 3d 20 28 63 68 61 72 20 2a 29 ┆ } else if (buf == (char *)┆ 0x04f200…09e600 4e 55 4c 4c 29 0a 09 62 75 66 20 3d 20 6d 61 6c 6c 6f 63 28 28 75 6e 73 69 67 6e 65 64 29 20 6c ┆NULL) buf = malloc((unsigned) l┆ 0x04f200…09e600 65 6e 29 3b 0a 0a 20 20 20 20 63 70 20 3d 20 63 6d 64 20 2b 20 73 74 72 6c 65 6e 28 63 6d 64 29 ┆en); cp = cmd + strlen(cmd)┆ 0x04f200…09e600 3b 0a 20 20 20 20 69 66 20 28 73 74 72 69 70 20 3d 20 28 63 70 20 3e 3d 20 63 6d 64 20 2b 20 32 ┆; if (strip = (cp >= cmd + 2┆ 0x04f200…09e600 20 26 26 20 63 70 5b 2d 31 5d 20 3d 3d 20 27 63 27 20 26 26 20 63 70 5b 2d 32 5d 20 3d 3d 20 27 ┆ && cp[-1] == 'c' && cp[-2] == '┆ 0x04f200…09e600 5c 5c 27 29 29 0a 09 63 70 5b 2d 32 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 20 20 28 76 6f 69 64 ┆\\')) cp[-2] = '\0'; (void┆ 0x04f200…09e600 29 20 73 74 72 63 70 79 28 62 66 72 2c 20 63 6d 64 29 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 73 ┆) strcpy(bfr, cmd); (void) s┆ 0x04f200…09e600 74 72 63 61 74 28 62 66 72 2c 20 22 3c 2f 64 65 76 2f 6e 75 6c 6c 22 29 3b 0a 20 20 20 20 69 66 ┆trcat(bfr, "</dev/null"); if┆ 0x04f200…09e600 20 28 28 70 66 70 20 3d 20 70 6f 70 65 6e 28 62 66 72 2c 20 22 72 22 29 29 20 3d 3d 20 28 46 49 ┆ ((pfp = popen(bfr, "r")) == (FI┆ 0x04f200…09e600 4c 45 20 2a 29 4e 55 4c 4c 29 0a 09 72 65 74 75 72 6e 28 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 ┆LE *)NULL) return((char *)NULL)┆ 0x04f200…09e600 3b 0a 0a 20 20 20 20 63 70 20 3d 20 62 75 66 3b 0a 20 20 20 20 77 68 69 6c 65 20 28 2d 2d 6c 65 ┆; cp = buf; while (--le┆ 0x04f200…09e600 6e 29 09 2f 2a 20 6e 65 65 64 20 6f 6e 65 20 65 78 74 72 61 20 73 70 61 63 65 20 66 6f 72 20 74 ┆n) /* need one extra space for t┆ 0x04f200…09e600 65 72 6d 69 6e 61 74 69 6e 67 20 27 5c 30 27 20 2a 2f 0a 09 69 66 20 28 28 63 20 3d 20 66 67 65 ┆erminating '\0' */ if ((c = fge┆ 0x04f200…09e600 74 63 28 70 66 70 29 29 20 3d 3d 20 45 4f 46 29 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 65 6c ┆tc(pfp)) == EOF) break; el┆ 0x04f200…09e600 73 65 0a 09 20 20 20 20 2a 63 70 2b 2b 20 3d 20 63 3b 0a 20 20 20 20 2a 63 70 20 3d 20 27 5c 30 ┆se *cp++ = c; *cp = '\0┆ 0x04f200…09e600 27 3b 0a 20 20 20 20 69 66 20 28 73 74 72 69 70 20 26 26 20 28 63 70 20 3d 20 73 74 72 63 68 72 ┆'; if (strip && (cp = strchr┆ 0x04f200…09e600 28 62 75 66 2c 20 27 5c 6e 27 29 29 20 26 26 20 63 70 5b 31 5d 20 3d 3d 20 27 5c 30 27 29 0a 09 ┆(buf, '\n')) && cp[1] == '\0') ┆ 0x04f200…09e600 2a 63 70 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 20 20 28 76 6f 69 64 29 20 70 63 6c 6f 73 65 28 70 ┆*cp = '\0'; (void) pclose(p┆ 0x04f200…09e600 66 70 29 3b 0a 20 20 20 20 69 66 20 28 66 65 6f 66 28 70 66 70 29 29 0a 09 72 65 74 75 72 6e 28 ┆fp); if (feof(pfp)) return(┆ 0x04f200…09e600 62 75 66 29 3b 0a 20 20 20 20 65 6c 73 65 0a 20 20 20 20 7b 0a 09 65 72 72 6e 6f 20 3d 20 45 52 ┆buf); else { errno = ER┆ 0x04f200…09e600 41 4e 47 45 3b 0a 09 72 65 74 75 72 6e 28 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 20 20 20 ┆ANGE; return((char *)NULL); ┆ 0x04f200…09e600 20 7d 0a 7d 0a 0a 2f 2a 20 62 61 63 6b 71 75 6f 74 65 2e 63 20 65 6e 64 73 20 68 65 72 65 20 2a ┆ } } /* backquote.c ends here *┆ 0x04f200…09e600 2f 0a 73 74 72 63 70 79 28 62 66 72 2c 20 63 6d 64 29 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 73 ┆/ strcpy(bfr, cmd); (void) s┆ 0x04f200…09e600 74 72 63 61 74 28 62 66 72 2c 20 22 3c 2f 64 65 76 2f 6e 75 6c 6c 22 29 3b 0a 20 20 20 20 69 66 ┆trcat(bfr, "</dev/null"); if┆ 0x04f200…09e600 20 28 28 70 66 70 20 3d 20 70 6f 70 65 6e 28 62 66 72 2c 20 22 72 22 29 29 20 3d 3d 20 28 46 49 ┆ ((pfp = popen(bfr, "r")) == (FI┆ 0x04f200…09e600 4c 45 20 2a 29 4e 55 4c 4c 29 0a 09 72 65 74 75 72 6e 28 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 ┆LE *)NULL) return((char *)NULL)┆ 0x04f200…09e600 3b 0a 0a 20 20 20 20 63 70 20 3d 20 62 75 66 3b 0a 20 20 20 20 77 68 69 6c 65 20 28 2d 2d 6c 65 ┆; cp = buf; while (--le┆ 0x04f200…09e600 6e 29 09 2f 2a 20 6e 65 65 64 20 6f 6e 65 20 65 78 74 72 61 20 73 70 61 63 65 20 66 6f 72 20 74 ┆n) /* need one extra space for t┆ 0x04f200…09e600 65 72 6d 69 6e 61 74 69 6e 67 20 27 5c 30 27 20 2a 2f 0a 09 69 66 20 28 28 63 20 3d 20 66 67 65 ┆erminating '\0' */ if ((c = fge┆ 0x04f200…09e600 74 63 28 70 66 70 29 29 20 3d 3d 20 45 4f 46 29 0a 73 72 63 2f 44 2e 70 6f 72 74 2f 62 69 74 62 ┆tc(pfp)) == EOF) src/D.port/bitb┆ 0x04f200…09e600 75 63 6b 65 74 2e 63 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆ucket.c ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆ ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 20 20 20 34 34 34 20 00 20 20 20 ┆ 444 ┆ 0x04f200…09e600 31 34 35 20 00 20 20 20 20 20 31 20 00 20 20 20 20 20 20 20 20 37 31 32 20 20 34 34 35 36 31 35 ┆145 1 712 445615┆ 0x04f200…09e600 34 30 35 30 20 20 31 30 31 31 36 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆4050 10116 ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆ ┆ […0x9…] 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 2f 2a 20 62 69 74 62 75 63 6b 65 74 2e 63 20 ┆ /* bitbucket.c ┆ 0x04f200…09e600 2d 2d 20 74 65 6c 6c 20 75 73 20 69 66 20 61 20 66 69 6c 65 20 70 6f 69 6e 74 65 72 20 69 73 20 ┆-- tell us if a file pointer is ┆ 0x04f200…09e600 64 69 72 65 63 74 65 64 20 74 6f 20 2f 64 65 76 2f 6e 75 6c 6c 20 2a 2f 0a 2f 2a 4c 49 4e 54 4c ┆directed to /dev/null */ /*LINTL┆ 0x04f200…09e600 49 42 52 41 52 59 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 6c 69 62 70 6f 72 74 2e 68 22 0a 0a 62 ┆IBRARY*/ #include "libport.h" b┆ 0x04f200…09e600 6f 6f 6c 20 62 69 74 62 75 63 6b 65 74 28 66 70 29 0a 2f 2a 20 72 65 74 75 72 6e 20 54 52 55 45 ┆ool bitbucket(fp) /* return TRUE┆ 0x04f200…09e600 20 69 66 66 20 67 69 76 65 6e 20 66 70 20 68 61 73 20 62 65 65 6e 20 72 65 64 69 72 65 63 74 65 ┆ iff given fp has been redirecte┆ 0x04f200…09e600 64 20 74 6f 20 2f 64 65 76 2f 6e 75 6c 6c 2e 20 2a 2f 0a 46 49 4c 45 09 2a 66 70 3b 0a 7b 0a 20 ┆d to /dev/null. */ FILE *fp; { ┆ 0x04f200…09e600 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73 73 2c 20 6e 73 3b 0a 0a 20 20 20 20 69 66 20 28 ┆ struct stat ss, ns; if (┆ 0x04f200…09e600 66 73 74 61 74 28 66 69 6c 65 6e 6f 28 66 70 29 2c 20 26 73 73 29 20 3c 20 30 29 0a 09 72 65 74 ┆fstat(fileno(fp), &ss) < 0) ret┆ 0x04f200…09e600 75 72 6e 20 46 41 4c 53 45 3b 0a 20 20 20 20 69 66 20 28 73 74 61 74 28 22 2f 64 65 76 2f 6e 75 ┆urn FALSE; if (stat("/dev/nu┆ 0x04f200…09e600 6c 6c 22 2c 20 26 6e 73 29 20 3c 20 30 29 0a 09 72 65 74 75 72 6e 20 46 41 4c 53 45 3b 0a 20 20 ┆ll", &ns) < 0) return FALSE; ┆ 0x04f200…09e600 20 20 69 66 20 28 73 73 2e 73 74 5f 64 65 76 20 3d 3d 20 6e 73 2e 73 74 5f 64 65 76 20 26 26 20 ┆ if (ss.st_dev == ns.st_dev && ┆ 0x04f200…09e600 73 73 2e 73 74 5f 72 64 65 76 20 3d 3d 20 6e 73 2e 73 74 5f 72 64 65 76 29 0a 09 72 65 74 75 72 ┆ss.st_rdev == ns.st_rdev) retur┆ 0x04f200…09e600 6e 28 54 52 55 45 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 28 46 41 4c 53 45 29 3b 0a 7d 0a 0a 2f ┆n(TRUE); return(FALSE); } /┆ 0x04f200…09e600 2a 20 62 69 74 62 75 63 6b 65 74 2e 63 20 65 6e 64 73 20 68 65 72 65 20 2a 2f 0a 66 6f 72 20 74 ┆* bitbucket.c ends here */ for t┆ 0x04f200…09e600 65 72 6d 69 6e 61 74 69 6e 67 20 27 5c 30 27 20 2a 2f 0a 09 69 66 20 28 28 63 20 3d 20 66 67 65 ┆erminating '\0' */ if ((c = fge┆ 0x04f200…09e600 74 63 28 70 66 70 29 29 20 3d 3d 20 45 4f 46 29 0a 73 72 63 2f 44 2e 70 6f 72 74 2f 62 7a 65 72 ┆tc(pfp)) == EOF) src/D.port/bzer┆ 0x04f200…09e600 6f 2e 63 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆o.c ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆ ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 20 20 20 34 34 34 20 00 20 20 20 ┆ 444 ┆ 0x04f200…09e600 31 34 35 20 00 20 20 20 20 20 31 20 00 20 20 20 20 20 20 20 33 35 35 33 20 20 34 34 35 36 31 35 ┆145 1 3553 445615┆ 0x04f200…09e600 34 30 35 31 20 20 20 37 33 31 32 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆4051 7312 ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆ ┆ […0x9…] 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 2f 2a 20 62 7a 65 72 6f 2e 63 20 2d 2d 20 7a ┆ /* bzero.c -- z┆ 0x04f200…09e600 65 72 6f 20 6f 75 74 20 61 20 62 6c 6f 63 6b 20 69 6e 20 6d 65 6d 6f 72 79 20 2a 2f 0a 2f 2a 4c ┆ero out a block in memory */ /*L┆ 0x04f200…09e600 49 4e 54 4c 49 42 52 41 52 59 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 79 73 74 65 6d 2e 68 22 ┆INTLIBRARY*/ #include "system.h"┆ 0x04f200…09e600 0a 0a 23 69 66 6e 64 65 66 20 62 7a 65 72 6f 0a 76 6f 69 64 20 62 7a 65 72 6f 28 63 70 2c 20 6e ┆ #ifndef bzero void bzero(cp, n┆ 0x04f200…09e600 29 0a 72 65 67 69 73 74 65 72 20 63 68 61 72 20 2a 63 70 3b 0a 72 65 67 69 73 74 65 72 20 69 6e ┆) register char *cp; register in┆ 0x04f200…09e600 74 20 6e 3b 0a 7b 0a 20 20 20 20 64 6f 20 7b 0a 09 2a 63 70 2b 2b 20 3d 20 30 3b 0a 20 20 20 20 ┆t n; { do { *cp++ = 0; ┆ 0x04f200…09e600 7d 20 77 68 69 6c 65 20 28 2d 2d 6e 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 62 7a 65 72 6f ┆} while (--n); } #endif /* bzero┆ 0x04f200…09e600 20 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆ */ /**************************┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆********************************┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 0a 49 66 20 79 6f 75 20 68 61 70 70 65 6e 20 ┆**************** If you happen ┆ 0x04f200…09e600 74 6f 20 62 65 20 75 73 69 6e 67 20 61 20 50 44 50 2d 31 31 2c 20 79 6f 75 20 63 61 6e 20 75 73 ┆to be using a PDP-11, you can us┆ 0x04f200…09e600 65 20 74 68 69 73 20 61 73 73 65 6d 62 6c 65 72 20 76 65 72 73 69 6f 6e 2e 2e 2e 0a 0a 2f 20 42 ┆e this assembler version... / B┆ 0x04f200…09e600 5a 45 52 4f 28 4d 45 4d 2c 20 4e 29 20 20 43 48 41 52 20 2a 4d 45 4d 3b 0a 2f 0a 2f 09 43 6c 65 ┆ZERO(MEM, N) CHAR *MEM; / / Cle┆ 0x04f200…09e600 61 72 20 22 6e 22 20 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20 73 74 61 72 74 69 6e 67 20 ┆ar "n" bytes of memory starting ┆ 0x04f200…09e600 61 74 20 22 6d 65 6d 22 2e 0a 2f 0a 2e 67 6c 6f 62 6c 09 5f 62 7a 65 72 6f 0a 2e 67 6c 6f 62 6c ┆at "mem". / .globl _bzero .globl┆ 0x04f200…09e600 09 63 73 61 76 2c 20 63 72 65 74 0a 0a 2e 74 65 78 74 0a 5f 62 7a 65 72 6f 3a 09 6a 73 72 09 72 ┆ csav, cret .text _bzero: jsr r┆ 0x04f200…09e600 30 2c 20 63 73 61 76 09 2f 20 73 61 76 65 20 72 65 67 69 73 74 65 72 73 0a 09 6d 6f 76 09 34 28 ┆0, csav / save registers mov 4(┆ 0x04f200…09e600 72 35 29 2c 20 72 30 09 2f 20 67 65 74 20 6d 65 6d 6f 72 79 20 70 6f 69 6e 74 65 72 2e 2e 2e 0a ┆r5), r0 / get memory pointer... ┆ 0x04f200…09e600 09 6d 6f 76 09 36 28 72 35 29 2c 20 72 31 09 2f 20 2e 2e 2e 61 6e 64 20 63 6f 75 6e 74 0a 09 62 ┆ mov 6(r5), r1 / ...and count b┆ 0x04f200…09e600 65 71 09 72 65 74 09 09 2f 20 72 65 74 75 72 6e 20 69 66 20 7a 65 72 6f 0a 09 62 69 74 09 24 31 ┆eq ret / return if zero bit $1┆ 0x04f200…09e600 2c 20 72 30 09 09 2f 20 69 73 20 61 64 64 72 65 73 73 20 6f 64 64 3f 0a 09 62 65 71 09 31 66 09 ┆, r0 / is address odd? beq 1f ┆ 0x04f200…09e600 09 2f 20 79 65 73 2e 2e 2e 0a 09 20 20 63 6c 72 62 09 20 20 28 72 30 29 2b 09 09 2f 20 20 20 63 ┆ / yes... clrb (r0)+ / c┆ 0x04f200…09e600 6c 65 61 72 20 6f 6e 65 20 62 79 74 65 20 74 6f 20 6d 61 6b 65 20 69 74 20 65 76 65 6e 0a 09 20 ┆lear one byte to make it even ┆ 0x04f200…09e600 20 64 65 63 09 20 20 72 31 09 09 2f 20 20 20 61 6e 64 20 61 64 6a 75 73 74 20 62 79 74 65 20 63 ┆ dec r1 / and adjust byte c┆ 0x04f200…09e600 6f 75 6e 74 0a 31 3a 09 6d 6f 76 09 72 31 2c 20 72 33 09 09 2f 20 73 61 76 65 20 28 6c 6f 77 20 ┆ount 1: mov r1, r3 / save (low ┆ 0x04f200…09e600 62 69 74 20 6f 66 29 20 63 6f 75 6e 74 0a 09 63 6c 72 09 72 32 09 09 2f 20 67 65 74 20 7a 65 72 ┆bit of) count clr r2 / get zer┆ 0x04f200…09e600 6f 20 69 6e 74 6f 20 61 20 72 65 67 69 73 74 65 72 20 61 6e 64 20 63 6c 65 61 72 20 63 61 72 72 ┆o into a register and clear carr┆ 0x04f200…09e600 79 0a 09 72 6f 72 09 72 31 09 09 2f 20 63 6f 6e 76 65 72 74 20 63 6f 75 6e 74 20 74 6f 20 77 6f ┆y ror r1 / convert count to wo┆ 0x04f200…09e600 72 64 73 2e 0a 09 61 73 72 09 72 31 09 09 2f 20 63 6f 6e 76 65 72 74 20 63 6f 75 6e 74 20 74 6f ┆rds. asr r1 / convert count to┆ 0x04f200…09e600 20 64 6f 75 62 6c 65 20 77 6f 72 64 73 0a 09 62 63 63 09 31 66 09 09 2f 20 69 66 20 77 6f 72 64 ┆ double words bcc 1f / if word┆ 0x04f200…09e600 20 63 6f 75 6e 74 20 77 61 73 20 6f 64 64 0a 09 20 20 6d 6f 76 09 20 20 72 32 2c 20 28 72 30 29 ┆ count was odd mov r2, (r0)┆ 0x04f200…09e600 2b 09 2f 20 20 20 63 6c 65 61 72 20 61 6e 20 65 78 74 72 61 20 77 6f 72 64 0a 09 20 20 74 73 74 ┆+ / clear an extra word tst┆ 0x04f200…09e600 09 20 20 72 31 09 09 2f 20 20 20 72 65 73 65 74 20 63 6f 6e 64 69 74 69 6f 6e 20 63 6f 64 65 73 ┆ r1 / reset condition codes┆ 0x04f200…09e600 20 6f 6e 20 72 31 0a 31 3a 09 62 65 71 09 33 66 09 09 2f 20 77 68 69 6c 65 20 72 31 20 7e 3d 20 ┆ on r1 1: beq 3f / while r1 ~= ┆ 0x04f200…09e600 30 0a 32 3a 09 20 20 6d 6f 76 09 20 20 72 32 2c 20 28 72 30 29 2b 09 2f 20 20 20 63 6c 65 61 72 ┆0 2: mov r2, (r0)+ / clear┆ 0x04f200…09e600 20 61 20 77 6f 72 64 2e 2e 2e 0a 09 20 20 6d 6f 76 09 20 20 72 32 2c 20 28 72 30 29 2b 09 2f 0a ┆ a word... mov r2, (r0)+ / ┆ 0x04f200…09e600 09 20 20 73 6f 62 09 20 20 72 31 2c 20 32 62 09 2f 20 20 20 61 6e 64 20 75 70 64 61 74 65 20 63 ┆ sob r1, 2b / and update c┆ 0x04f200…09e600 6f 75 6e 74 0a 33 3a 09 61 73 72 09 72 33 09 09 2f 20 69 66 20 63 6f 75 6e 74 20 77 61 73 20 6f ┆ount 3: asr r3 / if count was o┆ 0x04f200…09e600 64 64 0a 09 62 63 63 09 72 65 74 09 09 2f 0a 09 20 20 6d 6f 76 62 09 20 20 72 32 2c 20 28 72 30 ┆dd bcc ret / movb r2, (r0┆ 0x04f200…09e600 29 2b 09 2f 20 20 20 63 6c 65 61 72 20 61 6e 20 65 78 74 72 61 20 62 79 74 65 0a 72 65 74 3a 09 ┆)+ / clear an extra byte ret: ┆ 0x04f200…09e600 6a 6d 70 09 63 72 65 74 09 09 2f 20 72 65 74 75 72 6e 0a 0a 49 66 20 79 6f 75 20 68 61 70 70 65 ┆jmp cret / return If you happe┆ 0x04f200…09e600 6e 20 74 6f 20 62 65 20 61 20 33 62 32 2c 20 33 62 35 2c 20 33 62 31 30 2c 20 6f 72 20 33 62 31 ┆n to be a 3b2, 3b5, 3b10, or 3b1┆ 0x04f200…09e600 35 20 28 62 75 74 20 6e 6f 74 20 61 20 33 62 31 21 29 20 79 6f 75 20 63 61 6e 20 75 73 65 20 74 ┆5 (but not a 3b1!) you can use t┆ 0x04f200…09e600 68 69 73 0a 0a 09 2e 66 69 6c 65 09 22 62 7a 65 72 6f 2e 75 33 62 22 09 23 20 61 73 73 65 6d 62 ┆his .file "bzero.u3b" # assemb┆ 0x04f200…09e600 6c 65 72 20 77 61 6e 74 73 20 74 68 69 73 0a 0a 23 20 54 68 69 73 20 63 6f 64 65 20 72 65 6c 69 ┆ler wants this # This code reli┆ 0x04f200…09e600 65 73 20 6f 6e 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20 62 7a 65 72 6f 28 6d 65 6d 2c 20 6e ┆es on the fact that bzero(mem, n┆ 0x04f200…09e600 29 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 0a 23 20 73 74 72 6e 63 70 79 28 22 22 2c ┆) is equivalent to # strncpy("",┆ 0x04f200…09e600 20 6d 65 6d 2c 20 6e 29 2e 0a 0a 09 2e 67 6c 6f 62 6c 09 62 7a 65 72 6f 0a 09 2e 61 6c 69 67 6e ┆ mem, n). .globl bzero .align┆ 0x04f200…09e600 09 34 0a 62 7a 65 72 6f 3a 09 73 61 76 65 09 26 31 09 09 23 20 73 65 74 20 75 70 20 73 74 61 63 ┆ 4 bzero: save &1 # set up stac┆ 0x04f200…09e600 6b 20 66 72 61 6d 65 20 61 6e 64 20 73 61 76 65 20 72 38 0a 09 6d 6f 76 77 09 30 28 25 61 70 29 ┆k frame and save r8 movw 0(%ap)┆ 0x04f200…09e600 2c 20 25 72 30 09 23 20 67 65 74 20 61 64 64 72 65 73 73 0a 09 6d 6f 76 77 09 34 28 25 61 70 29 ┆, %r0 # get address movw 4(%ap)┆ 0x04f200…09e600 2c 20 25 72 31 09 23 20 61 6e 64 20 63 6f 75 6e 74 0a 09 6d 6f 76 77 09 26 30 2c 20 25 72 32 09 ┆, %r1 # and count movw &0, %r2 ┆ 0x04f200…09e600 09 23 20 76 61 72 69 6f 75 73 20 70 61 72 61 6d 65 74 65 72 73 20 61 72 65 20 7a 65 72 6f 0a 09 ┆ # various parameters are zero ┆ 0x04f200…09e600 6d 6f 76 61 77 09 7a 65 72 6f 2c 20 25 72 38 09 23 20 6e 75 6c 6c 20 73 74 72 69 6e 67 0a 09 6d ┆movaw zero, %r8 # null string m┆ 0x04f200…09e600 6f 76 63 63 65 70 09 25 72 38 2c 25 72 31 2c 25 72 30 2c 25 72 32 2c 25 72 32 09 23 20 73 74 72 ┆ovccep %r8,%r1,%r0,%r2,%r2 # str┆ 0x04f200…09e600 6e 63 70 79 20 69 6e 73 72 75 63 74 69 6f 6e 0a 09 72 65 74 09 26 31 09 09 23 20 72 65 74 75 72 ┆ncpy insruction ret &1 # retur┆ 0x04f200…09e600 6e 0a 0a 09 2e 64 61 74 61 0a 7a 65 72 6f 3a 09 2e 62 79 74 65 09 30 0a 2a 2a 2a 2a 2a 2a 2a 2a ┆n .data zero: .byte 0 ********┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆********************************┆ […0x1…] 0x04f200…09e600 2a 2a 2f 0a 2f 2a 20 62 7a 65 72 6f 2e 68 20 65 6e 64 73 20 68 65 72 65 20 2a 2f 0a 73 65 6d 62 ┆**/ /* bzero.h ends here */ semb┆ 0x04f200…09e600 6c 65 72 20 77 61 6e 74 73 20 74 68 69 73 0a 0a 23 20 54 68 69 73 20 63 6f 64 65 20 72 65 6c 69 ┆ler wants this # This code reli┆ 0x04f200…09e600 65 73 20 6f 6e 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20 62 7a 65 72 6f 28 6d 65 6d 2c 20 6e ┆es on the fact that bzero(mem, n┆ 0x04f200…09e600 29 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 0a 23 20 73 74 72 6e 63 70 79 28 22 22 2c ┆) is equivalent to # strncpy("",┆ 0x04f200…09e600 20 6d 65 6d 2c 20 6e 29 2e 0a 0a 09 2e 67 6c 6f 62 6c 09 62 7a 65 72 6f 0a 09 2e 61 6c 69 67 6e ┆ mem, n). .globl bzero .align┆ 0x04f200…09e600 09 34 0a 62 7a 65 72 6f 3a 09 73 61 76 65 09 26 31 73 72 63 2f 44 2e 70 6f 72 74 2f 63 68 65 63 ┆ 4 bzero: save &1src/D.port/chec┆ 0x04f200…09e600 6b 73 75 6d 2e 63 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆ksum.c ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆ ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 20 20 20 34 34 34 20 00 20 20 20 ┆ 444 ┆ 0x04f200…09e600 31 34 35 20 00 20 20 20 20 20 31 20 00 20 20 20 20 20 20 31 35 31 34 33 20 20 34 34 35 36 31 35 ┆145 1 15143 445615┆ 0x04f200…09e600 34 30 35 31 20 20 31 30 30 31 31 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆4051 10011 ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆ ┆ […0x9…] 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆ /**************┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆********************************┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 0a ┆****************************** ┆ 0x04f200…09e600 4e 41 4d 45 0a 20 20 20 63 68 65 63 6b 73 75 6d 2e 63 20 2d 2d 20 63 6f 64 65 20 66 6f 72 20 63 ┆NAME checksum.c -- code for c┆ 0x04f200…09e600 6f 6d 70 75 74 69 6e 67 20 61 6e 64 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20 61 6e 20 61 72 74 ┆omputing and representing an art┆ 0x04f200…09e600 69 63 6c 65 20 63 68 65 63 6b 73 75 6d 2e 0a 0a 53 59 4e 4f 50 53 49 53 0a 20 20 20 23 69 6e 63 ┆icle checksum. SYNOPSIS #inc┆ 0x04f200…09e600 6c 75 64 65 20 22 6e 65 77 73 2e 68 22 0a 0a 20 20 20 75 6c 6f 6e 67 20 63 68 65 63 6b 73 75 6d ┆lude "news.h" ulong checksum┆ 0x04f200…09e600 28 66 70 2c 20 6c 65 6e 29 09 09 09 2d 2d 20 63 6f 6d 70 75 74 65 20 63 68 65 63 6b 73 75 6d 20 ┆(fp, len) -- compute checksum ┆ 0x04f200…09e600 6f 66 20 61 20 66 69 6c 65 0a 20 20 20 46 49 4c 45 20 2a 66 70 3b 20 75 6c 6f 6e 67 20 6c 65 6e ┆of a file FILE *fp; ulong len┆ 0x04f200…09e600 3b 0a 0a 20 20 20 75 6c 6f 6e 67 20 63 68 65 63 6b 73 74 72 69 6e 67 28 73 74 72 2c 20 63 72 63 ┆; ulong checkstring(str, crc┆ 0x04f200…09e600 29 09 09 09 2d 2d 20 61 64 64 20 63 68 65 63 6b 73 75 6d 20 6f 66 20 61 20 73 74 72 69 6e 67 0a ┆) -- add checksum of a string ┆ 0x04f200…09e600 20 20 20 72 65 67 69 73 74 65 72 20 63 68 61 72 20 2a 73 74 72 3b 20 72 65 67 69 73 74 65 72 20 ┆ register char *str; register ┆ 0x04f200…09e600 75 6c 6f 6e 67 20 63 72 63 3b 0a 0a 44 45 53 43 52 49 50 54 49 4f 4e 0a 20 20 20 54 68 69 73 20 ┆ulong crc; DESCRIPTION This ┆ 0x04f200…09e600 63 6f 64 65 20 63 6f 6d 70 75 74 65 73 20 61 20 33 32 2d 62 69 74 20 43 52 43 20 68 61 73 68 20 ┆code computes a 32-bit CRC hash ┆ 0x04f200…09e600 6f 66 20 61 72 74 69 63 6c 65 20 74 65 78 74 20 66 6f 72 20 61 75 74 68 65 6e 74 69 63 61 74 69 ┆of article text for authenticati┆ 0x04f200…09e600 6f 6e 0a 70 75 72 70 6f 73 65 73 2e 0a 0a 52 45 56 49 53 45 44 20 42 59 0a 20 20 20 45 72 69 63 ┆on purposes. REVISED BY Eric┆ 0x04f200…09e600 20 53 2e 20 52 61 79 6d 6f 6e 64 0a 20 20 20 54 68 69 73 20 73 6f 66 74 77 61 72 65 20 69 73 20 ┆ S. Raymond This software is ┆ 0x04f200…09e600 43 6f 70 79 72 69 67 68 74 20 28 43 29 20 31 39 38 39 20 62 79 20 45 72 69 63 20 53 2e 20 52 61 ┆Copyright (C) 1989 by Eric S. Ra┆ 0x04f200…09e600 79 6d 6f 6e 64 20 66 6f 72 20 74 68 65 20 73 6f 6c 65 20 70 75 72 70 6f 73 65 0a 6f 66 20 70 72 ┆ymond for the sole purpose of pr┆ 0x04f200…09e600 6f 74 65 63 74 69 6e 67 20 66 72 65 65 20 72 65 64 69 73 74 72 69 62 75 74 69 6f 6e 3b 20 73 65 ┆otecting free redistribution; se┆ 0x04f200…09e600 65 20 74 68 65 20 4c 49 43 45 4e 53 45 20 66 69 6c 65 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a ┆e the LICENSE file for details. ┆ 0x04f200…09e600 20 20 20 54 68 65 20 74 61 62 6c 65 20 61 6e 64 20 6d 61 63 72 6f 20 64 65 66 69 6e 69 74 69 6f ┆ The table and macro definitio┆ 0x04f200…09e600 6e 20 77 65 72 65 20 64 69 73 74 72 69 62 75 74 65 64 20 75 6e 64 65 72 20 66 6f 6c 6c 6f 77 69 ┆n were distributed under followi┆ 0x04f200…09e600 6e 67 20 63 6f 70 79 72 69 67 68 74 3a 0a 43 6f 70 79 72 69 67 68 74 20 28 43 29 20 31 39 38 36 ┆ng copyright: Copyright (C) 1986┆ 0x04f200…09e600 20 47 61 72 79 20 53 2e 20 42 72 6f 77 6e 2e 20 20 59 6f 75 20 6d 61 79 20 75 73 65 20 74 68 69 ┆ Gary S. Brown. You may use thi┆ 0x04f200…09e600 73 20 70 72 6f 67 72 61 6d 2c 20 6f 72 0a 63 6f 64 65 20 6f 72 20 74 61 62 6c 65 73 20 65 78 74 ┆s program, or code or tables ext┆ 0x04f200…09e600 72 61 63 74 65 64 20 66 72 6f 6d 20 69 74 2c 20 61 73 20 64 65 73 69 72 65 64 20 77 69 74 68 6f ┆racted from it, as desired witho┆ 0x04f200…09e600 75 74 20 72 65 73 74 72 69 63 74 69 6f 6e 2e 0a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆ut restriction. ***************┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆********************************┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a ┆******************************/ ┆ 0x04f200…09e600 2f 2a 4c 49 4e 54 4c 49 42 52 41 52 59 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 6c 69 62 70 6f 72 ┆/*LINTLIBRARY*/ #include "libpor┆ 0x04f200…09e600 74 2e 68 22 0a 0a 2f 2a 20 46 69 72 73 74 2c 20 74 68 65 20 70 6f 6c 79 6e 6f 6d 69 61 6c 20 69 ┆t.h" /* First, the polynomial i┆ 0x04f200…09e600 74 73 65 6c 66 20 61 6e 64 20 69 74 73 20 74 61 62 6c 65 20 6f 66 20 66 65 65 64 62 61 63 6b 20 ┆tself and its table of feedback ┆ 0x04f200…09e600 74 65 72 6d 73 2e 20 20 54 68 65 20 20 2a 2f 0a 2f 2a 20 70 6f 6c 79 6e 6f 6d 69 61 6c 20 69 73 ┆terms. The */ /* polynomial is┆ 0x04f200…09e600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ┆ ┆ 0x04f200…09e600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 2f 2a 20 58 5e 33 ┆ */ /* X^3┆ 0x04f200…09e600 32 2b 58 5e 32 36 2b 58 5e 32 33 2b 58 5e 32 32 2b 58 5e 31 36 2b 58 5e 31 32 2b 58 5e 31 31 2b ┆2+X^26+X^23+X^22+X^16+X^12+X^11+┆ 0x04f200…09e600 58 5e 31 30 2b 58 5e 38 2b 58 5e 37 2b 58 5e 35 2b 58 5e 34 2b 58 5e 32 2b 58 5e 31 2b 58 5e 30 ┆X^10+X^8+X^7+X^5+X^4+X^2+X^1+X^0┆ 0x04f200…09e600 20 2a 2f 0a 2f 2a 20 4e 6f 74 65 20 74 68 61 74 20 77 65 20 74 61 6b 65 20 69 74 20 22 62 61 63 ┆ */ /* Note that we take it "bac┆ 0x04f200…09e600 6b 77 61 72 64 73 22 20 61 6e 64 20 70 75 74 20 74 68 65 20 68 69 67 68 65 73 74 2d 6f 72 64 65 ┆kwards" and put the highest-orde┆ 0x04f200…09e600 72 20 74 65 72 6d 20 69 6e 20 20 2a 2f 0a 2f 2a 20 74 68 65 20 6c 6f 77 65 73 74 2d 6f 72 64 65 ┆r term in */ /* the lowest-orde┆ 0x04f200…09e600 72 20 62 69 74 2e 20 20 54 68 65 20 58 5e 33 32 20 74 65 72 6d 20 69 73 20 22 69 6d 70 6c 69 65 ┆r bit. The X^32 term is "implie┆ 0x04f200…09e600 64 22 3b 20 74 68 65 20 4c 53 42 20 69 73 20 74 68 65 20 20 20 2a 2f 0a 2f 2a 20 58 5e 33 31 20 ┆d"; the LSB is the */ /* X^31 ┆ 0x04f200…09e600 74 65 72 6d 2c 20 65 74 63 2e 20 20 54 68 65 20 58 5e 30 20 74 65 72 6d 20 28 75 73 75 61 6c 6c ┆term, etc. The X^0 term (usuall┆ 0x04f200…09e600 79 20 73 68 6f 77 6e 20 61 73 20 22 2b 31 22 29 20 72 65 73 75 6c 74 73 20 69 6e 20 20 20 20 2a ┆y shown as "+1") results in *┆ 0x04f200…09e600 2f 0a 2f 2a 20 74 68 65 20 4d 53 42 20 62 65 69 6e 67 20 31 2e 20 20 20 20 20 20 20 20 20 20 20 ┆/ /* the MSB being 1. ┆ 0x04f200…09e600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ┆ ┆ 0x04f200…09e600 20 20 20 20 20 20 20 20 20 2a 2f 0a 0a 2f 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 75 73 ┆ */ /* Note that the us┆ 0x04f200…09e600 75 61 6c 20 68 61 72 64 77 61 72 65 20 73 68 69 66 74 20 72 65 67 69 73 74 65 72 20 69 6d 70 6c ┆ual hardware shift register impl┆ 0x04f200…09e600 65 6d 65 6e 74 61 74 69 6f 6e 2c 20 77 68 69 63 68 20 20 20 2a 2f 0a 2f 2a 20 69 73 20 77 68 61 ┆ementation, which */ /* is wha┆ 0x04f200…09e600 74 20 77 65 27 72 65 20 75 73 69 6e 67 20 28 77 65 27 72 65 20 6d 65 72 65 6c 79 20 6f 70 74 69 ┆t we're using (we're merely opti┆ 0x04f200…09e600 6d 69 7a 69 6e 67 20 69 74 20 62 79 20 64 6f 69 6e 67 20 65 69 67 68 74 2d 62 69 74 20 20 2a 2f ┆mizing it by doing eight-bit */┆ 0x04f200…09e600 0a 2f 2a 20 63 68 75 6e 6b 73 20 61 74 20 61 20 74 69 6d 65 29 20 73 68 69 66 74 73 20 62 69 74 ┆ /* chunks at a time) shifts bit┆ 0x04f200…09e600 73 20 69 6e 74 6f 20 74 68 65 20 6c 6f 77 65 73 74 2d 6f 72 64 65 72 20 74 65 72 6d 2e 20 20 49 ┆s into the lowest-order term. I┆ 0x04f200…09e600 6e 20 6f 75 72 20 20 20 2a 2f 0a 2f 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2c 20 74 68 ┆n our */ /* implementation, th┆ 0x04f200…09e600 61 74 20 6d 65 61 6e 73 20 73 68 69 66 74 69 6e 67 20 74 6f 77 61 72 64 73 20 74 68 65 20 72 69 ┆at means shifting towards the ri┆ 0x04f200…09e600 67 68 74 2e 20 20 57 68 79 20 64 6f 20 77 65 20 20 20 2a 2f 0a 2f 2a 20 64 6f 20 69 74 20 74 68 ┆ght. Why do we */ /* do it th┆ 0x04f200…09e600 69 73 20 77 61 79 3f 20 20 42 65 63 61 75 73 65 20 74 68 65 20 63 61 6c 63 75 6c 61 74 65 64 20 ┆is way? Because the calculated ┆ 0x04f200…09e600 43 52 43 20 6d 75 73 74 20 62 65 20 74 72 61 6e 73 6d 69 74 74 65 64 20 69 6e 20 20 2a 2f 0a 2f ┆CRC must be transmitted in */ /┆ 0x04f200…09e600 2a 20 6f 72 64 65 72 20 66 72 6f 6d 20 68 69 67 68 65 73 74 2d 6f 72 64 65 72 20 74 65 72 6d 20 ┆* order from highest-order term ┆ 0x04f200…09e600 74 6f 20 6c 6f 77 65 73 74 2d 6f 72 64 65 72 20 74 65 72 6d 2e 20 20 55 41 52 54 73 20 74 72 61 ┆to lowest-order term. UARTs tra┆ 0x04f200…09e600 6e 73 6d 69 74 20 2a 2f 0a 2f 2a 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 6f 72 64 65 72 20 ┆nsmit */ /* characters in order ┆ 0x04f200…09e600 66 72 6f 6d 20 4c 53 42 20 74 6f 20 4d 53 42 2e 20 20 42 79 20 73 74 6f 72 69 6e 67 20 74 68 65 ┆from LSB to MSB. By storing the┆ 0x04f200…09e600 20 43 52 43 20 74 68 69 73 20 77 61 79 2c 20 20 2a 2f 0a 2f 2a 20 77 65 20 68 61 6e 64 20 69 74 ┆ CRC this way, */ /* we hand it┆ 0x04f200…09e600 20 74 6f 20 74 68 65 20 55 41 52 54 20 69 6e 20 74 68 65 20 6f 72 64 65 72 20 6c 6f 77 2d 62 79 ┆ to the UART in the order low-by┆ 0x04f200…09e600 74 65 20 74 6f 20 68 69 67 68 2d 62 79 74 65 3b 20 74 68 65 20 55 41 52 54 20 2a 2f 0a 2f 2a 20 ┆te to high-byte; the UART */ /* ┆ 0x04f200…09e600 73 65 6e 64 73 20 65 61 63 68 20 6c 6f 77 2d 62 69 74 20 74 6f 20 68 69 67 68 74 2d 62 69 74 3b ┆sends each low-bit to hight-bit;┆ 0x04f200…09e600 20 61 6e 64 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 74 72 61 6e 73 6d 69 73 73 69 6f 6e 20 ┆ and the result is transmission ┆ 0x04f200…09e600 62 69 74 20 2a 2f 0a 2f 2a 20 62 79 20 62 69 74 20 66 72 6f 6d 20 68 69 67 68 65 73 74 2d 20 74 ┆bit */ /* by bit from highest- t┆ 0x04f200…09e600 6f 20 6c 6f 77 65 73 74 2d 6f 72 64 65 72 20 74 65 72 6d 20 77 69 74 68 6f 75 74 20 72 65 71 75 ┆o lowest-order term without requ┆ 0x04f200…09e600 69 72 69 6e 67 20 61 6e 79 20 62 69 74 20 2a 2f 0a 2f 2a 20 73 68 75 66 66 6c 69 6e 67 20 6f 6e ┆iring any bit */ /* shuffling on┆ 0x04f200…09e600 20 6f 75 72 20 70 61 72 74 2e 20 20 52 65 63 65 70 74 69 6f 6e 20 77 6f 72 6b 73 20 73 69 6d 69 ┆ our part. Reception works simi┆ 0x04f200…09e600 6c 61 72 6c 79 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 0a 2f 2a 20 54 ┆larly. */ /* T┆ 0x04f200…09e600 68 65 20 66 65 65 64 62 61 63 6b 20 74 65 72 6d 73 20 74 61 62 6c 65 20 63 6f 6e 73 69 73 74 73 ┆he feedback terms table consists┆ 0x04f200…09e600 20 6f 66 20 32 35 36 2c 20 33 32 2d 62 69 74 20 65 6e 74 72 69 65 73 2e 20 20 4e 6f 74 65 73 3a ┆ of 256, 32-bit entries. Notes:┆ 0x04f200…09e600 20 20 20 2a 2f 0a 2f 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ┆ */ /* ┆ 0x04f200…09e600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ┆ ┆ 0x04f200…09e600 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 2f 2a 20 20 20 20 20 54 68 65 20 74 61 62 6c 65 ┆ */ /* The table┆ 0x04f200…09e600 20 63 61 6e 20 62 65 20 67 65 6e 65 72 61 74 65 64 20 61 74 20 72 75 6e 74 69 6d 65 20 69 66 20 ┆ can be generated at runtime if ┆ 0x04f200…09e600 64 65 73 69 72 65 64 3b 20 63 6f 64 65 20 74 6f 20 64 6f 20 73 6f 20 2a 2f 0a 2f 2a 20 20 20 20 ┆desired; code to do so */ /* ┆ 0x04f200…09e600 20 69 73 20 73 68 6f 77 6e 20 6c 61 74 65 72 2e 20 20 49 74 20 6d 69 67 68 74 20 6e 6f 74 20 62 ┆ is shown later. It might not b┆ 0x04f200…09e600 65 20 6f 62 76 69 6f 75 73 2c 20 62 75 74 20 74 68 65 20 66 65 65 64 62 61 63 6b 20 20 20 20 20 ┆e obvious, but the feedback ┆ 0x04f200…09e600 20 2a 2f 0a 2f 2a 20 20 20 20 20 74 65 72 6d 73 20 73 69 6d 70 6c 79 20 72 65 70 72 65 73 65 6e ┆ */ /* terms simply represen┆ 0x04f200…09e600 74 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 65 69 67 68 74 20 73 68 69 66 74 2f 78 6f 72 ┆t the results of eight shift/xor┆ 0x04f200…09e600 20 6f 70 65 72 61 2d 20 20 20 20 2a 2f 0a 2f 2a 20 20 20 20 20 74 69 6f 6e 73 20 66 6f 72 20 61 ┆ opera- */ /* tions for a┆ 0x04f200…09e600 6c 6c 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66 20 64 61 74 61 20 61 6e 64 20 43 52 43 20 ┆ll combinations of data and CRC ┆ 0x04f200…09e600 72 65 67 69 73 74 65 72 20 76 61 6c 75 65 73 2e 20 20 20 20 20 2a 2f 0a 2f 2a 20 20 20 20 20 20 ┆register values. */ /* ┆ 0x04f200…09e600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ┆ ┆ 0x04f200…09e600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a ┆ *┆ 0x04f200…09e600 2f 0a 2f 2a 20 20 20 20 20 54 68 65 20 76 61 6c 75 65 73 20 6d 75 73 74 20 62 65 20 72 69 67 68 ┆/ /* The values must be righ┆ 0x04f200…09e600 74 2d 73 68 69 66 74 65 64 20 62 79 20 65 69 67 68 74 20 62 69 74 73 20 62 79 20 74 68 65 20 22 ┆t-shifted by eight bits by the "┆ 0x04f200…09e600 75 70 64 63 72 63 22 20 20 2a 2f 0a 2f 2a 20 20 20 20 20 6c 6f 67 69 63 3b 20 74 68 65 20 73 68 ┆updcrc" */ /* logic; the sh┆ 0x04f200…09e600 69 66 74 20 6d 75 73 74 20 62 65 20 75 6e 73 69 67 6e 65 64 20 28 62 72 69 6e 67 20 69 6e 20 7a ┆ift must be unsigned (bring in z┆ 0x04f200…09e600 65 72 6f 65 73 29 2e 20 20 4f 6e 20 73 6f 6d 65 20 20 20 2a 2f 0a 2f 2a 20 20 20 20 20 68 61 72 ┆eroes). On some */ /* har┆ 0x04f200…09e600 64 77 61 72 65 20 79 6f 75 20 63 6f 75 6c 64 20 70 72 6f 62 61 62 6c 79 20 6f 70 74 69 6d 69 7a ┆dware you could probably optimiz┆ 0x04f200…09e600 65 20 74 68 65 20 73 68 69 66 74 20 69 6e 20 61 73 73 65 6d 62 6c 65 72 20 62 79 20 20 2a 2f 0a ┆e the shift in assembler by */ ┆ 0x04f200…09e600 2f 2a 20 20 20 20 20 75 73 69 6e 67 20 62 79 74 65 2d 73 77 61 70 20 69 6e 73 74 72 75 63 74 69 ┆/* using byte-swap instructi┆ 0x04f200…09e600 6f 6e 73 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ┆ons. ┆ 0x04f200…09e600 20 20 20 20 20 20 20 2a 2f 0a 0a 73 74 61 74 69 63 20 75 6c 6f 6e 67 20 63 72 63 5f 33 32 5f 74 ┆ */ static ulong crc_32_t┆ 0x04f200…09e600 61 62 5b 5d 20 3d 20 2f 2a 20 43 52 43 20 70 6f 6c 79 6e 6f 6d 69 61 6c 20 30 78 65 64 62 38 38 ┆ab[] = /* CRC polynomial 0xedb88┆ 0x04f200…09e600 33 32 30 20 2a 2f 0a 7b 0a 30 78 30 30 30 30 30 30 30 30 2c 20 30 78 37 37 30 37 33 30 39 36 2c ┆320 */ { 0x00000000, 0x77073096,┆ 0x04f200…09e600 20 30 78 65 65 30 65 36 31 32 63 2c 20 30 78 39 39 30 39 35 31 62 61 2c 0a 30 78 30 37 36 64 63 ┆ 0xee0e612c, 0x990951ba, 0x076dc┆ 0x04f200…09e600 34 31 39 2c 20 30 78 37 30 36 61 66 34 38 66 2c 20 30 78 65 39 36 33 61 35 33 35 2c 20 30 78 39 ┆419, 0x706af48f, 0xe963a535, 0x9┆ 0x04f200…09e600 65 36 34 39 35 61 33 2c 0a 30 78 30 65 64 62 38 38 33 32 2c 20 30 78 37 39 64 63 62 38 61 34 2c ┆e6495a3, 0x0edb8832, 0x79dcb8a4,┆ 0x04f200…09e600 20 30 78 65 30 64 35 65 39 31 65 2c 20 30 78 39 37 64 32 64 39 38 38 2c 0a 30 78 30 39 62 36 34 ┆ 0xe0d5e91e, 0x97d2d988, 0x09b64┆ 0x04f200…09e600 63 32 62 2c 20 30 78 37 65 62 31 37 63 62 64 2c 20 30 78 65 37 62 38 32 64 30 37 2c 20 30 78 39 ┆c2b, 0x7eb17cbd, 0xe7b82d07, 0x9┆ 0x04f200…09e600 30 62 66 31 64 39 31 2c 0a 30 78 31 64 62 37 31 30 36 34 2c 20 30 78 36 61 62 30 32 30 66 32 2c ┆0bf1d91, 0x1db71064, 0x6ab020f2,┆ 0x04f200…09e600 20 30 78 66 33 62 39 37 31 34 38 2c 20 30 78 38 34 62 65 34 31 64 65 2c 0a 30 78 31 61 64 61 64 ┆ 0xf3b97148, 0x84be41de, 0x1adad┆ 0x04f200…09e600 34 37 64 2c 20 30 78 36 64 64 64 65 34 65 62 2c 20 30 78 66 34 64 34 62 35 35 31 2c 20 30 78 38 ┆47d, 0x6ddde4eb, 0xf4d4b551, 0x8┆ 0x04f200…09e600 33 64 33 38 35 63 37 2c 0a 30 78 31 33 36 63 39 38 35 36 2c 20 30 78 36 34 36 62 61 38 63 30 2c ┆3d385c7, 0x136c9856, 0x646ba8c0,┆ 0x04f200…09e600 20 30 78 66 64 36 32 66 39 37 61 2c 20 30 78 38 61 36 35 63 39 65 63 2c 0a 30 78 31 34 30 31 35 ┆ 0xfd62f97a, 0x8a65c9ec, 0x14015┆ 0x04f200…09e600 63 34 66 2c 20 30 78 36 33 30 36 36 63 64 39 2c 20 30 78 66 61 30 66 33 64 36 33 2c 20 30 78 38 ┆c4f, 0x63066cd9, 0xfa0f3d63, 0x8┆ 0x04f200…09e600 64 30 38 30 64 66 35 2c 0a 30 78 33 62 36 65 32 30 63 38 2c 20 30 78 34 63 36 39 31 30 35 65 2c ┆d080df5, 0x3b6e20c8, 0x4c69105e,┆ 0x04f200…09e600 20 30 78 64 35 36 30 34 31 65 34 2c 20 30 78 61 32 36 37 37 31 37 32 2c 0a 30 78 33 63 30 33 65 ┆ 0xd56041e4, 0xa2677172, 0x3c03e┆ 0x04f200…09e600 34 64 31 2c 20 30 78 34 62 30 34 64 34 34 37 2c 20 30 78 64 32 30 64 38 35 66 64 2c 20 30 78 61 ┆4d1, 0x4b04d447, 0xd20d85fd, 0xa┆ 0x04f200…09e600 35 30 61 62 35 36 62 2c 0a 30 78 33 35 62 35 61 38 66 61 2c 20 30 78 34 32 62 32 39 38 36 63 2c ┆50ab56b, 0x35b5a8fa, 0x42b2986c,┆ 0x04f200…09e600 20 30 78 64 62 62 62 63 39 64 36 2c 20 30 78 61 63 62 63 66 39 34 30 2c 0a 30 78 33 32 64 38 36 ┆ 0xdbbbc9d6, 0xacbcf940, 0x32d86┆ 0x04f200…09e600 63 65 33 2c 20 30 78 34 35 64 66 35 63 37 35 2c 20 30 78 64 63 64 36 30 64 63 66 2c 20 30 78 61 ┆ce3, 0x45df5c75, 0xdcd60dcf, 0xa┆ 0x04f200…09e600 62 64 31 33 64 35 39 2c 0a 30 78 32 36 64 39 33 30 61 63 2c 20 30 78 35 31 64 65 30 30 33 61 2c ┆bd13d59, 0x26d930ac, 0x51de003a,┆ 0x04f200…09e600 20 30 78 63 38 64 37 35 31 38 30 2c 20 30 78 62 66 64 30 36 31 31 36 2c 0a 30 78 32 31 62 34 66 ┆ 0xc8d75180, 0xbfd06116, 0x21b4f┆ 0x04f200…09e600 34 62 35 2c 20 30 78 35 36 62 33 63 34 32 33 2c 20 30 78 63 66 62 61 39 35 39 39 2c 20 30 78 62 ┆4b5, 0x56b3c423, 0xcfba9599, 0xb┆ 0x04f200…09e600 38 62 64 61 35 30 66 2c 0a 30 78 32 38 30 32 62 38 39 65 2c 20 30 78 35 66 30 35 38 38 30 38 2c ┆8bda50f, 0x2802b89e, 0x5f058808,┆ 0x04f200…09e600 20 30 78 63 36 30 63 64 39 62 32 2c 20 30 78 62 31 30 62 65 39 32 34 2c 0a 30 78 32 66 36 66 37 ┆ 0xc60cd9b2, 0xb10be924, 0x2f6f7┆ 0x04f200…09e600 63 38 37 2c 20 30 78 35 38 36 38 34 63 31 31 2c 20 30 78 63 31 36 31 31 64 61 62 2c 20 30 78 62 ┆c87, 0x58684c11, 0xc1611dab, 0xb┆ 0x04f200…09e600 36 36 36 32 64 33 64 2c 0a 30 78 37 36 64 63 34 31 39 30 2c 20 30 78 30 31 64 62 37 31 30 36 2c ┆6662d3d, 0x76dc4190, 0x01db7106,┆ 0x04f200…09e600 20 30 78 39 38 64 32 32 30 62 63 2c 20 30 78 65 66 64 35 31 30 32 61 2c 0a 30 78 37 31 62 31 38 ┆ 0x98d220bc, 0xefd5102a, 0x71b18┆ 0x04f200…09e600 35 38 39 2c 20 30 78 30 36 62 36 62 35 31 66 2c 20 30 78 39 66 62 66 65 34 61 35 2c 20 30 78 65 ┆589, 0x06b6b51f, 0x9fbfe4a5, 0xe┆ 0x04f200…09e600 38 62 38 64 34 33 33 2c 0a 30 78 37 38 30 37 63 39 61 32 2c 20 30 78 30 66 30 30 66 39 33 34 2c ┆8b8d433, 0x7807c9a2, 0x0f00f934,┆ 0x04f200…09e600 20 30 78 39 36 30 39 61 38 38 65 2c 20 30 78 65 31 30 65 39 38 31 38 2c 0a 30 78 37 66 36 61 30 ┆ 0x9609a88e, 0xe10e9818, 0x7f6a0┆ 0x04f200…09e600 64 62 62 2c 20 30 78 30 38 36 64 33 64 32 64 2c 20 30 78 39 31 36 34 36 63 39 37 2c 20 30 78 65 ┆dbb, 0x086d3d2d, 0x91646c97, 0xe┆ 0x04f200…09e600 36 36 33 35 63 30 31 2c 0a 30 78 36 62 36 62 35 31 66 34 2c 20 30 78 31 63 36 63 36 31 36 32 2c ┆6635c01, 0x6b6b51f4, 0x1c6c6162,┆ 0x04f200…09e600 20 30 78 38 35 36 35 33 30 64 38 2c 20 30 78 66 32 36 32 30 30 34 65 2c 0a 30 78 36 63 30 36 39 ┆ 0x856530d8, 0xf262004e, 0x6c069┆ 0x04f200…09e600 35 65 64 2c 20 30 78 31 62 30 31 61 35 37 62 2c 20 30 78 38 32 30 38 66 34 63 31 2c 20 30 78 66 ┆5ed, 0x1b01a57b, 0x8208f4c1, 0xf┆ 0x04f200…09e600 35 30 66 63 34 35 37 2c 0a 30 78 36 35 62 30 64 39 63 36 2c 20 30 78 31 32 62 37 65 39 35 30 2c ┆50fc457, 0x65b0d9c6, 0x12b7e950,┆ 0x04f200…09e600 20 30 78 38 62 62 65 62 38 65 61 2c 20 30 78 66 63 62 39 38 38 37 63 2c 0a 30 78 36 32 64 64 31 ┆ 0x8bbeb8ea, 0xfcb9887c, 0x62dd1┆ 0x04f200…09e600 64 64 66 2c 20 30 78 31 35 64 61 32 64 34 39 2c 20 30 78 38 63 64 33 37 63 66 33 2c 20 30 78 66 ┆ddf, 0x15da2d49, 0x8cd37cf3, 0xf┆ 0x04f200…09e600 62 64 34 34 63 36 35 2c 0a 30 78 34 64 62 32 36 31 35 38 2c 20 30 78 33 61 62 35 35 31 63 65 2c ┆bd44c65, 0x4db26158, 0x3ab551ce,┆ 0x04f200…09e600 20 30 78 61 33 62 63 30 30 37 34 2c 20 30 78 64 34 62 62 33 30 65 32 2c 0a 30 78 34 61 64 66 61 ┆ 0xa3bc0074, 0xd4bb30e2, 0x4adfa┆ 0x04f200…09e600 35 34 31 2c 20 30 78 33 64 64 38 39 35 64 37 2c 20 30 78 61 34 64 31 63 34 36 64 2c 20 30 78 64 ┆541, 0x3dd895d7, 0xa4d1c46d, 0xd┆ 0x04f200…09e600 33 64 36 66 34 66 62 2c 0a 30 78 34 33 36 39 65 39 36 61 2c 20 30 78 33 34 36 65 64 39 66 63 2c ┆3d6f4fb, 0x4369e96a, 0x346ed9fc,┆ 0x04f200…09e600 20 30 78 61 64 36 37 38 38 34 36 2c 20 30 78 64 61 36 30 62 38 64 30 2c 0a 30 78 34 34 30 34 32 ┆ 0xad678846, 0xda60b8d0, 0x44042┆ 0x04f200…09e600 64 37 33 2c 20 30 78 33 33 30 33 31 64 65 35 2c 20 30 78 61 61 30 61 34 63 35 66 2c 20 30 78 64 ┆d73, 0x33031de5, 0xaa0a4c5f, 0xd┆ 0x04f200…09e600 64 30 64 37 63 63 39 2c 0a 30 78 35 30 30 35 37 31 33 63 2c 20 30 78 32 37 30 32 34 31 61 61 2c ┆d0d7cc9, 0x5005713c, 0x270241aa,┆ 0x04f200…09e600 20 30 78 62 65 30 62 31 30 31 30 2c 20 30 78 63 39 30 63 32 30 38 36 2c 0a 30 78 35 37 36 38 62 ┆ 0xbe0b1010, 0xc90c2086, 0x5768b┆ 0x04f200…09e600 35 32 35 2c 20 30 78 32 30 36 66 38 35 62 33 2c 20 30 78 62 39 36 36 64 34 30 39 2c 20 30 78 63 ┆525, 0x206f85b3, 0xb966d409, 0xc┆ 0x04f200…09e600 65 36 31 65 34 39 66 2c 0a 30 78 35 65 64 65 66 39 30 65 2c 20 30 78 32 39 64 39 63 39 39 38 2c ┆e61e49f, 0x5edef90e, 0x29d9c998,┆ 0x04f200…09e600 20 30 78 62 30 64 30 39 38 32 32 2c 20 30 78 63 37 64 37 61 38 62 34 2c 0a 30 78 35 39 62 33 33 ┆ 0xb0d09822, 0xc7d7a8b4, 0x59b33┆ 0x04f200…09e600 64 31 37 2c 20 30 78 32 65 62 34 30 64 38 31 2c 20 30 78 62 37 62 64 35 63 33 62 2c 20 30 78 63 ┆d17, 0x2eb40d81, 0xb7bd5c3b, 0xc┆ 0x04f200…09e600 30 62 61 36 63 61 64 2c 0a 30 78 65 64 62 38 38 33 32 30 2c 20 30 78 39 61 62 66 62 33 62 36 2c ┆0ba6cad, 0xedb88320, 0x9abfb3b6,┆ 0x04f200…09e600 20 30 78 30 33 62 36 65 32 30 63 2c 20 30 78 37 34 62 31 64 32 39 61 2c 0a 30 78 65 61 64 35 34 ┆ 0x03b6e20c, 0x74b1d29a, 0xead54┆ 0x04f200…09e600 37 33 39 2c 20 30 78 39 64 64 32 37 37 61 66 2c 20 30 78 30 34 64 62 32 36 31 35 2c 20 30 78 37 ┆739, 0x9dd277af, 0x04db2615, 0x7┆ 0x04f200…09e600 33 64 63 31 36 38 33 2c 0a 30 78 65 33 36 33 30 62 31 32 2c 20 30 78 39 34 36 34 33 62 38 34 2c ┆3dc1683, 0xe3630b12, 0x94643b84,┆ 0x04f200…09e600 20 30 78 30 64 36 64 36 61 33 65 2c 20 30 78 37 61 36 61 35 61 61 38 2c 0a 30 78 65 34 30 65 63 ┆ 0x0d6d6a3e, 0x7a6a5aa8, 0xe40ec┆ 0x04f200…09e600 66 30 62 2c 20 30 78 39 33 30 39 66 66 39 64 2c 20 30 78 30 61 30 30 61 65 32 37 2c 20 30 78 37 ┆f0b, 0x9309ff9d, 0x0a00ae27, 0x7┆ 0x04f200…09e600 64 30 37 39 65 62 31 2c 0a 30 78 66 30 30 66 39 33 34 34 2c 20 30 78 38 37 30 38 61 33 64 32 2c ┆d079eb1, 0xf00f9344, 0x8708a3d2,┆ 0x04f200…09e600 20 30 78 31 65 30 31 66 32 36 38 2c 20 30 78 36 39 30 36 63 32 66 65 2c 0a 30 78 66 37 36 32 35 ┆ 0x1e01f268, 0x6906c2fe, 0xf7625┆ 0x04f200…09e600 37 35 64 2c 20 30 78 38 30 36 35 36 37 63 62 2c 20 30 78 31 39 36 63 33 36 37 31 2c 20 30 78 36 ┆75d, 0x806567cb, 0x196c3671, 0x6┆ 0x04f200…09e600 65 36 62 30 36 65 37 2c 0a 30 78 66 65 64 34 31 62 37 36 2c 20 30 78 38 39 64 33 32 62 65 30 2c ┆e6b06e7, 0xfed41b76, 0x89d32be0,┆ 0x04f200…09e600 20 30 78 31 30 64 61 37 61 35 61 2c 20 30 78 36 37 64 64 34 61 63 63 2c 0a 30 78 66 39 62 39 64 ┆ 0x10da7a5a, 0x67dd4acc, 0xf9b9d┆ 0x04f200…09e600 66 36 66 2c 20 30 78 38 65 62 65 65 66 66 39 2c 20 30 78 31 37 62 37 62 65 34 33 2c 20 30 78 36 ┆f6f, 0x8ebeeff9, 0x17b7be43, 0x6┆ 0x04f200…09e600 30 62 30 38 65 64 35 2c 0a 30 78 64 36 64 36 61 33 65 38 2c 20 30 78 61 31 64 31 39 33 37 65 2c ┆0b08ed5, 0xd6d6a3e8, 0xa1d1937e,┆ 0x04f200…09e600 20 30 78 33 38 64 38 63 32 63 34 2c 20 30 78 34 66 64 66 66 32 35 32 2c 0a 30 78 64 31 62 62 36 ┆ 0x38d8c2c4, 0x4fdff252, 0xd1bb6┆ 0x04f200…09e600 37 66 31 2c 20 30 78 61 36 62 63 35 37 36 37 2c 20 30 78 33 66 62 35 30 36 64 64 2c 20 30 78 34 ┆7f1, 0xa6bc5767, 0x3fb506dd, 0x4┆ 0x04f200…09e600 38 62 32 33 36 34 62 2c 0a 30 78 64 38 30 64 32 62 64 61 2c 20 30 78 61 66 30 61 31 62 34 63 2c ┆8b2364b, 0xd80d2bda, 0xaf0a1b4c,┆ 0x04f200…09e600 20 30 78 33 36 30 33 34 61 66 36 2c 20 30 78 34 31 30 34 37 61 36 30 2c 0a 30 78 64 66 36 30 65 ┆ 0x36034af6, 0x41047a60, 0xdf60e┆ 0x04f200…09e600 66 63 33 2c 20 30 78 61 38 36 37 64 66 35 35 2c 20 30 78 33 31 36 65 38 65 65 66 2c 20 30 78 34 ┆fc3, 0xa867df55, 0x316e8eef, 0x4┆ 0x04f200…09e600 36 36 39 62 65 37 39 2c 0a 30 78 63 62 36 31 62 33 38 63 2c 20 30 78 62 63 36 36 38 33 31 61 2c ┆669be79, 0xcb61b38c, 0xbc66831a,┆ 0x04f200…09e600 20 30 78 32 35 36 66 64 32 61 30 2c 20 30 78 35 32 36 38 65 32 33 36 2c 0a 30 78 63 63 30 63 37 ┆ 0x256fd2a0, 0x5268e236, 0xcc0c7┆ 0x04f200…09e600 37 39 35 2c 20 30 78 62 62 30 62 34 37 30 33 2c 20 30 78 32 32 30 32 31 36 62 39 2c 20 30 78 35 ┆795, 0xbb0b4703, 0x220216b9, 0x5┆ 0x04f200…09e600 35 30 35 32 36 32 66 2c 0a 30 78 63 35 62 61 33 62 62 65 2c 20 30 78 62 32 62 64 30 62 32 38 2c ┆505262f, 0xc5ba3bbe, 0xb2bd0b28,┆ 0x04f200…09e600 20 30 78 32 62 62 34 35 61 39 32 2c 20 30 78 35 63 62 33 36 61 30 34 2c 0a 30 78 63 32 64 37 66 ┆ 0x2bb45a92, 0x5cb36a04, 0xc2d7f┆ 0x04f200…09e600 66 61 37 2c 20 30 78 62 35 64 30 63 66 33 31 2c 20 30 78 32 63 64 39 39 65 38 62 2c 20 30 78 35 ┆fa7, 0xb5d0cf31, 0x2cd99e8b, 0x5┆ 0x04f200…09e600 62 64 65 61 65 31 64 2c 0a 30 78 39 62 36 34 63 32 62 30 2c 20 30 78 65 63 36 33 66 32 32 36 2c ┆bdeae1d, 0x9b64c2b0, 0xec63f226,┆ 0x04f200…09e600 20 30 78 37 35 36 61 61 33 39 63 2c 20 30 78 30 32 36 64 39 33 30 61 2c 0a 30 78 39 63 30 39 30 ┆ 0x756aa39c, 0x026d930a, 0x9c090┆ 0x04f200…09e600 36 61 39 2c 20 30 78 65 62 30 65 33 36 33 66 2c 20 30 78 37 32 30 37 36 37 38 35 2c 20 30 78 30 ┆6a9, 0xeb0e363f, 0x72076785, 0x0┆ 0x04f200…09e600 35 30 30 35 37 31 33 2c 0a 30 78 39 35 62 66 34 61 38 32 2c 20 30 78 65 32 62 38 37 61 31 34 2c ┆5005713, 0x95bf4a82, 0xe2b87a14,┆ 0x04f200…09e600 20 30 78 37 62 62 31 32 62 61 65 2c 20 30 78 30 63 62 36 31 62 33 38 2c 0a 30 78 39 32 64 32 38 ┆ 0x7bb12bae, 0x0cb61b38, 0x92d28┆ 0x04f200…09e600 65 39 62 2c 20 30 78 65 35 64 35 62 65 30 64 2c 20 30 78 37 63 64 63 65 66 62 37 2c 20 30 78 30 ┆e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0┆ 0x04f200…09e600 62 64 62 64 66 32 31 2c 0a 30 78 38 36 64 33 64 32 64 34 2c 20 30 78 66 31 64 34 65 32 34 32 2c ┆bdbdf21, 0x86d3d2d4, 0xf1d4e242,┆ 0x04f200…09e600 20 30 78 36 38 64 64 62 33 66 38 2c 20 30 78 31 66 64 61 38 33 36 65 2c 0a 30 78 38 31 62 65 31 ┆ 0x68ddb3f8, 0x1fda836e, 0x81be1┆ 0x04f200…09e600 36 63 64 2c 20 30 78 66 36 62 39 32 36 35 62 2c 20 30 78 36 66 62 30 37 37 65 31 2c 20 30 78 31 ┆6cd, 0xf6b9265b, 0x6fb077e1, 0x1┆ 0x04f200…09e600 38 62 37 34 37 37 37 2c 0a 30 78 38 38 30 38 35 61 65 36 2c 20 30 78 66 66 30 66 36 61 37 30 2c ┆8b74777, 0x88085ae6, 0xff0f6a70,┆ 0x04f200…09e600 20 30 78 36 36 30 36 33 62 63 61 2c 20 30 78 31 31 30 31 30 62 35 63 2c 0a 30 78 38 66 36 35 39 ┆ 0x66063bca, 0x11010b5c, 0x8f659┆ 0x04f200…09e600 65 66 66 2c 20 30 78 66 38 36 32 61 65 36 39 2c 20 30 78 36 31 36 62 66 66 64 33 2c 20 30 78 31 ┆eff, 0xf862ae69, 0x616bffd3, 0x1┆ 0x04f200…09e600 36 36 63 63 66 34 35 2c 0a 30 78 61 30 30 61 65 32 37 38 2c 20 30 78 64 37 30 64 64 32 65 65 2c ┆66ccf45, 0xa00ae278, 0xd70dd2ee,┆ 0x04f200…09e600 20 30 78 34 65 30 34 38 33 35 34 2c 20 30 78 33 39 30 33 62 33 63 32 2c 0a 30 78 61 37 36 37 32 ┆ 0x4e048354, 0x3903b3c2, 0xa7672┆ 0x04f200…09e600 36 36 31 2c 20 30 78 64 30 36 30 31 36 66 37 2c 20 30 78 34 39 36 39 34 37 34 64 2c 20 30 78 33 ┆661, 0xd06016f7, 0x4969474d, 0x3┆ 0x04f200…09e600 65 36 65 37 37 64 62 2c 0a 30 78 61 65 64 31 36 61 34 61 2c 20 30 78 64 39 64 36 35 61 64 63 2c ┆e6e77db, 0xaed16a4a, 0xd9d65adc,┆ 0x04f200…09e600 20 30 78 34 30 64 66 30 62 36 36 2c 20 30 78 33 37 64 38 33 62 66 30 2c 0a 30 78 61 39 62 63 61 ┆ 0x40df0b66, 0x37d83bf0, 0xa9bca┆ 0x04f200…09e600 65 35 33 2c 20 30 78 64 65 62 62 39 65 63 35 2c 20 30 78 34 37 62 32 63 66 37 66 2c 20 30 78 33 ┆e53, 0xdebb9ec5, 0x47b2cf7f, 0x3┆ 0x04f200…09e600 30 62 35 66 66 65 39 2c 0a 30 78 62 64 62 64 66 32 31 63 2c 20 30 78 63 61 62 61 63 32 38 61 2c ┆0b5ffe9, 0xbdbdf21c, 0xcabac28a,┆ 0x04f200…09e600 20 30 78 35 33 62 33 39 33 33 30 2c 20 30 78 32 34 62 34 61 33 61 36 2c 0a 30 78 62 61 64 30 33 ┆ 0x53b39330, 0x24b4a3a6, 0xbad03┆ 0x04f200…09e600 36 30 35 2c 20 30 78 63 64 64 37 30 36 39 33 2c 20 30 78 35 34 64 65 35 37 32 39 2c 20 30 78 32 ┆605, 0xcdd70693, 0x54de5729, 0x2┆ 0x04f200…09e600 33 64 39 36 37 62 66 2c 0a 30 78 62 33 36 36 37 61 32 65 2c 20 30 78 63 34 36 31 34 61 62 38 2c ┆3d967bf, 0xb3667a2e, 0xc4614ab8,┆ 0x04f200…09e600 20 30 78 35 64 36 38 31 62 30 32 2c 20 30 78 32 61 36 66 32 62 39 34 2c 0a 30 78 62 34 30 62 62 ┆ 0x5d681b02, 0x2a6f2b94, 0xb40bb┆ 0x04f200…09e600 65 33 37 2c 20 30 78 63 33 30 63 38 65 61 31 2c 20 30 78 35 61 30 35 64 66 31 62 2c 20 30 78 32 ┆e37, 0xc30c8ea1, 0x5a05df1b, 0x2┆ 0x04f200…09e600 64 30 32 65 66 38 64 2c 0a 7d 3b 0a 0a 23 64 65 66 69 6e 65 20 55 50 44 43 33 32 28 6f 63 74 65 ┆d02ef8d, }; #define UPDC32(octe┆ 0x04f200…09e600 74 2c 63 72 63 29 20 28 63 72 63 5f 33 32 5f 74 61 62 5b 28 28 63 72 63 29 20 5e 20 28 6f 63 74 ┆t,crc) (crc_32_tab[((crc) ^ (oct┆ 0x04f200…09e600 65 74 29 29 20 26 20 30 78 66 66 5d 20 5e 20 28 28 63 72 63 29 20 3e 3e 20 38 29 29 0a 0a 75 6c ┆et)) & 0xff] ^ ((crc) >> 8)) ul┆ 0x04f200…09e600 6f 6e 67 20 63 68 65 63 6b 73 75 6d 28 66 70 2c 20 6c 65 6e 29 0a 46 49 4c 45 20 2a 66 70 3b 20 ┆ong checksum(fp, len) FILE *fp; ┆ 0x04f200…09e600 75 6c 6f 6e 67 20 6c 65 6e 3b 0a 7b 0a 20 20 20 20 75 6c 6f 6e 67 09 63 72 63 20 3d 20 30 3b 0a ┆ulong len; { ulong crc = 0; ┆ 0x04f200…09e600 0a 20 20 20 20 2f 2a 20 63 6f 6d 70 75 74 65 20 63 68 65 63 6b 73 75 6d 20 75 6e 74 69 6c 20 77 ┆ /* compute checksum until w┆ 0x04f200…09e600 65 20 72 75 6e 20 6f 75 74 20 6f 66 20 6c 65 6e 67 74 68 2c 20 6f 72 20 6f 75 74 20 6f 66 20 69 ┆e run out of length, or out of i┆ 0x04f200…09e600 6e 70 75 74 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 20 28 21 66 65 6f 66 28 66 70 29 20 26 26 20 ┆nput */ while (!feof(fp) && ┆ 0x04f200…09e600 28 6c 65 6e 20 3d 3d 20 30 20 7c 7c 20 6c 65 6e 2d 2d 20 3e 20 30 29 29 0a 09 63 72 63 20 3d 20 ┆(len == 0 || len-- > 0)) crc = ┆ 0x04f200…09e600 55 50 44 43 33 32 28 66 67 65 74 63 28 66 70 29 2c 20 63 72 63 29 3b 0a 0a 20 20 20 20 72 65 74 ┆UPDC32(fgetc(fp), crc); ret┆ 0x04f200…09e600 75 72 6e 28 63 72 63 29 3b 0a 7d 0a 0a 75 6c 6f 6e 67 20 63 68 65 63 6b 73 74 72 69 6e 67 28 73 ┆urn(crc); } ulong checkstring(s┆ 0x04f200…09e600 74 72 2c 20 63 72 63 29 0a 72 65 67 69 73 74 65 72 20 63 68 61 72 09 2a 73 74 72 3b 0a 72 65 67 ┆tr, crc) register char *str; reg┆ 0x04f200…09e600 69 73 74 65 72 20 75 6c 6f 6e 67 09 63 72 63 3b 0a 7b 0a 20 20 20 20 66 6f 72 20 28 3b 20 2a 73 ┆ister ulong crc; { for (; *s┆ 0x04f200…09e600 74 72 3b 20 73 74 72 2b 2b 29 0a 09 63 72 63 20 3d 20 55 50 44 43 33 32 28 2a 73 74 72 2c 20 63 ┆tr; str++) crc = UPDC32(*str, c┆ 0x04f200…09e600 72 63 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 28 63 72 63 29 3b 0a 7d 0a 0a 2f 2a 20 63 68 65 63 ┆rc); return(crc); } /* chec┆ 0x04f200…09e600 6b 73 75 6d 2e 63 20 65 6e 64 73 20 68 65 72 65 20 2a 2f 0a 61 30 35 64 66 31 62 2c 20 30 78 32 ┆ksum.c ends here */ a05df1b, 0x2┆ 0x04f200…09e600 64 30 32 65 66 38 64 2c 0a 7d 3b 0a 0a 23 64 65 66 69 6e 65 20 55 50 44 43 33 32 28 6f 63 74 65 ┆d02ef8d, }; #define UPDC32(octe┆ 0x04f200…09e600 74 2c 63 72 63 29 20 28 63 72 63 5f 33 32 5f 74 61 62 5b 28 28 63 72 63 29 20 5e 20 28 6f 63 74 ┆t,crc) (crc_32_tab[((crc) ^ (oct┆ 0x04f200…09e600 65 74 29 29 20 26 20 30 78 66 66 5d 20 5e 20 28 28 63 72 63 29 20 3e 3e 20 38 29 29 0a 0a 75 6c ┆et)) & 0xff] ^ ((crc) >> 8)) ul┆ 0x04f200…09e600 6f 6e 67 20 63 68 65 63 6b 73 75 6d 28 66 70 2c 20 6c 65 6e 29 0a 46 49 4c 45 20 2a 66 70 3b 20 ┆ong checksum(fp, len) FILE *fp; ┆ 0x04f200…09e600 75 6c 6f 6e 67 20 6c 65 6e 3b 0a 7b 0a 20 20 20 20 75 6c 6f 6e 67 09 63 72 63 20 3d 20 30 3b 0a ┆ulong len; { ulong crc = 0; ┆ 0x04f200…09e600 0a 20 20 20 20 2f 2a 20 63 6f 6d 70 75 74 65 20 63 68 65 63 6b 73 75 6d 20 75 6e 74 69 6c 20 77 ┆ /* compute checksum until w┆ 0x04f200…09e600 65 20 72 75 6e 20 6f 75 74 20 6f 66 20 6c 65 6e 67 74 68 2c 20 6f 72 20 6f 75 74 20 6f 66 20 69 ┆e run out of length, or out of i┆ 0x04f200…09e600 6e 70 75 74 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 20 28 21 66 65 6f 66 28 66 70 29 20 26 26 20 ┆nput */ while (!feof(fp) && ┆ 0x04f200…09e600 28 6c 65 6e 20 3d 3d 20 30 20 7c 7c 20 6c 65 6e 2d 2d 20 3e 20 30 29 29 0a 09 63 72 63 20 3d 20 ┆(len == 0 || len-- > 0)) crc = ┆ 0x04f200…09e600 55 50 44 43 33 32 28 66 67 65 74 63 28 66 70 29 2c 20 63 72 63 29 3b 0a 0a 20 20 20 20 72 65 74 ┆UPDC32(fgetc(fp), crc); ret┆ 0x04f200…09e600 75 72 6e 28 63 72 63 29 3b 0a 7d 0a 0a 75 6c 6f 6e 67 20 63 68 65 63 6b 73 74 72 69 6e 67 28 73 ┆urn(crc); } ulong checkstring(s┆ 0x04f200…09e600 74 72 2c 20 63 72 63 29 0a 72 65 67 69 73 74 65 72 20 63 68 61 72 09 2a 73 74 72 3b 0a 72 65 67 ┆tr, crc) register char *str; reg┆ 0x04f200…09e600 69 73 74 65 72 20 75 6c 6f 6e 67 09 63 72 63 3b 0a 73 72 63 2f 44 2e 70 6f 72 74 2f 64 62 61 6c ┆ister ulong crc; src/D.port/dbal┆ 0x04f200…09e600 6c 6f 63 2e 63 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆loc.c ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆ ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 20 20 20 34 34 34 20 00 20 20 20 ┆ 444 ┆ 0x04f200…09e600 31 34 35 20 00 20 20 20 20 20 31 20 00 20 20 20 20 20 20 31 32 35 32 35 20 20 34 34 35 36 31 35 ┆145 1 12525 445615┆ 0x04f200…09e600 34 30 35 32 20 20 20 37 36 31 31 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆4052 7611 ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆ ┆ […0x9…] 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆ /**************┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆********************************┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 0a ┆****************************** ┆ 0x04f200…09e600 4e 41 4d 45 0a 20 20 20 64 62 61 6c 6c 6f 63 2e 63 20 2d 2d 20 67 65 6e 65 72 69 63 20 61 6c 6c ┆NAME dballoc.c -- generic all┆ 0x04f200…09e600 6f 63 61 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 0a 0a 53 59 4e 4f 50 53 49 53 0a 20 20 20 63 68 ┆ocation routines SYNOPSIS ch┆ 0x04f200…09e600 61 72 20 2a 64 62 61 6c 6c 6f 63 28 64 62 29 09 20 20 20 20 2d 2d 20 65 6e 74 65 72 20 61 20 6e ┆ar *dballoc(db) -- enter a n┆ 0x04f200…09e600 65 77 20 72 65 63 6f 72 64 2c 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 69 74 ┆ew record, allocate space for it┆ 0x04f200…09e600 0a 20 20 20 64 62 64 65 66 5f 74 20 2a 64 62 3b 0a 0a 20 20 20 76 6f 69 64 20 64 62 61 65 6e 74 ┆ dbdef_t *db; void dbaent┆ 0x04f200…09e600 65 72 28 64 62 2c 20 64 70 29 20 20 20 20 2d 2d 20 65 6e 74 65 72 20 61 6e 20 69 74 65 6d 20 69 ┆er(db, dp) -- enter an item i┆ 0x04f200…09e600 6e 74 6f 20 74 68 65 20 74 61 62 6c 65 0a 20 20 20 64 62 64 65 66 5f 74 20 2a 64 62 3b 20 63 68 ┆nto the table dbdef_t *db; ch┆ 0x04f200…09e600 61 72 20 2a 64 70 3b 0a 0a 20 20 20 69 6e 74 20 64 62 61 6e 65 78 74 28 64 62 29 09 20 20 20 20 ┆ar *dp; int dbanext(db) ┆ 0x04f200…09e600 2d 2d 20 61 64 76 61 6e 63 65 20 74 68 65 20 63 75 72 72 65 6e 74 2d 72 65 63 6f 72 64 20 70 6f ┆-- advance the current-record po┆ 0x04f200…09e600 69 6e 74 65 72 0a 20 20 20 64 62 64 65 66 5f 74 20 2a 64 62 3b 0a 0a 20 20 20 63 68 61 72 20 2a ┆inter dbdef_t *db; char *┆ 0x04f200…09e600 64 62 61 66 69 6e 64 28 64 62 2c 20 6e 61 6d 65 2c 20 63 6d 70 66 75 6e 29 09 2d 2d 20 66 69 6e ┆dbafind(db, name, cmpfun) -- fin┆ 0x04f200…09e600 64 20 61 20 6e 61 6d 65 64 20 65 6e 74 72 79 0a 20 20 20 64 62 64 65 66 5f 74 20 2a 64 62 3b 20 ┆d a named entry dbdef_t *db; ┆ 0x04f200…09e600 63 68 61 72 20 2a 6e 61 6d 65 3b 20 62 6f 6f 6c 20 28 2a 63 6d 70 66 75 6e 29 28 29 3b 0a 0a 20 ┆char *name; bool (*cmpfun)(); ┆ 0x04f200…09e600 20 20 69 6e 74 20 64 62 61 72 65 77 69 6e 64 28 64 62 29 09 20 20 20 20 2d 2d 20 72 65 73 65 74 ┆ int dbarewind(db) -- reset┆ 0x04f200…09e600 20 74 68 65 20 63 75 72 72 65 6e 74 2d 72 65 63 6f 72 64 20 70 6f 69 6e 74 65 72 0a 20 20 20 64 ┆ the current-record pointer d┆ 0x04f200…09e600 62 64 65 66 5f 74 20 2a 64 62 3b 0a 0a 20 20 20 69 6e 74 20 64 62 61 72 65 61 64 28 64 62 29 09 ┆bdef_t *db; int dbaread(db) ┆ 0x04f200…09e600 20 20 20 20 2d 2d 20 72 65 61 64 20 61 20 64 61 74 61 62 61 73 65 20 69 6e 20 66 72 6f 6d 20 69 ┆ -- read a database in from i┆ 0x04f200…09e600 74 73 20 66 69 6c 65 0a 20 20 20 64 62 64 65 66 5f 74 20 2a 64 62 3b 0a 0a 20 20 20 69 6e 74 20 ┆ts file dbdef_t *db; int ┆ 0x04f200…09e600 64 62 61 64 75 6d 70 28 64 62 2c 20 66 70 29 09 20 20 20 20 2d 2d 20 64 75 6d 70 20 74 68 65 20 ┆dbadump(db, fp) -- dump the ┆ 0x04f200…09e600 65 78 74 65 72 6e 61 6c 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 20 64 61 74 ┆external representation of a dat┆ 0x04f200…09e600 61 62 61 73 65 0a 20 20 20 64 62 64 65 66 5f 74 20 2a 64 62 3b 0a 20 20 20 46 49 4c 45 20 2a 66 ┆abase dbdef_t *db; FILE *f┆ 0x04f200…09e600 70 3b 0a 0a 20 20 20 76 6f 69 64 20 64 62 61 77 72 69 74 65 28 64 62 29 09 20 20 20 20 2d 2d 20 ┆p; void dbawrite(db) -- ┆ 0x04f200…09e600 77 72 69 74 65 20 74 68 65 20 77 68 6f 6c 65 20 64 61 74 61 62 61 73 65 20 6f 75 74 20 74 6f 20 ┆write the whole database out to ┆ 0x04f200…09e600 64 69 73 6b 0a 20 20 20 64 62 64 65 66 5f 74 20 2a 64 62 3b 0a 0a 20 20 20 62 6f 6f 6c 20 73 74 ┆disk dbdef_t *db; bool st┆ 0x04f200…09e600 72 65 71 28 73 2c 20 74 29 20 20 20 20 20 20 20 20 20 2d 2d 20 73 74 72 69 6e 67 20 65 71 75 61 ┆req(s, t) -- string equa┆ 0x04f200…09e600 6c 69 74 79 20 74 65 73 74 20 28 66 6f 72 20 75 73 65 20 69 6e 20 64 62 61 66 69 6e 64 29 0a 20 ┆lity test (for use in dbafind) ┆ 0x04f200…09e600 20 20 63 68 61 72 20 2a 73 2c 20 2a 74 3b 0a 0a 44 45 53 43 52 49 50 54 49 4f 4e 0a 20 20 20 54 ┆ char *s, *t; DESCRIPTION T┆ 0x04f200…09e600 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 70 72 6f 76 69 64 65 20 74 68 65 20 72 75 64 69 6d 65 ┆hese routines provide the rudime┆ 0x04f200…09e600 6e 74 73 20 6f 66 20 61 6e 20 69 6e 2d 63 6f 72 65 20 64 61 74 61 62 61 73 65 20 66 61 63 69 6c ┆nts of an in-core database facil┆ 0x04f200…09e600 69 74 79 20 66 6f 72 0a 61 6e 20 61 72 62 69 74 72 61 72 79 20 6e 75 6d 62 65 72 20 6f 66 20 72 ┆ity for an arbitrary number of r┆ 0x04f200…09e600 65 63 6f 72 64 73 20 6f 66 20 73 6f 6d 65 20 66 69 78 65 64 20 6c 65 6e 67 74 68 2e 20 53 65 71 ┆ecords of some fixed length. Seq┆ 0x04f200…09e600 75 65 6e 74 69 61 6c 20 61 6e 64 20 62 79 2d 6e 61 6d 65 0a 61 63 63 65 73 73 20 61 72 65 20 73 ┆uential and by-name access are s┆ 0x04f200…09e600 75 70 70 6f 72 74 65 64 20 28 6e 61 6d 65 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 62 65 20 ┆upported (name is assumed to be ┆ 0x04f200…09e600 73 74 6f 72 65 64 20 61 73 20 61 20 63 68 61 72 20 2a 20 61 74 20 74 68 65 20 66 72 6f 6e 74 0a ┆stored as a char * at the front ┆ 0x04f200…09e600 6f 66 20 74 68 65 20 72 65 63 6f 72 64 2c 20 61 6e 64 20 73 69 6d 70 6c 65 20 6c 69 6e 65 61 72 ┆of the record, and simple linear┆ 0x04f200…09e600 20 73 65 61 72 63 68 20 69 73 20 75 73 65 64 29 2e 0a 20 20 20 54 77 6f 20 61 64 64 69 74 69 6f ┆ search is used). Two additio┆ 0x04f200…09e600 6e 61 6c 20 65 6e 74 72 79 20 70 6f 69 6e 74 73 20 61 72 65 20 64 65 66 69 6e 65 64 20 62 79 20 ┆nal entry points are defined by ┆ 0x04f200…09e600 74 68 65 20 64 62 61 74 65 6c 6c 28 29 20 61 6e 64 20 64 62 61 73 65 65 6b 28 29 0a 6d 61 63 72 ┆the dbatell() and dbaseek() macr┆ 0x04f200…09e600 6f 73 2e 20 54 68 65 20 66 69 72 73 74 20 72 65 73 74 75 72 6e 73 20 74 68 65 20 63 6f 75 6e 74 ┆os. The first resturns the count┆ 0x04f200…09e600 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 3b 20 74 68 65 ┆ of entries in the database; the┆ 0x04f200…09e600 20 73 65 63 6f 6e 64 0a 63 68 61 6e 67 65 73 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 ┆ second changes the location of ┆ 0x04f200…09e600 74 68 65 20 6e 65 78 74 2d 66 72 65 65 20 73 6c 6f 74 20 74 6f 20 61 20 67 69 76 65 6e 20 69 6e ┆the next-free slot to a given in┆ 0x04f200…09e600 64 65 78 2c 20 69 6d 70 6c 69 63 69 74 6c 79 0a 64 69 73 63 61 72 64 69 6e 67 20 74 68 61 74 20 ┆dex, implicitly discarding that ┆ 0x04f200…09e600 72 65 63 6f 72 64 20 61 6e 64 20 61 6c 6c 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 6e 65 73 2e 0a 0a ┆record and all following ones. ┆ 0x04f200…09e600 41 55 54 48 4f 52 0a 20 20 20 45 72 69 63 20 53 2e 20 52 61 79 6d 6f 6e 64 0a 20 20 20 54 68 69 ┆AUTHOR Eric S. Raymond Thi┆ 0x04f200…09e600 73 20 73 6f 66 74 77 61 72 65 20 69 73 20 43 6f 70 79 72 69 67 68 74 20 28 43 29 20 31 39 38 39 ┆s software is Copyright (C) 1989┆ 0x04f200…09e600 20 62 79 20 45 72 69 63 20 53 2e 20 52 61 79 6d 6f 6e 64 20 66 6f 72 20 74 68 65 20 73 6f 6c 65 ┆ by Eric S. Raymond for the sole┆ 0x04f200…09e600 20 70 75 72 70 6f 73 65 0a 6f 66 20 70 72 6f 74 65 63 74 69 6e 67 20 66 72 65 65 20 72 65 64 69 ┆ purpose of protecting free redi┆ 0x04f200…09e600 73 74 72 69 62 75 74 69 6f 6e 3b 20 73 65 65 20 74 68 65 20 4c 49 43 45 4e 53 45 20 66 69 6c 65 ┆stribution; see the LICENSE file┆ 0x04f200…09e600 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆ for details. *****************┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆********************************┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a ┆****************************/ /*┆ 0x04f200…09e600 20 4c 49 4e 54 4c 49 42 52 41 52 59 20 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 6c 69 62 70 6f 72 ┆ LINTLIBRARY */ #include "libpor┆ 0x04f200…09e600 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 64 62 61 6c 6c 6f 63 2e 68 22 0a 0a 63 68 61 72 20 ┆t.h" #include "dballoc.h" char ┆ 0x04f200…09e600 2a 64 62 61 6c 6c 6f 63 28 64 62 29 0a 2f 2a 20 65 6e 74 65 72 20 61 20 6e 65 77 20 72 65 63 6f ┆*dballoc(db) /* enter a new reco┆ 0x04f200…09e600 72 64 2c 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 69 74 20 69 6e 20 63 6f 72 ┆rd, allocate space for it in cor┆ 0x04f200…09e600 65 20 2a 2f 0a 64 62 64 65 66 5f 74 09 2a 64 62 3b 0a 7b 0a 20 20 20 20 72 65 67 69 73 74 65 72 ┆e */ dbdef_t *db; { register┆ 0x04f200…09e600 20 69 6e 74 20 20 20 20 69 3b 0a 0a 20 20 20 20 69 66 20 28 64 62 2d 3e 72 65 63 6f 72 64 73 20 ┆ int i; if (db->records ┆ 0x04f200…09e600 3d 3d 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 0a 20 20 20 20 7b 0a 09 64 62 2d 3e 63 70 20 3d ┆== (char *)NULL) { db->cp =┆ 0x04f200…09e600 20 64 62 2d 3e 72 65 63 6f 72 64 73 20 3d 0a 09 20 20 20 20 63 61 6c 6c 6f 63 28 28 75 6e 73 69 ┆ db->records = calloc((unsi┆ 0x04f200…09e600 67 6e 65 64 29 20 64 62 2d 3e 61 72 72 73 69 7a 65 2c 20 28 75 6e 73 69 67 6e 65 64 29 20 64 62 ┆gned) db->arrsize, (unsigned) db┆ 0x04f200…09e600 2d 3e 72 65 63 73 69 7a 65 29 3b 0a 09 64 62 2d 3e 6e 65 78 74 66 72 65 65 20 3d 20 30 3b 0a 20 ┆->recsize); db->nextfree = 0; ┆ 0x04f200…09e600 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 20 69 66 20 28 64 62 2d 3e 6e 65 78 74 66 72 65 65 20 3e ┆ } else if (db->nextfree >┆ 0x04f200…09e600 3d 20 64 62 2d 3e 61 72 72 73 69 7a 65 29 0a 20 20 20 20 7b 0a 09 69 6e 74 09 6f 6c 64 65 6e 64 ┆= db->arrsize) { int oldend┆ 0x04f200…09e600 20 3d 20 64 62 2d 3e 61 72 72 73 69 7a 65 20 2a 20 64 62 2d 3e 72 65 63 73 69 7a 65 3b 0a 0a 09 ┆ = db->arrsize * db->recsize; ┆ 0x04f200…09e600 69 20 3d 20 70 74 6f 69 28 64 62 2c 20 64 62 2d 3e 63 70 29 3b 0a 09 64 62 2d 3e 61 72 72 73 69 ┆i = ptoi(db, db->cp); db->arrsi┆ 0x04f200…09e600 7a 65 20 2b 3d 20 64 62 2d 3e 63 68 75 6e 6b 73 69 7a 65 3b 0a 09 64 62 2d 3e 72 65 63 6f 72 64 ┆ze += db->chunksize; db->record┆ 0x04f200…09e600 73 20 3d 72 65 61 6c 6c 6f 63 28 64 62 2d 3e 72 65 63 6f 72 64 73 2c 28 75 6e 73 69 67 6e 65 64 ┆s =realloc(db->records,(unsigned┆ 0x04f200…09e600 29 28 64 62 2d 3e 61 72 72 73 69 7a 65 2a 64 62 2d 3e 72 65 63 73 69 7a 65 29 29 3b 0a 09 28 76 ┆)(db->arrsize*db->recsize)); (v┆ 0x04f200…09e600 6f 69 64 29 20 62 7a 65 72 6f 28 64 62 2d 3e 72 65 63 6f 72 64 73 20 2b 20 6f 6c 64 65 6e 64 2c ┆oid) bzero(db->records + oldend,┆ 0x04f200…09e600 20 64 62 2d 3e 63 68 75 6e 6b 73 69 7a 65 20 2a 20 64 62 2d 3e 72 65 63 73 69 7a 65 29 3b 0a 09 ┆ db->chunksize * db->recsize); ┆ 0x04f200…09e600 64 62 2d 3e 63 70 20 3d 20 69 74 6f 70 28 64 62 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 ┆db->cp = itop(db, i); } ┆ 0x04f200…09e600 20 69 66 20 28 64 62 2d 3e 72 65 63 6f 72 64 73 20 3d 3d 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c ┆ if (db->records == (char *)NULL┆ 0x04f200…09e600 29 0a 09 72 65 74 75 72 6e 28 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 72 65 ┆) return((char *)NULL); re┆ 0x04f200…09e600 74 75 72 6e 28 69 74 6f 70 28 64 62 2c 20 64 62 2d 3e 6e 65 78 74 66 72 65 65 2b 2b 29 29 3b 0a ┆turn(itop(db, db->nextfree++)); ┆ 0x04f200…09e600 7d 0a 0a 2f 2a 41 52 47 53 55 53 45 44 2a 2f 0a 76 6f 69 64 20 64 62 61 65 6e 74 65 72 28 64 62 ┆} /*ARGSUSED*/ void dbaenter(db┆ 0x04f200…09e600 2c 20 64 70 29 0a 2f 2a 20 65 6e 74 65 72 20 61 6e 20 69 74 65 6d 20 69 6e 74 6f 20 74 68 65 20 ┆, dp) /* enter an item into the ┆ 0x04f200…09e600 74 61 62 6c 65 20 2d 2d 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 66 6f 72 20 28 63 68 61 72 20 2a 29 ┆table -- only works for (char *)┆ 0x04f200…09e600 2d 73 69 7a 65 64 20 69 74 65 6d 73 20 2a 2f 0a 64 62 64 65 66 5f 74 09 2a 64 62 3b 0a 63 68 61 ┆-sized items */ dbdef_t *db; cha┆ 0x04f200…09e600 72 09 2a 64 70 3b 0a 7b 0a 23 69 66 6e 64 65 66 20 6c 69 6e 74 0a 20 20 20 20 2a 28 28 63 68 61 ┆r *dp; { #ifndef lint *((cha┆ 0x04f200…09e600 72 20 2a 2a 29 20 64 62 61 6c 6c 6f 63 28 64 62 29 29 20 3d 20 64 70 3b 0a 23 65 6e 64 69 66 20 ┆r **) dballoc(db)) = dp; #endif ┆ 0x04f200…09e600 2f 2a 20 6c 69 6e 74 20 2a 2f 0a 7d 0a 0a 69 6e 74 20 64 62 61 6e 65 78 74 28 64 62 29 0a 2f 2a ┆/* lint */ } int dbanext(db) /*┆ 0x04f200…09e600 20 61 64 76 61 6e 63 65 20 74 68 65 20 63 75 72 72 65 6e 74 2d 72 65 63 6f 72 64 20 70 6f 69 6e ┆ advance the current-record poin┆ 0x04f200…09e600 74 65 72 20 2a 2f 0a 64 62 64 65 66 5f 74 09 2a 64 62 3b 0a 7b 0a 20 20 20 20 69 66 20 28 70 74 ┆ter */ dbdef_t *db; { if (pt┆ 0x04f200…09e600 6f 69 28 64 62 2c 20 64 62 2d 3e 63 70 29 20 3c 20 64 62 2d 3e 6e 65 78 74 66 72 65 65 20 2d 20 ┆oi(db, db->cp) < db->nextfree - ┆ 0x04f200…09e600 31 29 0a 20 20 20 20 7b 0a 09 64 62 2d 3e 63 70 20 2b 3d 20 64 62 2d 3e 72 65 63 73 69 7a 65 3b ┆1) { db->cp += db->recsize;┆ 0x04f200…09e600 0a 09 72 65 74 75 72 6e 28 53 55 43 43 45 45 44 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 ┆ return(SUCCEED); } els┆ 0x04f200…09e600 65 0a 09 72 65 74 75 72 6e 28 46 41 49 4c 29 3b 0a 7d 0a 0a 76 6f 69 64 20 64 62 61 72 65 77 69 ┆e return(FAIL); } void dbarewi┆ 0x04f200…09e600 6e 64 28 64 62 29 0a 2f 2a 20 72 65 73 65 74 20 74 68 65 20 63 75 72 72 65 6e 74 2d 72 65 63 6f ┆nd(db) /* reset the current-reco┆ 0x04f200…09e600 72 64 20 70 6f 69 6e 74 65 72 20 73 6f 20 6e 65 78 74 20 64 62 61 6e 65 78 74 28 29 20 72 65 73 ┆rd pointer so next dbanext() res┆ 0x04f200…09e600 65 74 73 20 63 75 72 72 65 6e 74 20 72 65 63 6f 72 64 20 2a 2f 0a 64 62 64 65 66 5f 74 09 2a 64 ┆ets current record */ dbdef_t *d┆ 0x04f200…09e600 62 3b 0a 7b 0a 20 20 20 20 2f 2a 20 74 68 69 73 20 69 73 20 61 20 6c 69 74 74 6c 65 20 73 68 61 ┆b; { /* this is a little sha┆ 0x04f200…09e600 6b 79 2e 2e 2e 20 2a 2f 0a 20 20 20 20 64 62 2d 3e 63 70 20 3d 20 64 62 2d 3e 72 65 63 6f 72 64 ┆ky... */ db->cp = db->record┆ 0x04f200…09e600 73 20 2d 20 64 62 2d 3e 72 65 63 73 69 7a 65 3b 0a 7d 0a 0a 69 6e 74 20 64 62 61 72 65 61 64 28 ┆s - db->recsize; } int dbaread(┆ 0x04f200…09e600 64 62 29 0a 2f 2a 20 72 65 61 64 20 61 20 64 61 74 61 62 61 73 65 20 69 6e 20 66 72 6f 6d 20 69 ┆db) /* read a database in from i┆ 0x04f200…09e600 74 73 20 66 69 6c 65 20 2a 2f 0a 64 62 64 65 66 5f 74 09 2a 64 62 3b 0a 7b 0a 20 20 20 20 65 78 ┆ts file */ dbdef_t *db; { ex┆ 0x04f200…09e600 74 65 72 6e 20 46 49 4c 45 20 2a 78 66 6f 70 65 6e 28 29 3b 0a 20 20 20 20 46 49 4c 45 09 2a 66 ┆tern FILE *xfopen(); FILE *f┆ 0x04f200…09e600 70 20 3d 20 78 66 6f 70 65 6e 28 64 62 2d 3e 66 69 6c 65 2c 20 22 72 22 29 3b 0a 20 20 20 20 69 ┆p = xfopen(db->file, "r"); i┆ 0x04f200…09e600 6e 74 09 09 73 74 3b 0a 0a 20 20 20 20 2f 2a 20 74 68 69 73 20 6c 6f 6f 70 20 61 6c 6c 6f 63 61 ┆nt st; /* this loop alloca┆ 0x04f200…09e600 74 65 73 20 6f 6e 65 20 65 78 74 72 61 20 72 65 63 6f 72 64 2e 2e 2e 77 65 20 64 6f 6e 27 74 20 ┆tes one extra record...we don't ┆ 0x04f200…09e600 63 61 72 65 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 20 28 28 73 74 20 3d 20 28 2a 64 62 2d 3e 72 ┆care */ while ((st = (*db->r┆ 0x04f200…09e600 67 65 74 29 28 64 62 61 6c 6c 6f 63 28 64 62 29 2c 20 66 70 29 29 20 21 3d 20 46 41 49 4c 29 0a ┆get)(dballoc(db), fp)) != FAIL) ┆ 0x04f200…09e600 09 69 66 20 28 73 74 20 21 3d 20 53 55 43 43 45 45 44 29 0a 09 7b 0a 09 20 20 20 20 2f 2a 20 73 ┆ if (st != SUCCEED) { /* s┆ 0x04f200…09e600 6f 6d 65 64 61 79 20 77 65 20 73 68 6f 75 6c 64 20 72 65 63 6f 76 65 72 20 74 68 65 20 73 70 61 ┆omeday we should recover the spa┆ 0x04f200…09e600 63 65 20 75 73 65 64 20 62 79 20 74 68 65 73 65 20 2a 2f 0a 09 20 20 20 20 2d 2d 64 62 2d 3e 6e ┆ce used by these */ --db->n┆ 0x04f200…09e600 65 78 74 66 72 65 65 3b 0a 09 7d 0a 0a 20 20 20 20 28 76 6f 69 64 29 20 66 63 6c 6f 73 65 28 66 ┆extfree; } (void) fclose(f┆ 0x04f200…09e600 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 28 2d 2d 64 62 2d 3e 6e 65 78 74 66 72 65 65 29 3b 0a ┆p); return(--db->nextfree); ┆ 0x04f200…09e600 7d 0a 0a 2f 2a 0a 20 2a 20 46 69 6e 64 20 69 6e 2d 63 6f 72 65 20 64 61 74 61 20 63 6f 72 72 65 ┆} /* * Find in-core data corre┆ 0x04f200…09e600 73 70 6f 6e 64 69 6e 67 20 74 6f 20 61 20 67 69 76 65 6e 20 6b 65 79 2e 0a 20 2a 20 54 68 69 73 ┆sponding to a given key. * This┆ 0x04f200…09e600 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 74 68 65 20 66 69 72 73 74 20 74 77 6f 20 62 79 74 65 ┆ assumes that the first two byte┆ 0x04f200…09e600 73 20 6f 66 20 74 68 65 20 73 74 72 75 63 74 75 72 65 0a 20 2a 20 61 72 65 20 61 20 70 6f 69 6e ┆s of the structure * are a poin┆ 0x04f200…09e600 74 65 72 20 74 6f 20 74 68 65 20 6b 65 79 2e 0a 20 2a 2f 0a 2f 2a 41 52 47 53 55 53 45 44 30 2a ┆ter to the key. */ /*ARGSUSED0*┆ 0x04f200…09e600 2f 0a 63 68 61 72 20 2a 64 62 61 66 69 6e 64 28 64 62 2c 20 6e 61 6d 65 2c 20 63 6d 70 66 75 6e ┆/ char *dbafind(db, name, cmpfun┆ 0x04f200…09e600 29 0a 64 62 64 65 66 5f 74 09 2a 64 62 3b 0a 63 68 61 72 09 2a 6e 61 6d 65 3b 0a 62 6f 6f 6c 09 ┆) dbdef_t *db; char *name; bool ┆ 0x04f200…09e600 28 2a 63 6d 70 66 75 6e 29 28 29 3b 0a 7b 0a 23 69 66 6e 64 65 66 20 6c 69 6e 74 09 2f 2a 20 6e ┆(*cmpfun)(); { #ifndef lint /* n┆ 0x04f200…09e600 6f 20 77 61 79 20 74 6f 20 70 6c 61 63 61 74 65 20 6c 69 6e 74 20 61 62 6f 75 74 20 74 68 6f 73 ┆o way to placate lint about thos┆ 0x04f200…09e600 65 20 70 6f 69 6e 74 65 72 20 63 6f 65 72 63 69 6f 6e 73 20 2a 2f 0a 20 20 20 20 72 65 67 69 73 ┆e pointer coercions */ regis┆ 0x04f200…09e600 74 65 72 20 63 68 61 72 20 2a 64 70 3b 0a 0a 20 20 20 20 2f 2a 20 66 69 72 73 74 2c 20 73 65 61 ┆ter char *dp; /* first, sea┆ 0x04f200…09e600 72 63 68 20 66 72 6f 6d 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 76 61 6c 75 65 20 75 70 20 74 ┆rch from the previous value up t┆ 0x04f200…09e600 6f 20 74 68 65 20 74 61 62 6c 65 20 65 6e 64 20 2a 2f 0a 20 20 20 20 66 6f 72 20 28 64 70 20 3d ┆o the table end */ for (dp =┆ 0x04f200…09e600 20 64 62 2d 3e 63 70 3b 20 70 74 6f 69 28 64 62 2c 20 64 70 29 20 3c 20 64 62 2d 3e 6e 65 78 74 ┆ db->cp; ptoi(db, dp) < db->next┆ 0x04f200…09e600 66 72 65 65 3b 20 64 70 20 2b 3d 20 64 62 2d 3e 72 65 63 73 69 7a 65 29 0a 09 69 66 20 28 28 2a ┆free; dp += db->recsize) if ((*┆ 0x04f200…09e600 63 6d 70 66 75 6e 29 28 6e 61 6d 65 2c 20 2a 28 28 63 68 61 72 20 2a 2a 29 20 64 70 29 29 29 0a ┆cmpfun)(name, *((char **) dp))) ┆ 0x04f200…09e600 09 20 20 20 20 72 65 74 75 72 6e 28 64 62 2d 3e 63 70 20 3d 20 64 70 29 3b 0a 0a 20 20 20 20 2f ┆ return(db->cp = dp); /┆ 0x04f200…09e600 2a 20 6e 65 78 74 2c 20 74 72 79 20 66 72 6f 6d 20 74 68 65 20 74 61 62 6c 65 20 62 61 73 65 20 ┆* next, try from the table base ┆ 0x04f200…09e600 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 76 61 6c 75 65 20 2a 2f 0a 20 20 20 20 66 6f 72 ┆to the previous value */ for┆ 0x04f200…09e600 20 28 64 70 20 3d 20 64 62 2d 3e 72 65 63 6f 72 64 73 3b 20 64 70 20 3c 20 64 62 2d 3e 63 70 3b ┆ (dp = db->records; dp < db->cp;┆ 0x04f200…09e600 20 64 70 20 2b 3d 20 64 62 2d 3e 72 65 63 73 69 7a 65 29 0a 09 69 66 20 28 73 74 72 6e 63 6d 70 ┆ dp += db->recsize) if (strncmp┆ 0x04f200…09e600 28 6e 61 6d 65 2c 20 2a 28 28 63 68 61 72 20 2a 2a 29 20 64 70 29 2c 20 73 74 72 6c 65 6e 28 6e ┆(name, *((char **) dp), strlen(n┆ 0x04f200…09e600 61 6d 65 29 29 20 3d 3d 20 30 29 0a 09 20 20 20 20 72 65 74 75 72 6e 28 64 62 2d 3e 63 70 20 3d ┆ame)) == 0) return(db->cp =┆ 0x04f200…09e600 20 64 70 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 6c 69 6e 74 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 ┆ dp); #endif /* lint */ /* ┆ 0x04f200…09e600 6e 65 69 74 68 65 72 20 6c 6f 6f 70 20 66 6f 75 6e 64 20 61 20 6d 61 74 63 68 20 2a 2f 0a 20 20 ┆neither loop found a match */ ┆ 0x04f200…09e600 20 20 72 65 74 75 72 6e 28 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 7d 0a 0a 69 6e 74 20 64 ┆ return((char *)NULL); } int d┆ 0x04f200…09e600 62 61 64 75 6d 70 28 64 62 2c 20 66 70 29 0a 2f 2a 20 64 75 6d 70 20 74 68 65 20 65 78 74 65 72 ┆badump(db, fp) /* dump the exter┆ 0x04f200…09e600 6e 61 6c 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 ┆nal representation of a database┆ 0x04f200…09e600 20 74 6f 20 61 20 66 69 6c 65 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 64 62 64 65 66 5f 74 09 2a 64 ┆ to a file pointer */ dbdef_t *d┆ 0x04f200…09e600 62 3b 0a 46 49 4c 45 09 2a 66 70 3b 0a 7b 0a 20 20 20 20 63 68 61 72 20 20 20 20 2a 64 70 3b 0a ┆b; FILE *fp; { char *dp; ┆ 0x04f200…09e600 0a 20 20 20 20 66 6f 72 20 28 64 70 20 3d 20 64 62 2d 3e 72 65 63 6f 72 64 73 3b 20 70 74 6f 69 ┆ for (dp = db->records; ptoi┆ 0x04f200…09e600 28 64 62 2c 20 64 70 29 20 3c 20 64 62 2d 3e 6e 65 78 74 66 72 65 65 3b 20 70 6c 75 73 70 6c 75 ┆(db, dp) < db->nextfree; plusplu┆ 0x04f200…09e600 73 28 64 62 2c 20 64 70 29 29 0a 09 69 66 20 28 28 2a 64 62 2d 3e 72 70 75 74 29 28 64 70 2c 20 ┆s(db, dp)) if ((*db->rput)(dp, ┆ 0x04f200…09e600 66 70 29 20 3d 3d 20 46 41 49 4c 29 0a 09 20 20 20 20 72 65 74 75 72 6e 28 46 41 49 4c 29 3b 0a ┆fp) == FAIL) return(FAIL); ┆ 0x04f200…09e600 20 20 20 20 72 65 74 75 72 6e 28 53 55 43 43 45 45 44 29 3b 0a 7d 0a 0a 76 6f 69 64 20 64 62 61 ┆ return(SUCCEED); } void dba┆ 0x04f200…09e600 77 72 69 74 65 28 64 62 29 0a 2f 2a 20 77 72 69 74 65 20 74 68 65 20 77 68 6f 6c 65 20 64 61 74 ┆write(db) /* write the whole dat┆ 0x04f200…09e600 61 62 61 73 65 20 6f 75 74 20 74 6f 20 64 69 73 6b 20 2a 2f 0a 64 62 64 65 66 5f 74 09 20 20 20 ┆abase out to disk */ dbdef_t ┆ 0x04f200…09e600 20 2a 64 62 3b 0a 7b 0a 20 20 20 20 46 49 4c 45 09 2a 77 72 63 66 70 3b 0a 20 20 20 20 63 68 61 ┆ *db; { FILE *wrcfp; cha┆ 0x04f200…09e600 72 09 6e 65 77 5f 76 65 72 73 69 6f 6e 5b 42 55 46 53 49 5a 5d 3b 0a 0a 20 20 20 20 28 76 6f 69 ┆r new_version[BUFSIZ]; (voi┆ 0x04f200…09e600 64 29 20 73 74 72 63 70 79 28 6e 65 77 5f 76 65 72 73 69 6f 6e 2c 20 64 62 2d 3e 66 69 6c 65 29 ┆d) strcpy(new_version, db->file)┆ 0x04f200…09e600 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 73 74 72 63 61 74 28 6e 65 77 5f 76 65 72 73 69 6f 6e 2c ┆; (void) strcat(new_version,┆ 0x04f200…09e600 20 22 2e 6e 65 77 22 29 3b 0a 23 69 66 64 65 66 20 4f 44 45 42 55 47 0a 20 20 20 20 28 76 6f 69 ┆ ".new"); #ifdef ODEBUG (voi┆ 0x04f200…09e600 64 29 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 57 72 69 74 69 6e 67 20 74 6f 20 25 ┆d) fprintf(stderr, "Writing to %┆ 0x04f200…09e600 73 5c 6e 22 2c 20 6e 65 77 5f 76 65 72 73 69 6f 6e 29 0a 23 65 6e 64 69 66 20 2f 2a 20 44 45 42 ┆s\n", new_version) #endif /* DEB┆ 0x04f200…09e600 55 47 20 2a 2f 0a 0a 23 69 66 64 65 66 20 56 4d 53 0a 20 20 20 20 28 76 6f 69 64 29 20 76 6d 73 ┆UG */ #ifdef VMS (void) vms┆ 0x04f200…09e600 64 65 6c 65 74 65 28 6e 65 77 5f 76 65 72 73 69 6f 6e 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 ┆delete(new_version); #endif ┆ 0x04f200…09e600 20 2f 2a 20 68 65 72 65 20 67 6f 65 73 20 74 68 65 20 61 63 74 75 61 6c 20 49 2f 4f 20 2a 2f 0a ┆ /* here goes the actual I/O */ ┆ 0x04f200…09e600 20 20 20 20 69 66 20 28 0a 09 28 77 72 63 66 70 20 3d 20 78 66 6f 70 65 6e 28 6e 65 77 5f 76 65 ┆ if ( (wrcfp = xfopen(new_ve┆ 0x04f200…09e600 72 73 69 6f 6e 2c 20 22 77 22 29 29 20 3d 3d 20 28 46 49 4c 45 20 2a 29 4e 55 4c 4c 0a 09 7c 7c ┆rsion, "w")) == (FILE *)NULL ||┆ 0x04f200…09e600 20 64 62 61 64 75 6d 70 28 64 62 2c 20 77 72 63 66 70 29 0a 09 7c 7c 20 66 63 6c 6f 73 65 28 77 ┆ dbadump(db, wrcfp) || fclose(w┆ 0x04f200…09e600 72 63 66 70 29 20 3c 20 30 0a 09 29 0a 09 78 65 72 72 6f 72 31 28 22 45 72 72 6f 72 20 77 72 69 ┆rcfp) < 0 ) xerror1("Error wri┆ 0x04f200…09e600 74 69 6e 67 20 25 73 20 2d 20 6e 6f 20 63 68 61 6e 67 65 73 20 6d 61 64 65 5c 6e 22 2c 20 64 62 ┆ting %s - no changes made\n", db┆ 0x04f200…09e600 2d 3e 66 69 6c 65 29 3b 0a 0a 23 69 66 64 65 66 20 56 4d 53 0a 20 20 20 20 28 76 6f 69 64 29 20 ┆->file); #ifdef VMS (void) ┆ 0x04f200…09e600 76 6d 73 64 65 6c 65 74 65 28 64 62 2d 3e 66 69 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 ┆vmsdelete(db->file); #endif ┆ 0x04f200…09e600 69 66 20 28 72 65 6e 61 6d 65 28 6e 65 77 5f 76 65 72 73 69 6f 6e 2c 20 64 62 2d 3e 66 69 6c 65 ┆if (rename(new_version, db->file┆ 0x04f200…09e600 29 20 3c 20 30 29 0a 09 78 65 72 72 6f 72 32 28 22 43 61 6e 6e 6f 74 20 72 65 6e 61 6d 65 20 25 ┆) < 0) xerror2("Cannot rename %┆ 0x04f200…09e600 73 20 66 69 6c 65 20 74 6f 20 25 73 22 2c 20 6e 65 77 5f 76 65 72 73 69 6f 6e 2c 20 64 62 2d 3e ┆s file to %s", new_version, db->┆ 0x04f200…09e600 66 69 6c 65 29 3b 0a 7d 0a 0a 62 6f 6f 6c 20 73 74 72 65 71 28 73 2c 20 74 29 0a 2f 2a 20 73 74 ┆file); } bool streq(s, t) /* st┆ 0x04f200…09e600 72 69 6e 67 20 65 71 75 61 6c 69 74 79 20 70 72 65 64 69 63 61 74 65 20 2a 2f 0a 63 68 61 72 09 ┆ring equality predicate */ char ┆ 0x04f200…09e600 2a 73 2c 20 2a 74 3b 0a 7b 0a 20 20 20 20 72 65 74 75 72 6e 28 73 74 72 63 6d 70 28 73 2c 20 74 ┆*s, *t; { return(strcmp(s, t┆ 0x04f200…09e600 29 20 3d 3d 20 30 29 3b 0a 7d 0a 0a 2f 2a 20 64 62 61 6c 6c 6f 63 2e 63 20 65 6e 64 73 20 68 65 ┆) == 0); } /* dballoc.c ends he┆ 0x04f200…09e600 72 65 20 2a 2f 0a 28 6e 65 77 5f 76 65 72 73 69 6f 6e 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 ┆re */ (new_version); #endif ┆ 0x04f200…09e600 20 2f 2a 20 68 65 72 65 20 67 6f 65 73 20 74 68 65 20 61 63 74 75 61 6c 20 49 2f 4f 20 2a 2f 0a ┆ /* here goes the actual I/O */ ┆ 0x04f200…09e600 20 20 20 20 69 66 20 28 0a 09 28 77 72 63 66 70 20 3d 20 78 66 6f 70 65 6e 28 6e 65 77 5f 76 65 ┆ if ( (wrcfp = xfopen(new_ve┆ 0x04f200…09e600 72 73 69 6f 6e 2c 20 22 77 22 29 29 20 3d 3d 20 28 46 49 4c 45 20 2a 29 4e 55 4c 4c 0a 09 7c 7c ┆rsion, "w")) == (FILE *)NULL ||┆ 0x04f200…09e600 20 64 62 61 64 75 6d 70 28 64 62 2c 20 77 72 63 66 70 29 0a 09 7c 7c 20 66 63 6c 6f 73 65 28 77 ┆ dbadump(db, wrcfp) || fclose(w┆ 0x04f200…09e600 72 63 66 70 29 20 3c 20 30 0a 09 29 0a 09 78 65 72 73 72 63 2f 44 2e 70 6f 72 74 2f 64 62 61 6c ┆rcfp) < 0 ) xersrc/D.port/dbal┆ 0x04f200…09e600 6c 6f 63 2e 68 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆loc.h ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆ ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 20 20 20 34 34 34 20 00 20 20 20 ┆ 444 ┆ 0x04f200…09e600 31 34 35 20 00 20 20 20 20 20 31 20 00 20 20 20 20 20 20 20 32 37 34 31 20 20 34 34 35 36 31 35 ┆145 1 2741 445615┆ 0x04f200…09e600 34 30 35 32 20 20 20 37 35 37 35 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆4052 7575 ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆ ┆ […0x9…] 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 2f 2a 20 64 62 61 6c 6c 6f 63 2e 68 20 2d 2d ┆ /* dballoc.h --┆ 0x04f200…09e600 20 67 65 6e 65 72 69 63 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 64 65 66 ┆ generic allocation routines def┆ 0x04f200…09e600 69 6e 69 74 69 6f 6e 73 20 2a 2f 0a 0a 2f 2a 0a 20 2a 20 43 6f 6e 74 72 6f 6c 20 73 74 72 75 63 ┆initions */ /* * Control struc┆ 0x04f200…09e600 74 75 72 65 20 66 6f 72 20 61 6c 6c 6f 63 61 74 65 64 20 74 61 62 6c 65 20 61 72 65 61 73 2e 20 ┆ture for allocated table areas. ┆ 0x04f200…09e600 54 68 65 20 64 62 61 6c 6c 6f 63 20 63 6f 64 65 20 75 73 65 73 20 74 68 65 0a 20 2a 20 72 65 63 ┆The dballoc code uses the * rec┆ 0x04f200…09e600 73 69 7a 65 20 66 69 65 6c 64 20 65 76 65 72 79 77 68 65 72 65 20 69 74 20 68 61 73 20 74 6f 20 ┆size field everywhere it has to ┆ 0x04f200…09e600 64 6f 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f 72 20 70 6f 69 6e 74 65 72 20 62 75 6d 70 69 6e 67 ┆do allocation or pointer bumping┆ 0x04f200…09e600 0a 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 0a 7b 0a 20 20 20 20 63 68 61 72 20 20 ┆ */ typedef struct { char ┆ 0x04f200…09e600 20 20 2a 66 69 6c 65 3b 09 09 2f 2a 20 61 73 73 6f 63 69 61 74 65 64 20 66 69 6c 65 6e 61 6d 65 ┆ *file; /* associated filename┆ 0x04f200…09e600 20 2a 2f 0a 0a 20 20 20 20 69 6e 74 09 20 20 20 20 72 65 63 73 69 7a 65 3b 09 09 2f 2a 20 74 68 ┆ */ int recsize; /* th┆ 0x04f200…09e600 65 20 73 69 7a 65 20 6f 66 20 61 6e 20 69 6e 2d 63 6f 72 65 20 72 65 63 6f 72 64 20 2a 2f 0a 20 ┆e size of an in-core record */ ┆ 0x04f200…09e600 20 20 20 69 6e 74 09 20 20 20 20 61 72 72 73 69 7a 65 3b 09 09 2f 2a 20 63 75 72 72 65 6e 74 20 ┆ int arrsize; /* current ┆ 0x04f200…09e600 61 6c 6c 6f 63 61 74 69 6f 6e 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 69 6e 74 09 20 20 20 20 63 ┆allocation size */ int c┆ 0x04f200…09e600 68 75 6e 6b 73 69 7a 65 3b 09 09 2f 2a 20 69 6e 63 72 65 6d 65 6e 74 20 73 69 7a 65 20 66 6f 72 ┆hunksize; /* increment size for┆ 0x04f200…09e600 20 72 65 61 6c 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 66 6f 72 20 74 68 65 ┆ reallocation */ /* for the┆ 0x04f200…09e600 73 65 2c 20 66 69 72 73 74 20 61 72 67 20 69 73 20 72 65 63 6f 72 64 20 70 74 72 2c 20 73 65 63 ┆se, first arg is record ptr, sec┆ 0x04f200…09e600 6f 6e 64 20 61 72 67 20 69 73 20 66 69 6c 65 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69 ┆ond arg is file pointer */ i┆ 0x04f200…09e600 6e 74 09 20 20 20 20 28 2a 72 67 65 74 29 28 29 3b 09 09 2f 2a 20 68 6f 77 20 74 6f 20 72 65 61 ┆nt (*rget)(); /* how to rea┆ 0x04f200…09e600 64 20 61 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 63 6f 72 65 20 2a 2f 0a 20 20 20 20 69 6e 74 09 ┆d a record into core */ int ┆ 0x04f200…09e600 20 20 20 20 28 2a 72 70 75 74 29 28 29 3b 09 09 2f 2a 20 68 6f 77 20 74 6f 20 77 72 69 74 65 20 ┆ (*rput)(); /* how to write ┆ 0x04f200…09e600 61 20 72 65 63 6f 72 64 20 74 6f 20 64 69 73 6b 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 74 68 65 20 ┆a record to disk */ /* the ┆ 0x04f200…09e600 75 73 65 72 20 6e 65 76 65 72 20 69 6e 69 74 69 61 6c 69 7a 65 73 20 74 68 65 73 65 20 2a 2f 0a ┆user never initializes these */ ┆ 0x04f200…09e600 20 20 20 20 63 68 61 72 20 20 20 20 2a 72 65 63 6f 72 64 73 3b 09 09 2f 2a 20 61 6c 6c 6f 63 61 ┆ char *records; /* alloca┆ 0x04f200…09e600 74 65 64 20 61 72 65 61 20 66 6f 72 20 74 68 65 20 73 74 75 66 66 20 2a 2f 0a 20 20 20 20 69 6e ┆ted area for the stuff */ in┆ 0x04f200…09e600 74 20 20 20 20 20 6e 65 78 74 66 72 65 65 3b 09 09 2f 2a 20 63 6f 75 6e 74 20 6f 66 20 72 65 63 ┆t nextfree; /* count of rec┆ 0x04f200…09e600 6f 72 64 73 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 20 20 20 2a 63 70 3b 09 09 2f 2a 20 70 6f 69 ┆ords */ char *cp; /* poi┆ 0x04f200…09e600 6e 74 65 72 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 65 63 6f 72 64 20 2a 2f 0a 7d 0a ┆nter to the current record */ } ┆ 0x04f200…09e600 64 62 64 65 66 5f 74 3b 0a 0a 23 64 65 66 69 6e 65 20 70 74 6f 69 28 64 62 2c 20 70 29 09 28 28 ┆dbdef_t; #define ptoi(db, p) ((┆ 0x04f200…09e600 28 70 29 20 2d 20 28 64 62 29 2d 3e 72 65 63 6f 72 64 73 29 20 2f 20 28 64 62 29 2d 3e 72 65 63 ┆(p) - (db)->records) / (db)->rec┆ 0x04f200…09e600 73 69 7a 65 29 0a 23 64 65 66 69 6e 65 20 69 74 6f 70 28 64 62 2c 20 6e 29 09 28 28 64 62 29 2d ┆size) #define itop(db, n) ((db)-┆ 0x04f200…09e600 3e 72 65 63 6f 72 64 73 20 2b 20 28 28 6e 29 20 2a 20 28 64 62 29 2d 3e 72 65 63 73 69 7a 65 29 ┆>records + ((n) * (db)->recsize)┆ 0x04f200…09e600 29 0a 23 64 65 66 69 6e 65 20 70 6c 75 73 70 6c 75 73 28 64 62 2c 20 70 29 09 28 70 20 2b 3d 20 ┆) #define plusplus(db, p) (p += ┆ 0x04f200…09e600 28 64 62 29 2d 3e 72 65 63 73 69 7a 65 29 0a 0a 23 64 65 66 69 6e 65 20 64 62 61 74 68 69 73 28 ┆(db)->recsize) #define dbathis(┆ 0x04f200…09e600 64 62 29 09 28 64 62 2d 3e 63 70 29 0a 23 64 65 66 69 6e 65 20 64 62 61 74 65 6c 6c 28 64 62 29 ┆db) (db->cp) #define dbatell(db)┆ 0x04f200…09e600 09 28 28 64 62 29 2d 3e 6e 65 78 74 66 72 65 65 29 0a 23 64 65 66 69 6e 65 20 64 62 61 73 65 65 ┆ ((db)->nextfree) #define dbasee┆ 0x04f200…09e600 6b 28 64 62 2c 20 6e 29 20 20 28 28 64 62 29 2d 3e 63 70 20 3d 20 69 74 6f 70 28 28 64 62 29 2c ┆k(db, n) ((db)->cp = itop((db),┆ 0x04f200…09e600 20 28 64 62 29 2d 3e 6e 65 78 74 66 72 65 65 20 3d 20 28 6e 29 29 29 0a 0a 65 78 74 65 72 6e 20 ┆ (db)->nextfree = (n))) extern ┆ 0x04f200…09e600 63 68 61 72 20 2a 64 62 61 6c 6c 6f 63 28 29 3b 0a 65 78 74 65 72 6e 20 76 6f 69 64 20 64 62 61 ┆char *dballoc(); extern void dba┆ 0x04f200…09e600 65 6e 74 65 72 28 29 3b 0a 65 78 74 65 72 6e 20 69 6e 74 20 64 62 61 6e 65 78 74 28 29 3b 0a 65 ┆enter(); extern int dbanext(); e┆ 0x04f200…09e600 78 74 65 72 6e 20 76 6f 69 64 20 64 62 61 72 65 77 69 6e 64 28 29 3b 0a 65 78 74 65 72 6e 20 69 ┆xtern void dbarewind(); extern i┆ 0x04f200…09e600 6e 74 20 64 62 61 72 65 61 64 28 29 3b 0a 65 78 74 65 72 6e 20 63 68 61 72 20 2a 64 62 61 66 69 ┆nt dbaread(); extern char *dbafi┆ 0x04f200…09e600 6e 64 28 29 3b 0a 65 78 74 65 72 6e 20 69 6e 74 20 64 62 61 64 75 6d 70 28 29 3b 0a 65 78 74 65 ┆nd(); extern int dbadump(); exte┆ 0x04f200…09e600 72 6e 20 76 6f 69 64 20 64 62 61 77 72 69 74 65 28 29 3b 0a 65 78 74 65 72 6e 20 62 6f 6f 6c 20 ┆rn void dbawrite(); extern bool ┆ 0x04f200…09e600 73 74 72 65 71 28 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 55 43 43 45 45 44 0a 23 64 65 66 69 6e ┆streq(); #ifndef SUCCEED #defin┆ 0x04f200…09e600 65 20 53 55 43 43 45 45 44 09 30 0a 23 64 65 66 69 6e 65 20 46 41 49 4c 09 2d 31 0a 23 65 6e 64 ┆e SUCCEED 0 #define FAIL -1 #end┆ 0x04f200…09e600 69 66 0a 23 64 65 66 69 6e 65 20 43 4f 4d 4d 45 4e 54 09 31 09 2f 2a 20 6d 75 73 74 20 6e 6f 74 ┆if #define COMMENT 1 /* must not┆ 0x04f200…09e600 20 62 65 20 53 55 43 43 45 45 44 20 6f 72 20 46 41 49 4c 20 2a 2f 0a 0a 2f 2a 20 64 62 61 6c 6c ┆ be SUCCEED or FAIL */ /* dball┆ 0x04f200…09e600 6f 63 2e 68 20 65 6e 64 73 20 68 65 72 65 20 2a 2f 0a 28 64 62 2c 20 70 29 09 28 70 20 2b 3d 20 ┆oc.h ends here */ (db, p) (p += ┆ 0x04f200…09e600 28 64 62 29 2d 3e 72 65 63 73 69 7a 65 29 0a 0a 23 73 72 63 2f 44 2e 70 6f 72 74 2f 64 66 2e 63 ┆(db)->recsize) #src/D.port/df.c┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆ ┆ […0x1…] 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 20 20 20 34 34 34 20 00 20 20 20 ┆ 444 ┆ 0x04f200…09e600 31 34 35 20 00 20 20 20 20 20 31 20 00 20 20 20 20 20 20 20 35 36 34 36 20 20 34 34 35 36 31 35 ┆145 1 5646 445615┆ 0x04f200…09e600 34 30 35 32 20 20 20 36 35 37 30 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆4052 6570 ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆ ┆ […0x9…] 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆ /**************┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆********************************┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a ┆******************************* ┆ 0x04f200…09e600 0a 4e 41 4d 45 0a 20 20 20 64 66 20 2d 2d 20 72 65 74 75 72 6e 20 63 6f 75 6e 74 20 6f 66 20 66 ┆ NAME df -- return count of f┆ 0x04f200…09e600 72 65 65 20 64 69 73 6b 20 62 6c 6f 63 6b 73 20 69 6e 20 61 20 66 69 6c 65 20 73 79 73 74 65 6d ┆ree disk blocks in a file system┆ 0x04f200…09e600 0a 0a 53 59 4e 4f 50 53 49 53 0a 20 20 20 6c 6f 6e 67 20 64 66 28 64 69 72 29 0a 20 20 20 63 68 ┆ SYNOPSIS long df(dir) ch┆ 0x04f200…09e600 61 72 20 2a 64 69 72 3b 0a 0a 44 45 53 43 52 49 50 54 49 4f 4e 0a 20 20 20 54 68 65 20 64 66 28 ┆ar *dir; DESCRIPTION The df(┆ 0x04f200…09e600 29 20 66 75 6e 63 74 69 6f 6e 20 74 72 69 65 73 20 74 6f 20 66 69 6e 64 20 61 6e 64 20 72 65 74 ┆) function tries to find and ret┆ 0x04f200…09e600 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 65 65 20 31 4b 20 62 6c 6f 63 6b 73 ┆urn the number of free 1K blocks┆ 0x04f200…09e600 0a 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 73 79 73 74 65 6d 20 63 6f ┆ available on the file system co┆ 0x04f200…09e600 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 67 69 76 65 6e 20 64 69 72 65 63 74 6f 72 79 2e 20 49 74 ┆ntaining the given directory. It┆ 0x04f200…09e600 20 77 69 6c 6c 0a 72 65 74 75 72 6e 20 2d 65 72 72 6e 6f 20 69 66 20 69 74 73 20 61 74 74 65 6d ┆ will return -errno if its attem┆ 0x04f200…09e600 70 74 20 69 73 20 75 6e 73 75 63 63 65 73 73 66 75 6c 2e 0a 0a 42 55 47 53 0a 20 20 20 54 68 69 ┆pt is unsuccessful. BUGS Thi┆ 0x04f200…09e600 73 20 63 6f 64 65 20 62 72 65 61 6b 73 20 6f 6e 20 56 37 20 62 65 63 61 75 73 65 20 6e 65 69 74 ┆s code breaks on V7 because neit┆ 0x04f200…09e600 68 65 72 20 75 73 74 61 74 28 32 29 20 6e 6f 72 20 74 68 65 20 65 6e 68 61 6e 63 65 6d 65 6e 74 ┆her ustat(2) nor the enhancement┆ 0x04f200…09e600 20 6f 66 0a 64 66 28 31 29 20 74 68 61 74 20 69 6e 74 65 72 70 72 65 74 73 20 61 72 62 69 74 72 ┆ of df(1) that interprets arbitr┆ 0x04f200…09e600 61 72 79 20 64 69 72 65 63 74 6f 72 79 20 6e 61 6d 65 73 20 63 6f 72 72 65 63 74 6c 79 20 61 72 ┆ary directory names correctly ar┆ 0x04f200…09e600 65 20 73 75 70 70 6f 72 74 65 64 2e 20 4f 6e 6c 79 0a 61 72 67 75 6d 65 6e 74 73 20 74 68 61 74 ┆e supported. Only arguments that┆ 0x04f200…09e600 20 61 72 65 20 6e 61 6d 65 73 20 6f 66 20 66 69 6c 65 73 79 73 74 65 6d 20 72 6f 6f 74 73 20 77 ┆ are names of filesystem roots w┆ 0x04f200…09e600 69 6c 6c 20 77 6f 72 6b 2e 0a 0a 20 20 20 4f 6e 20 41 54 26 54 20 55 4e 49 58 20 74 68 69 73 20 ┆ill work. On AT&T UNIX this ┆ 0x04f200…09e600 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 20 63 6f 75 6e 74 20 6f 66 20 70 68 79 73 ┆function returns a count of phys┆ 0x04f200…09e600 69 63 61 6c 20 62 6c 6f 63 6b 73 20 66 72 65 65 20 72 61 74 68 65 72 0a 74 68 61 6e 20 28 6d 6f ┆ical blocks free rather than (mo┆ 0x04f200…09e600 72 65 20 75 73 65 66 75 6c 29 20 6c 6f 67 69 63 61 6c 20 31 4b 42 20 62 6c 6f 63 6b 73 2e 20 54 ┆re useful) logical 1KB blocks. T┆ 0x04f200…09e600 68 69 73 20 6d 61 6b 65 73 20 69 74 20 69 6e 61 63 63 75 72 61 74 65 20 6f 6e 20 6f 6c 64 2d 73 ┆his makes it inaccurate on old-s┆ 0x04f200…09e600 74 79 6c 65 0a 35 31 32 4b 42 20 66 69 6c 65 20 73 79 73 74 65 6d 73 2e 0a 0a 20 20 20 54 68 65 ┆tyle 512KB file systems. The┆ 0x04f200…09e600 20 42 53 44 20 63 6f 64 65 20 69 73 20 64 65 70 65 6e 64 65 6e 74 20 6f 6e 20 76 65 6e 64 6f 72 ┆ BSD code is dependent on vendor┆ 0x04f200…09e600 20 77 68 69 6d 2c 20 62 65 63 61 75 73 65 20 69 74 20 70 61 72 73 65 73 20 74 68 65 20 6f 75 74 ┆ whim, because it parses the out┆ 0x04f200…09e600 70 75 74 0a 66 6f 72 6d 61 74 20 6f 66 20 74 68 65 20 65 76 65 72 2d 63 68 61 6e 67 69 6e 67 20 ┆put format of the ever-changing ┆ 0x04f200…09e600 27 64 66 27 20 63 6f 6d 6d 61 6e 64 2e 20 54 68 65 20 61 73 73 75 6d 70 74 69 6f 6e 73 20 61 72 ┆'df' command. The assumptions ar┆ 0x04f200…09e600 65 3a 0a 0a 20 20 20 20 31 29 20 64 66 2c 20 77 68 65 6e 20 67 69 76 65 6e 20 61 20 70 68 79 73 ┆e: 1) df, when given a phys┆ 0x04f200…09e600 69 63 61 6c 20 6f 72 20 6c 6f 67 69 63 61 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 20 6e 61 6d 65 ┆ical or logical file system name┆ 0x04f200…09e600 20 61 73 20 61 72 67 75 6d 65 6e 74 2c 0a 77 69 6c 6c 20 70 72 69 6e 74 20 6f 75 74 20 61 20 64 ┆ as argument, will print out a d┆ 0x04f200…09e600 61 74 61 20 6c 69 6e 65 20 72 65 6c 61 74 69 6e 67 20 74 6f 20 74 68 61 74 20 66 69 6c 65 20 73 ┆ata line relating to that file s┆ 0x04f200…09e600 79 73 74 65 6d 20 6f 6e 6c 79 2e 0a 0a 20 20 20 20 32 29 20 68 65 61 64 65 72 20 6c 69 6e 65 73 ┆ystem only. 2) header lines┆ 0x04f200…09e600 20 6f 6e 20 74 68 65 20 6f 75 74 70 75 74 2c 20 69 66 20 61 6e 79 2c 20 6e 65 76 65 72 20 62 65 ┆ on the output, if any, never be┆ 0x04f200…09e600 67 69 6e 20 77 69 74 68 20 61 20 2f 2e 0a 0a 41 55 54 48 4f 52 0a 20 20 20 45 72 69 63 20 53 2e ┆gin with a /. AUTHOR Eric S.┆ 0x04f200…09e600 20 52 61 79 6d 6f 6e 64 0a 20 20 20 54 68 69 73 20 73 6f 66 74 77 61 72 65 20 69 73 20 43 6f 70 ┆ Raymond This software is Cop┆ 0x04f200…09e600 79 72 69 67 68 74 20 28 43 29 20 31 39 38 39 20 62 79 20 45 72 69 63 20 53 2e 20 52 61 79 6d 6f ┆yright (C) 1989 by Eric S. Raymo┆ 0x04f200…09e600 6e 64 20 66 6f 72 20 74 68 65 20 73 6f 6c 65 20 70 75 72 70 6f 73 65 0a 6f 66 20 70 72 6f 74 65 ┆nd for the sole purpose of prote┆ 0x04f200…09e600 63 74 69 6e 67 20 66 72 65 65 20 72 65 64 69 73 74 72 69 62 75 74 69 6f 6e 3b 20 73 65 65 20 74 ┆cting free redistribution; see t┆ 0x04f200…09e600 68 65 20 4c 49 43 45 4e 53 45 20 66 69 6c 65 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 0a 2a 2a ┆he LICENSE file for details. **┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆********************************┆ […0x1…] 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 20 4c 49 4e 54 4c 49 42 52 41 52 59 20 2a 2f 0a 23 ┆***********/ /* LINTLIBRARY */ #┆ 0x04f200…09e600 69 6e 63 6c 75 64 65 20 22 6c 69 62 70 6f 72 74 2e 68 22 0a 0a 2f 2a 20 69 6e 73 65 72 74 20 6e ┆include "libport.h" /* insert n┆ 0x04f200…09e600 65 77 20 66 6f 72 6d 61 74 73 20 66 6f 72 20 68 61 63 6b 65 64 20 64 66 28 31 29 20 69 6d 70 6c ┆ew formats for hacked df(1) impl┆ 0x04f200…09e600 65 6d 65 6e 74 61 74 69 6f 6e 73 20 68 65 72 65 20 2a 2f 0a 23 69 66 64 65 66 20 42 53 44 34 5f ┆ementations here */ #ifdef BSD4_┆ 0x04f200…09e600 33 0a 23 64 65 66 69 6e 65 20 44 46 53 43 41 4e 09 22 25 2a 73 20 25 2a 6c 64 20 25 2a 6c 64 20 ┆3 #define DFSCAN "%*s %*ld %*ld ┆ 0x04f200…09e600 25 6c 64 22 0a 23 65 6c 73 65 0a 23 69 66 64 65 66 20 42 53 44 34 5f 32 0a 23 64 65 66 69 6e 65 ┆%ld" #else #ifdef BSD4_2 #define┆ 0x04f200…09e600 20 44 46 53 43 41 4e 09 22 25 2a 73 20 25 2a 6c 64 20 25 2a 6c 64 20 25 73 2c 20 25 2a 6c 64 20 ┆ DFSCAN "%*s %*ld %*ld %s, %*ld ┆ 0x04f200…09e600 25 2a 73 20 25 2a 73 22 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 42 ┆%*s %*s" #endif #endif #ifndef B┆ 0x04f200…09e600 53 44 34 5f 32 0a 23 69 66 6e 64 65 66 20 42 53 44 34 5f 33 0a 23 64 65 66 69 6e 65 20 44 46 53 ┆SD4_2 #ifndef BSD4_3 #define DFS┆ 0x04f200…09e600 43 41 4e 09 22 25 2a 73 20 25 2a 73 20 25 6c 64 22 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a ┆CAN "%*s %*s %ld" #endif #endif ┆ 0x04f200…09e600 0a 6c 6f 6e 67 20 64 66 28 64 69 72 29 0a 2f 2a 20 72 65 74 75 72 6e 20 61 6d 6f 75 6e 74 20 6f ┆ long df(dir) /* return amount o┆ 0x04f200…09e600 66 20 66 72 65 65 20 62 6c 6f 63 6b 73 20 6f 6e 20 61 20 67 69 76 65 6e 20 66 69 6c 65 20 73 79 ┆f free blocks on a given file sy┆ 0x04f200…09e600 73 74 65 6d 20 2a 2f 0a 63 68 61 72 09 2a 64 69 72 3b 0a 7b 0a 23 69 66 64 65 66 20 55 53 54 41 ┆stem */ char *dir; { #ifdef USTA┆ 0x04f200…09e600 54 09 09 09 2f 2a 20 20 77 65 20 68 61 76 65 20 75 73 74 61 74 28 32 29 20 61 76 61 69 6c 61 62 ┆T /* we have ustat(2) availab┆ 0x04f200…09e600 6c 65 20 20 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 75 73 74 61 74 2e 68 3e 0a 20 20 20 20 73 74 ┆le */ #include <ustat.h> st┆ 0x04f200…09e600 72 75 63 74 20 73 74 61 74 09 20 20 20 20 73 74 3b 0a 20 20 20 20 73 74 72 75 63 74 20 75 73 74 ┆ruct stat st; struct ust┆ 0x04f200…09e600 61 74 20 20 20 20 75 73 74 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 28 64 69 72 2c 20 26 73 ┆at ust; if (stat(dir, &s┆ 0x04f200…09e600 74 29 20 7c 7c 20 75 73 74 61 74 28 73 74 2e 73 74 5f 64 65 76 2c 20 26 75 73 74 29 29 0a 09 72 ┆t) || ustat(st.st_dev, &ust)) r┆ 0x04f200…09e600 65 74 75 72 6e 28 2d 65 72 72 6e 6f 29 3b 0a 20 20 20 20 65 6c 73 65 0a 09 72 65 74 75 72 6e 28 ┆eturn(-errno); else return(┆ 0x04f200…09e600 75 73 74 2e 66 5f 74 66 72 65 65 29 3b 0a 23 65 6c 73 65 0a 23 69 66 64 65 66 20 53 54 41 54 46 ┆ust.f_tfree); #else #ifdef STATF┆ 0x04f200…09e600 53 09 09 09 2f 2a 20 68 65 20 77 68 6f 20 68 61 73 20 4e 46 53 20 68 61 73 20 61 6c 73 6f 20 53 ┆S /* he who has NFS has also S┆ 0x04f200…09e600 54 41 54 46 53 20 2a 2f 0a 23 69 66 64 65 66 20 55 53 47 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 ┆TATFS */ #ifdef USG #include <sy┆ 0x04f200…09e600 73 2f 73 74 61 74 66 73 2e 68 3e 0a 23 65 6c 73 65 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f ┆s/statfs.h> #else #include <sys/┆ 0x04f200…09e600 76 66 73 2e 68 3e 0a 23 65 6e 64 69 66 20 2f 2a 20 21 55 53 47 20 2a 2f 0a 20 20 20 20 73 74 72 ┆vfs.h> #endif /* !USG */ str┆ 0x04f200…09e600 75 63 74 20 73 74 61 74 66 73 20 20 20 20 62 75 66 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e ┆uct statfs buf; extern in┆ 0x04f200…09e600 74 20 73 74 61 74 66 73 28 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 66 73 28 64 69 72 2c ┆t statfs(); if (statfs(dir,┆ 0x04f200…09e600 20 26 62 75 66 29 29 0a 09 72 65 74 75 72 6e 28 2d 65 72 72 6e 6f 29 3b 0a 20 20 20 20 65 6c 73 ┆ &buf)) return(-errno); els┆ 0x04f200…09e600 65 0a 23 69 66 64 65 66 20 55 53 47 0a 09 72 65 74 75 72 6e 28 20 62 75 66 2e 66 5f 62 73 69 7a ┆e #ifdef USG return( buf.f_bsiz┆ 0x04f200…09e600 65 20 2a 20 62 75 66 2e 66 5f 62 66 72 65 65 20 2f 20 31 30 32 34 20 29 3b 0a 23 65 6c 73 65 0a ┆e * buf.f_bfree / 1024 ); #else ┆ 0x04f200…09e600 09 72 65 74 75 72 6e 28 20 62 75 66 2e 66 5f 62 73 69 7a 65 20 2a 20 62 75 66 2e 66 5f 62 61 76 ┆ return( buf.f_bsize * buf.f_bav┆ 0x04f200…09e600 61 69 6c 20 2f 20 31 30 32 34 20 29 3b 20 20 20 20 0a 23 65 6e 64 69 66 20 2f 2a 20 21 55 53 47 ┆ail / 1024 ); #endif /* !USG┆ 0x04f200…09e600 20 2a 2f 0a 23 65 6c 73 65 09 09 2f 2a 20 6f 68 2c 20 66 6f 6f 2c 20 77 65 27 72 65 20 6f 6e 20 ┆ */ #else /* oh, foo, we're on ┆ 0x04f200…09e600 61 20 34 2e 32 20 6f 72 20 34 2e 33 42 53 44 20 73 79 73 74 65 6d 20 77 69 74 68 20 6e 6f 20 4e ┆a 4.2 or 4.3BSD system with no N┆ 0x04f200…09e600 46 53 20 2a 2f 0a 20 20 20 20 46 49 4c 45 20 2a 66 70 3b 0a 20 20 20 20 6c 6f 6e 67 20 66 72 65 ┆FS */ FILE *fp; long fre┆ 0x04f200…09e600 65 62 6c 6b 73 20 3d 20 46 41 49 4c 3b 0a 20 20 20 20 63 68 61 72 20 62 66 72 5b 42 55 46 53 49 ┆eblks = FAIL; char bfr[BUFSI┆ 0x04f200…09e600 5a 5d 3b 0a 0a 20 20 20 20 28 76 6f 69 64 29 20 73 70 72 69 6e 74 66 28 62 66 72 2c 20 22 64 66 ┆Z]; (void) sprintf(bfr, "df┆ 0x04f200…09e600 20 25 73 22 2c 20 64 69 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 74 61 6b 65 20 6f 75 72 20 6f 75 74 ┆ %s", dir); /* take our out┆ 0x04f200…09e600 70 75 74 20 66 72 6f 6d 20 74 68 65 20 64 66 28 31 29 20 63 6f 6d 6d 61 6e 64 20 63 6f 72 72 65 ┆put from the df(1) command corre┆ 0x04f200…09e600 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 63 61 6c 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28 ┆sponding to the call */ if (┆ 0x04f200…09e600 28 66 70 20 3d 20 70 65 6f 70 65 6e 28 62 66 72 2c 20 22 72 22 29 29 20 3d 3d 20 28 46 49 4c 45 ┆(fp = peopen(bfr, "r")) == (FILE┆ 0x04f200…09e600 20 2a 29 4e 55 4c 4c 29 0a 09 72 65 74 75 72 6e 28 46 41 49 4c 29 3b 0a 0a 20 20 20 20 2f 2a 20 ┆ *)NULL) return(FAIL); /* ┆ 0x04f200…09e600 73 6b 69 70 20 6c 65 61 64 69 6e 67 20 68 65 61 64 65 72 20 6c 69 6e 65 73 20 2a 2f 0a 20 20 20 ┆skip leading header lines */ ┆ 0x04f200…09e600 20 77 68 69 6c 65 20 28 66 67 65 74 73 28 62 66 72 2c 20 73 69 7a 65 6f 66 28 62 66 72 29 2c 20 ┆ while (fgets(bfr, sizeof(bfr), ┆ 0x04f200…09e600 66 70 29 20 26 26 20 62 66 72 5b 30 5d 20 21 3d 20 27 2f 27 29 0a 09 63 6f 6e 74 69 6e 75 65 3b ┆fp) && bfr[0] != '/') continue;┆ 0x04f200…09e600 0a 0a 20 20 20 20 2f 2a 20 69 66 20 77 65 20 67 6f 74 20 68 65 72 65 2c 20 77 65 20 73 68 6f 75 ┆ /* if we got here, we shou┆ 0x04f200…09e600 6c 64 20 62 65 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 74 68 65 20 72 69 67 68 74 20 6c 69 6e 65 20 ┆ld be looking at the right line ┆ 0x04f200…09e600 2a 2f 0a 20 20 20 20 69 66 20 28 73 73 63 61 6e 66 28 62 66 72 2c 20 44 46 53 43 41 4e 2c 20 26 ┆*/ if (sscanf(bfr, DFSCAN, &┆ 0x04f200…09e600 66 72 65 65 62 6c 6b 73 29 20 21 3d 20 31 29 0a 09 66 72 65 65 62 6c 6b 73 20 3d 20 46 41 49 4c ┆freeblks) != 1) freeblks = FAIL┆ 0x04f200…09e600 3b 0a 0a 20 20 20 20 28 76 6f 69 64 29 20 70 65 63 6c 6f 73 65 28 66 70 29 3b 0a 20 20 20 20 72 ┆; (void) peclose(fp); r┆ 0x04f200…09e600 65 74 75 72 6e 28 66 72 65 65 62 6c 6b 73 29 3b 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 7d ┆eturn(freeblks); #endif #endif }┆ 0x04f200…09e600 0a 0a 2f 2a 20 64 66 2e 63 20 65 6e 64 73 20 68 65 72 65 20 2a 2f 0a 62 66 72 5b 42 55 46 53 49 ┆ /* df.c ends here */ bfr[BUFSI┆ 0x04f200…09e600 5a 5d 3b 0a 0a 20 20 20 20 28 76 6f 69 64 29 20 73 70 72 69 6e 74 66 28 62 66 72 2c 20 22 64 66 ┆Z]; (void) sprintf(bfr, "df┆ 0x04f200…09e600 20 25 73 22 2c 20 64 69 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 74 61 6b 65 20 6f 75 72 20 6f 75 74 ┆ %s", dir); /* take our out┆ 0x04f200…09e600 70 75 74 20 66 72 6f 6d 20 74 68 65 20 64 66 28 31 73 72 63 2f 44 2e 70 6f 72 74 2f 65 64 62 6d ┆put from the df(1src/D.port/edbm┆ 0x04f200…09e600 2e 63 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆.c ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆ ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 20 20 20 34 34 34 20 00 20 20 20 ┆ 444 ┆ 0x04f200…09e600 31 34 35 20 00 20 20 20 20 20 31 20 00 20 20 20 20 20 31 31 33 30 31 32 20 20 34 34 35 36 34 37 ┆145 1 113012 445647┆ 0x04f200…09e600 34 30 31 35 20 20 20 37 31 33 35 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆4015 7135 ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆ ┆ […0x9…] 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆ /**************┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆********************************┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 0a 4e 41 4d 45 0a ┆************************* NAME ┆ 0x04f200…09e600 20 20 20 65 64 62 6d 2e 63 20 2d 2d 20 67 65 6e 65 72 69 63 20 64 61 74 61 62 61 73 65 20 72 6f ┆ edbm.c -- generic database ro┆ 0x04f200…09e600 75 74 69 6e 65 73 0a 0a 53 59 4e 4f 50 53 49 53 0a 20 20 20 23 69 6e 63 6c 75 64 65 20 22 65 64 ┆utines SYNOPSIS #include "ed┆ 0x04f200…09e600 62 6d 2e 68 22 0a 0a 20 20 20 64 61 74 61 62 61 73 65 20 2a 64 62 6d 6f 70 65 6e 28 66 69 6c 65 ┆bm.h" database *dbmopen(file┆ 0x04f200…09e600 29 09 20 20 20 20 2d 2d 20 6f 70 65 6e 73 20 61 20 64 61 74 61 62 61 73 65 20 66 6f 72 20 75 73 ┆) -- opens a database for us┆ 0x04f200…09e600 65 0a 20 20 20 63 68 61 72 20 20 20 2a 66 69 6c 65 3b 0a 0a 20 20 20 69 6e 74 20 64 62 6d 73 65 ┆e char *file; int dbmse┆ 0x04f200…09e600 65 6b 28 6b 65 79 2c 20 6b 65 79 6c 65 6e 2c 20 64 62 2c 20 77 6c 6f 63 6b 29 09 20 20 20 20 2d ┆ek(key, keylen, db, wlock) -┆ 0x04f200…09e600 2d 20 66 69 6e 64 20 65 6e 74 72 79 20 77 69 74 68 20 73 70 65 63 69 66 69 65 64 20 6b 65 79 0a ┆- find entry with specified key ┆ 0x04f200…09e600 20 20 20 63 68 61 72 20 2a 6b 65 79 3b 20 69 6e 74 20 6b 65 79 6c 65 6e 3b 20 64 61 74 61 62 61 ┆ char *key; int keylen; databa┆ 0x04f200…09e600 73 65 20 2a 64 62 3b 0a 0a 20 20 20 69 6e 74 20 64 62 6d 64 65 6c 65 74 65 28 64 62 29 09 09 20 ┆se *db; int dbmdelete(db) ┆ 0x04f200…09e600 20 20 20 2d 2d 20 64 65 6c 65 74 65 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79 0a ┆ -- deletes the current entry ┆ 0x04f200…09e600 20 20 20 64 61 74 61 62 61 73 65 20 2a 64 62 3b 0a 0a 20 20 20 76 6f 69 64 20 64 62 6d 72 65 77 ┆ database *db; void dbmrew┆ 0x04f200…09e600 69 6e 64 28 64 62 29 09 09 20 20 20 20 2d 2d 20 72 65 77 69 6e 64 2c 20 6e 65 78 74 20 64 62 6d ┆ind(db) -- rewind, next dbm┆ 0x04f200…09e600 6e 65 78 74 20 67 65 74 73 20 31 73 74 20 6b 65 79 0a 20 20 20 64 61 74 61 62 61 73 65 20 2a 64 ┆next gets 1st key database *d┆ 0x04f200…09e600 62 3b 0a 0a 20 20 20 69 6e 74 20 64 62 6d 6e 65 78 74 28 64 62 2c 20 77 6c 6f 63 6b 29 09 20 20 ┆b; int dbmnext(db, wlock) ┆ 0x04f200…09e600 20 20 2d 2d 20 73 74 65 70 20 74 6f 20 6e 65 78 74 20 64 61 74 61 62 61 73 65 20 65 6c 65 6d 65 ┆ -- step to next database eleme┆ 0x04f200…09e600 6e 74 0a 20 20 20 64 61 74 61 62 61 73 65 20 2a 64 62 3b 20 62 6f 6f 6c 20 77 6c 6f 63 6b 3b 0a ┆nt database *db; bool wlock; ┆ 0x04f200…09e600 0a 20 20 20 69 6e 74 20 64 62 6d 70 75 74 28 6b 65 79 2c 20 6b 6c 65 6e 2c 20 63 6f 6e 74 65 6e ┆ int dbmput(key, klen, conten┆ 0x04f200…09e600 74 2c 20 63 6c 65 6e 2c 20 64 62 29 20 20 20 20 2d 2d 20 77 72 69 74 65 20 63 6f 6e 74 65 6e 74 ┆t, clen, db) -- write content┆ 0x04f200…09e600 20 74 6f 20 61 6e 20 65 6e 74 72 79 0a 20 20 20 63 68 61 72 20 2a 6b 65 79 3b 20 75 6e 73 69 67 ┆ to an entry char *key; unsig┆ 0x04f200…09e600 6e 65 64 20 6b 6c 65 6e 3b 0a 20 20 20 63 68 61 72 20 2a 63 6f 6e 74 65 6e 74 3b 20 75 6e 73 69 ┆ned klen; char *content; unsi┆ 0x04f200…09e600 67 6e 65 64 20 63 6c 65 6e 3b 0a 20 20 20 72 65 67 69 73 74 65 72 20 64 61 74 61 62 61 73 65 20 ┆gned clen; register database ┆ 0x04f200…09e600 2a 64 62 3b 0a 0a 20 20 20 63 68 61 72 20 2a 64 62 6d 67 65 74 28 63 6c 65 6e 2c 20 64 62 29 09 ┆*db; char *dbmget(clen, db) ┆ 0x04f200…09e600 20 20 20 20 2d 2d 20 67 65 74 20 63 6f 6e 74 65 6e 74 20 6f 66 20 63 75 72 72 65 6e 74 20 65 6e ┆ -- get content of current en┆ 0x04f200…09e600 74 72 79 0a 20 20 20 75 6e 73 69 67 6e 65 64 20 2a 63 6c 65 6e 3b 0a 20 20 20 64 61 74 61 62 61 ┆try unsigned *clen; databa┆ 0x04f200…09e600 73 65 20 2a 64 62 3b 0a 0a 20 20 20 76 6f 69 64 20 64 62 6d 75 6e 6c 6f 63 6b 28 64 62 29 09 09 ┆se *db; void dbmunlock(db) ┆ 0x04f200…09e600 20 20 20 20 2d 2d 20 72 65 6c 65 61 73 65 20 6c 6f 63 6b 20 6f 6e 20 63 75 72 72 65 6e 74 20 69 ┆ -- release lock on current i┆ 0x04f200…09e600 74 65 6d 0a 20 20 20 64 61 74 61 62 61 73 65 20 2a 64 62 3b 0a 0a 20 20 20 76 6f 69 64 20 64 62 ┆tem database *db; void db┆ 0x04f200…09e600 6d 63 6c 6f 73 65 28 64 62 29 09 09 20 20 20 20 2d 2d 20 72 65 6c 65 61 73 65 73 20 61 6e 64 20 ┆mclose(db) -- releases and ┆ 0x04f200…09e600 63 6c 6f 73 65 73 20 67 69 76 65 6e 20 64 61 74 61 62 61 73 65 0a 20 20 20 64 61 74 61 62 61 73 ┆closes given database databas┆ 0x04f200…09e600 65 20 2a 64 62 3b 0a 0a 20 20 20 76 6f 69 64 20 64 62 6d 74 72 75 6e 63 28 64 62 29 09 20 20 20 ┆e *db; void dbmtrunc(db) ┆ 0x04f200…09e600 20 09 20 20 20 20 2d 2d 20 63 6c 65 61 6e 73 20 6f 75 74 20 61 20 67 69 76 65 6e 20 64 61 74 61 ┆ -- cleans out a given data┆ 0x04f200…09e600 62 61 73 65 0a 20 20 20 64 61 74 61 62 61 73 65 20 2a 64 62 3b 0a 0a 44 45 53 43 52 49 50 54 49 ┆base database *db; DESCRIPTI┆ 0x04f200…09e600 4f 4e 0a 20 20 20 54 68 65 73 65 20 61 72 65 20 64 61 74 61 20 62 61 73 65 20 72 6f 75 74 69 6e ┆ON These are data base routin┆ 0x04f200…09e600 65 73 20 6d 6f 64 65 6c 6c 65 64 20 6f 6e 20 74 68 65 20 56 37 20 55 6e 69 78 20 64 62 6d 20 72 ┆es modelled on the V7 Unix dbm r┆ 0x04f200…09e600 6f 75 74 69 6e 65 73 2e 20 54 68 65 79 0a 66 65 74 63 68 20 61 6e 64 20 73 74 6f 72 65 20 28 6b ┆outines. They fetch and store (k┆ 0x04f200…09e600 65 79 2c 20 63 6f 6e 74 65 6e 74 29 20 70 61 69 72 73 20 66 72 6f 6d 20 61 20 63 6f 6c 6c 65 63 ┆ey, content) pairs from a collec┆ 0x04f200…09e600 74 69 6f 6e 20 6f 66 20 64 61 74 61 62 61 73 65 73 2e 20 54 68 65 20 73 69 7a 65 0a 6f 66 20 63 ┆tion of databases. The size of c┆ 0x04f200…09e600 6f 6e 74 65 6e 74 20 69 73 20 75 6e 6c 69 6d 69 74 65 64 2e 20 53 65 65 20 65 64 62 6d 2e 68 20 ┆ontent is unlimited. See edbm.h ┆ 0x04f200…09e600 66 6f 72 20 74 68 65 20 64 61 74 61 20 74 79 70 65 73 20 75 73 65 64 2e 0a 0a 20 20 20 54 68 65 ┆for the data types used. The┆ 0x04f200…09e600 20 64 62 6d 6f 70 65 6e 28 29 20 66 75 6e 63 74 69 6f 6e 20 6f 70 65 6e 73 20 74 68 65 20 6e 61 ┆ dbmopen() function opens the na┆ 0x04f200…09e600 6d 65 64 20 64 61 74 61 62 61 73 65 2e 20 49 74 20 6e 65 65 64 73 20 74 68 65 20 66 69 6c 65 73 ┆med database. It needs the files┆ 0x04f200…09e600 0a 3c 66 69 6c 65 3e 2e 64 61 74 2c 20 3c 66 69 6c 65 3e 2e 70 61 67 20 61 6e 64 20 3c 66 69 6c ┆ <file>.dat, <file>.pag and <fil┆ 0x04f200…09e600 65 3e 2e 64 69 72 2e 20 20 52 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 ┆e>.dir. Returns a pointer to a ┆ 0x04f200…09e600 64 61 74 61 62 61 73 65 0a 73 74 72 75 63 74 75 72 65 20 77 68 69 63 68 20 69 73 20 75 73 65 64 ┆database structure which is used┆ 0x04f200…09e600 20 61 73 20 69 6e 70 75 74 20 74 6f 20 61 6c 6c 20 74 68 65 20 6f 74 68 65 72 20 72 6f 75 74 69 ┆ as input to all the other routi┆ 0x04f200…09e600 6e 65 73 2e 0a 0a 20 20 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 73 20 64 62 6d 72 65 77 69 6e 64 ┆nes. The functions dbmrewind┆ 0x04f200…09e600 28 29 20 61 6e 64 20 64 62 6d 6e 65 78 74 28 29 20 6d 61 79 20 62 65 20 75 73 65 64 20 74 6f 20 ┆() and dbmnext() may be used to ┆ 0x04f200…09e600 73 74 65 70 20 74 68 72 6f 75 67 68 20 74 68 65 0a 64 61 74 61 62 61 73 65 2e 20 41 66 74 65 72 ┆step through the database. After┆ 0x04f200…09e600 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 6f 72 20 72 65 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 ┆ initializing or reinitializing ┆ 0x04f200…09e600 77 69 74 68 20 64 62 6d 72 65 77 69 6e 64 28 29 2c 20 65 61 63 68 0a 64 62 6d 6e 65 78 74 28 29 ┆with dbmrewind(), each dbmnext()┆ 0x04f200…09e600 20 63 61 6c 6c 20 67 65 74 73 20 61 20 6e 65 77 20 6b 65 79 20 28 61 6e 64 20 72 65 74 75 72 6e ┆ call gets a new key (and return┆ 0x04f200…09e600 73 20 53 55 43 43 45 45 44 29 20 75 6e 74 69 6c 20 79 6f 75 20 72 75 6e 20 6f 75 74 20 6f 66 0a ┆s SUCCEED) until you run out of ┆ 0x04f200…09e600 6b 65 79 73 20 28 61 74 20 77 68 69 63 68 20 70 6f 69 6e 74 20 69 74 20 72 65 74 75 72 6e 73 20 ┆keys (at which point it returns ┆ 0x04f200…09e600 46 41 49 4c 29 2e 20 54 68 65 20 74 72 61 76 65 72 73 61 6c 20 6f 72 64 65 72 20 69 73 20 6e 6f ┆FAIL). The traversal order is no┆ 0x04f200…09e600 74 20 75 73 65 66 75 6c 2c 0a 75 6e 6c 65 73 73 20 79 6f 75 20 72 65 61 6c 6c 79 20 77 61 6e 74 ┆t useful, unless you really want┆ 0x04f200…09e600 65 64 20 74 6f 20 73 74 65 70 20 74 68 72 6f 75 67 68 20 74 68 65 20 6b 65 79 73 20 62 79 20 68 ┆ed to step through the keys by h┆ 0x04f200…09e600 61 73 68 20 76 61 6c 75 65 20 61 6e 64 0a 6f 72 64 65 72 20 6f 66 20 73 74 6f 72 61 67 65 20 74 ┆ash value and order of storage t┆ 0x04f200…09e600 69 6d 65 20 77 69 74 68 69 6e 20 62 75 63 6b 65 74 73 2e 0a 0a 20 20 20 47 69 76 65 6e 20 61 20 ┆ime within buckets. Given a ┆ 0x04f200…09e600 6b 65 79 20 61 6e 64 20 63 6f 6e 74 65 6e 74 20 61 73 20 73 74 72 69 6e 67 73 2c 20 64 62 6d 70 ┆key and content as strings, dbmp┆ 0x04f200…09e600 75 74 28 29 20 70 75 74 73 20 74 68 65 6d 20 69 6e 74 6f 20 74 68 65 20 67 69 76 65 6e 0a 64 61 ┆ut() puts them into the given da┆ 0x04f200…09e600 74 61 62 61 73 65 2e 20 54 68 65 20 63 6f 6e 74 65 6e 74 20 63 61 6e 20 62 65 20 76 65 72 79 20 ┆tabase. The content can be very ┆ 0x04f200…09e600 6c 61 72 67 65 2e 20 59 6f 75 20 6d 61 79 20 64 62 6d 70 75 74 28 29 20 74 6f 20 74 68 65 20 73 ┆large. You may dbmput() to the s┆ 0x04f200…09e600 61 6d 65 20 6b 65 79 0a 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 63 65 3b 20 65 61 63 68 20 74 69 6d ┆ame key more than once; each tim┆ 0x04f200…09e600 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 67 65 74 73 20 6c 61 72 67 65 72 20 61 20 6e 65 77 20 ┆e the content gets larger a new ┆ 0x04f200…09e600 63 6f 6e 74 65 6e 74 20 72 65 63 6f 72 64 20 69 73 0a 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 ┆content record is appended to th┆ 0x04f200…09e600 65 20 64 61 74 61 20 66 69 6c 65 2e 0a 0a 20 20 20 54 68 65 20 64 62 6d 67 65 74 28 29 20 66 75 ┆e data file. The dbmget() fu┆ 0x04f200…09e600 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 61 ┆nction returns a pointer to an a┆ 0x04f200…09e600 6c 6c 6f 63 61 74 65 64 20 61 72 65 61 20 6f 66 0a 73 74 6f 72 61 67 65 20 63 6f 6e 74 61 69 6e ┆llocated area of storage contain┆ 0x04f200…09e600 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79 ┆ing the content of the currently┆ 0x04f200…09e600 2d 73 65 6c 65 63 74 65 64 20 64 61 74 61 62 61 73 65 20 69 74 65 6d 2e 0a 54 68 69 73 20 61 72 ┆-selected database item. This ar┆ 0x04f200…09e600 65 61 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 61 6c 6c 6f 63 ┆ea will be automatically dealloc┆ 0x04f200…09e600 61 74 65 64 20 62 79 20 74 68 65 20 6e 65 78 74 20 64 62 6d 73 65 65 6b 28 29 2c 20 64 62 6d 6e ┆ated by the next dbmseek(), dbmn┆ 0x04f200…09e600 65 78 74 28 29 2c 0a 6f 72 20 64 62 6d 72 65 77 69 6e 64 28 29 2e 20 49 66 20 74 68 65 20 66 69 ┆ext(), or dbmrewind(). If the fi┆ 0x04f200…09e600 72 73 74 20 28 75 6e 73 69 67 6e 65 64 20 2a 29 20 61 72 67 20 6f 66 20 64 62 6d 67 65 74 28 29 ┆rst (unsigned *) arg of dbmget()┆ 0x04f200…09e600 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 69 74 0a 77 69 6c 6c 20 62 65 20 75 73 65 64 20 61 73 ┆ is non-NULL, it will be used as┆ 0x04f200…09e600 20 61 6e 20 61 64 64 72 65 73 73 20 74 6f 20 64 65 70 6f 73 69 74 20 74 68 65 20 63 6f 6e 74 65 ┆ an address to deposit the conte┆ 0x04f200…09e600 6e 74 20 6c 65 6e 67 74 68 20 69 6e 2e 0a 0a 43 4f 4e 43 55 52 52 45 4e 54 20 41 43 43 45 53 53 ┆nt length in. CONCURRENT ACCESS┆ 0x04f200…09e600 0a 20 20 20 4f 6e 20 53 79 73 74 65 6d 20 56 20 52 65 6c 65 61 73 65 20 33 20 55 4e 49 58 20 28 ┆ On System V Release 3 UNIX (┆ 0x04f200…09e600 6f 72 20 6f 74 68 65 72 20 76 65 72 73 69 6f 6e 73 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 6d ┆or other versions implementing m┆ 0x04f200…09e600 61 6e 64 61 74 6f 72 79 20 66 69 6c 65 0a 6c 6f 63 6b 69 6e 67 20 76 69 61 20 61 20 50 4f 53 49 ┆andatory file locking via a POSI┆ 0x04f200…09e600 58 2d 63 6f 6d 70 61 74 69 62 6c 65 20 6c 6f 63 6b 66 28 29 20 63 61 6c 6c 29 2c 20 6c 6f 63 6b ┆X-compatible lockf() call), lock┆ 0x04f200…09e600 66 28 29 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 65 6e 73 75 72 65 0a 74 68 61 74 20 77 ┆f() can be used to ensure that w┆ 0x04f200…09e600 72 69 74 65 73 20 64 6f 6e 27 74 20 73 74 65 70 20 6f 6e 20 65 61 63 68 20 6f 74 68 65 72 2e 20 ┆rites don't step on each other. ┆ 0x04f200…09e600 53 79 73 74 65 6d 73 20 77 69 74 68 20 74 68 65 20 58 45 4e 49 58 20 33 2e 30 2d 64 65 72 69 76 ┆Systems with the XENIX 3.0-deriv┆ 0x04f200…09e600 65 64 0a 6c 6f 63 6b 69 6e 67 28 32 29 20 63 61 6c 6c 20 63 61 6e 20 69 6d 70 6c 65 6d 65 6e 74 ┆ed locking(2) call can implement┆ 0x04f200…09e600 20 6d 6f 73 74 20 6f 66 20 6c 6f 63 6b 66 28 29 2e 20 43 6f 64 65 20 69 73 20 69 6e 63 6c 75 64 ┆ most of lockf(). Code is includ┆ 0x04f200…09e600 65 64 20 74 6f 20 75 73 65 20 74 68 65 73 65 0a 63 61 6c 6c 73 3b 20 69 74 20 69 73 20 63 6f 6e ┆ed to use these calls; it is con┆ 0x04f200…09e600 64 69 74 69 6f 6e 61 6c 20 6f 6e 20 74 68 65 20 4c 4f 43 4b 46 20 6f 72 20 4c 4f 43 4b 49 4e 47 ┆ditional on the LOCKF or LOCKING┆ 0x04f200…09e600 20 73 79 6d 62 6f 6c 73 20 69 6e 20 63 6f 6e 66 69 67 2e 68 2e 0a 0a 20 20 20 4f 6e 20 53 56 72 ┆ symbols in config.h. On SVr┆ 0x04f200…09e600 32 20 73 79 73 74 65 6d 73 20 77 69 74 68 6f 75 74 20 6c 6f 63 6b 66 28 29 20 62 75 74 20 77 69 ┆2 systems without lockf() but wi┆ 0x04f200…09e600 74 68 20 6d 61 6e 64 61 74 6f 72 79 20 6c 6f 63 6b 69 6e 67 20 76 69 61 20 66 63 74 6c 28 32 29 ┆th mandatory locking via fctl(2)┆ 0x04f200…09e600 2c 20 61 6e 64 0a 42 53 44 20 73 79 73 74 65 6d 73 20 77 69 74 68 20 46 49 4f 4e 43 4c 45 58 2c ┆, and BSD systems with FIONCLEX,┆ 0x04f200…09e600 20 74 68 65 20 65 6e 74 69 72 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6c 6f 63 ┆ the entire database file is loc┆ 0x04f200…09e600 6b 65 64 20 66 6f 72 20 65 78 63 6c 75 73 69 76 65 0a 61 63 63 65 73 73 20 62 79 20 64 62 6d 6f ┆ked for exclusive access by dbmo┆ 0x04f200…09e600 70 65 6e 28 29 3b 20 74 68 69 73 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 6f 74 68 65 72 20 70 ┆pen(); this ensures that other p┆ 0x04f200…09e600 72 6f 63 65 73 73 65 73 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 77 72 69 74 65 0a 74 6f 20 ┆rocesses attempting to write to ┆ 0x04f200…09e600 69 74 20 73 6c 65 65 70 20 75 6e 74 69 6c 20 74 68 65 20 63 61 6c 6c 65 72 20 65 78 69 74 73 20 ┆it sleep until the caller exits ┆ 0x04f200…09e600 28 74 68 69 73 20 63 6f 64 65 20 69 73 20 75 6e 74 65 73 74 65 64 20 62 75 74 20 73 69 6d 70 6c ┆(this code is untested but simpl┆ 0x04f200…09e600 65 20 65 6e 6f 75 67 68 0a 74 68 61 74 20 69 74 20 6c 69 6b 65 6c 79 20 77 6f 72 6b 73 20 61 73 ┆e enough that it likely works as┆ 0x04f200…09e600 20 69 73 3b 20 73 65 65 20 74 68 65 20 74 65 78 74 20 6f 66 20 64 62 6d 6f 70 65 6e 28 29 20 66 ┆ is; see the text of dbmopen() f┆ 0x04f200…09e600 6f 72 20 64 65 74 61 69 6c 73 29 2e 0a 0a 20 20 20 4f 6e 20 55 4e 49 58 65 73 20 77 69 74 68 20 ┆or details). On UNIXes with ┆ 0x04f200…09e600 6e 6f 6e 65 20 6f 66 20 74 68 65 20 61 62 6f 76 65 2c 20 64 62 6d 70 75 74 28 29 20 69 6e 74 65 ┆none of the above, dbmput() inte┆ 0x04f200…09e600 72 61 63 74 73 20 73 61 6e 65 6c 79 20 77 69 74 68 20 72 65 61 64 65 72 73 0a 69 6e 20 6f 74 68 ┆racts sanely with readers in oth┆ 0x04f200…09e600 65 72 20 70 72 6f 63 65 73 73 65 73 2c 20 62 75 74 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c ┆er processes, but not necessaril┆ 0x04f200…09e600 79 20 77 69 74 68 20 6f 74 68 65 72 20 77 72 69 74 65 72 73 2e 20 49 74 20 69 73 20 6f 6e 6c 79 ┆y with other writers. It is only┆ 0x04f200…09e600 20 0a 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 77 6f 72 6b 20 70 72 6f 70 65 72 6c 79 20 69 66 ┆ guaranteed to work properly if┆ 0x04f200…09e600 20 74 68 65 72 65 20 69 73 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 77 72 69 74 65 72 20 61 63 74 ┆ there is at most one writer act┆ 0x04f200…09e600 69 76 65 20 61 74 20 61 6e 79 20 67 69 76 65 6e 0a 74 69 6d 65 2e 0a 0a 20 20 20 49 66 20 74 68 ┆ive at any given time. If th┆ 0x04f200…09e600 65 20 53 48 41 52 45 44 20 73 79 6d 62 6f 6c 20 69 73 20 6f 6e 2c 20 61 6c 6c 20 6e 75 6d 65 72 ┆e SHARED symbol is on, all numer┆ 0x04f200…09e600 69 63 20 64 61 74 61 20 69 6e 20 74 68 65 20 64 61 74 75 6d 20 73 74 72 75 63 74 75 72 65 73 20 ┆ic data in the datum structures ┆ 0x04f200…09e600 73 68 6f 75 6c 64 0a 62 65 20 6d 61 69 6e 74 61 69 6e 65 64 20 69 6e 20 61 20 6d 61 63 68 69 6e ┆should be maintained in a machin┆ 0x04f200…09e600 65 2d 69 6e 64 65 70 65 6e 64 65 6e 74 20 62 79 74 65 20 6f 72 64 65 72 20 66 6f 72 20 61 63 63 ┆e-independent byte order for acc┆ 0x04f200…09e600 65 73 73 20 62 79 20 68 65 74 65 72 6f 67 65 6e 6f 75 73 0a 6d 61 63 68 69 6e 65 73 20 76 69 61 ┆ess by heterogenous machines via┆ 0x04f200…09e600 20 4e 46 53 20 6f 72 20 52 46 53 2e 20 4e 61 74 75 72 61 6c 6c 79 2c 20 74 68 69 73 20 63 6f 73 ┆ NFS or RFS. Naturally, this cos┆ 0x04f200…09e600 74 73 20 73 6f 6d 65 20 63 6f 6e 76 65 72 73 69 6f 6e 20 6f 76 65 72 68 65 61 64 20 6f 6e 0a 65 ┆ts some conversion overhead on e┆ 0x04f200…09e600 61 63 68 20 61 63 63 65 73 73 2e 0a 0a 4e 4f 54 45 0a 20 20 20 49 66 20 79 6f 75 72 20 70 72 6f ┆ach access. NOTE If your pro┆ 0x04f200…09e600 63 65 73 73 6f 72 20 68 61 73 20 6e 6f 20 61 6c 69 67 6e 6d 65 6e 74 20 72 65 73 74 72 69 63 74 ┆cessor has no alignment restrict┆ 0x04f200…09e600 69 6f 6e 73 20 6f 6e 20 6c 6f 6e 67 73 2c 20 64 65 66 69 6e 65 0a 4e 4f 5f 41 4c 49 47 4e 4d 45 ┆ions on longs, define NO_ALIGNME┆ 0x04f200…09e600 4e 54 20 66 6f 72 20 61 20 73 75 62 73 74 61 74 69 61 6c 20 73 70 65 65 64 75 70 2e 20 54 68 69 ┆NT for a substatial speedup. Thi┆ 0x04f200…09e600 73 20 69 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 6f 6e 65 20 66 6f 72 0a 73 6f 6d 65 ┆s is automatically done for some┆ 0x04f200…09e600 20 70 72 6f 63 65 73 73 6f 72 73 2e 0a 0a 42 55 47 53 0a 20 20 20 54 68 65 20 53 48 41 52 45 44 ┆ processors. BUGS The SHARED┆ 0x04f200…09e600 20 63 6f 64 65 20 64 6f 65 73 6e 27 74 20 77 6f 72 6b 20 79 65 74 2e 0a 20 20 20 49 74 20 77 6f ┆ code doesn't work yet. It wo┆ 0x04f200…09e600 75 6c 64 20 62 65 20 6e 69 63 65 20 69 66 20 74 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 63 6f ┆uld be nice if these routines co┆ 0x04f200…09e600 75 6c 64 20 63 72 65 61 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 61 6e ┆uld create the database files an┆ 0x04f200…09e600 64 0a 67 6f 20 77 68 65 6e 20 74 68 65 79 20 64 6f 6e 27 74 20 61 6c 72 65 61 64 79 20 65 78 69 ┆d go when they don't already exi┆ 0x04f200…09e600 73 74 2e 20 55 6e 66 6f 72 74 75 6e 61 74 65 6c 79 2c 20 74 72 79 69 6e 67 20 74 6f 20 75 73 65 ┆st. Unfortunately, trying to use┆ 0x04f200…09e600 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 0a 63 72 65 61 74 28 29 20 63 61 6c 6c 73 20 70 72 6f 64 75 ┆ conditional creat() calls produ┆ 0x04f200…09e600 63 65 73 20 77 65 69 72 64 20 62 75 67 73 20 28 73 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 77 72 ┆ces weird bugs (specifically, wr┆ 0x04f200…09e600 69 74 65 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 64 6f 6e 27 74 0a 63 6f 6d 70 6c ┆ites to the database don't compl┆ 0x04f200…09e600 65 74 65 20 75 6e 74 69 6c 20 61 66 74 65 72 20 74 68 65 20 65 78 69 74 28 29 20 66 6f 6c 6c 6f ┆ete until after the exit() follo┆ 0x04f200…09e600 77 69 6e 67 20 74 68 65 20 66 69 6c 65 73 27 20 63 72 65 61 74 69 6f 6e 29 2e 20 41 64 64 69 6e ┆wing the files' creation). Addin┆ 0x04f200…09e600 67 20 73 79 6e 63 28 29 0a 63 61 6c 6c 73 20 64 6f 65 73 6e 27 74 20 68 65 6c 70 20 65 69 74 68 ┆g sync() calls doesn't help eith┆ 0x04f200…09e600 65 72 2e 20 53 69 67 68 2e 2e 2e 0a 20 20 20 42 65 63 61 75 73 65 20 74 68 65 20 74 68 69 72 64 ┆er. Sigh... Because the third┆ 0x04f200…09e600 20 61 72 67 75 6d 65 6e 74 73 20 6f 66 20 72 65 61 64 73 28 29 20 61 6e 64 20 77 72 69 74 65 73 ┆ arguments of reads() and writes┆ 0x04f200…09e600 28 29 20 61 72 65 20 69 6e 74 73 20 6f 6e 20 56 37 2f 42 53 44 0a 73 79 73 74 65 6d 73 20 28 72 ┆() are ints on V7/BSD systems (r┆ 0x04f200…09e600 61 74 68 65 72 20 74 68 61 6e 20 75 6e 73 69 67 6e 65 64 20 61 73 20 6f 6e 20 55 53 47 20 73 79 ┆ather than unsigned as on USG sy┆ 0x04f200…09e600 73 74 65 6d 73 29 20 63 6f 6e 74 65 6e 74 20 6c 65 6e 67 74 68 73 20 77 69 74 68 0a 74 68 65 20 ┆stems) content lengths with the ┆ 0x04f200…09e600 68 69 67 68 20 62 69 74 73 20 6f 6e 20 6d 61 79 20 64 6f 20 77 65 69 72 64 20 74 68 69 6e 67 73 ┆high bits on may do weird things┆ 0x04f200…09e600 2e 0a 0a 46 49 4c 45 53 0a 20 20 20 3c 66 69 6c 65 3e 2e 64 69 72 20 20 2d 2d 20 64 61 74 61 62 ┆. FILES <file>.dir -- datab┆ 0x04f200…09e600 61 73 65 20 6b 65 79 20 64 69 72 65 63 74 6f 72 79 0a 20 20 20 3c 66 69 6c 65 3e 2e 70 61 67 20 ┆ase key directory <file>.pag ┆ 0x04f200…09e600 20 2d 2d 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 69 6e 64 65 78 0a 20 20 20 3c 66 69 6c 65 ┆ -- database page index <file┆ 0x04f200…09e600 3e 2e 64 61 74 20 20 2d 2d 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 65 6e 74 20 66 69 6c 65 0a ┆>.dat -- database content file ┆ 0x04f200…09e600 0a 4c 45 47 41 4c 20 4e 4f 54 45 0a 20 20 20 55 73 65 20 6f 66 20 74 68 69 73 20 63 6f 64 65 20 ┆ LEGAL NOTE Use of this code ┆ 0x04f200…09e600 64 6f 65 73 20 2a 6e 6f 74 2a 20 72 65 71 75 69 72 65 20 61 6e 20 41 54 26 54 20 6f 72 20 42 53 ┆does *not* require an AT&T or BS┆ 0x04f200…09e600 44 20 73 6f 75 72 63 65 20 6c 69 63 65 6e 73 65 2e 0a 20 20 20 54 68 69 73 20 63 6f 64 65 20 69 ┆D source license. This code i┆ 0x04f200…09e600 73 20 61 20 64 69 73 74 61 6e 74 20 64 65 73 63 65 6e 64 61 6e 74 20 6f 66 20 56 37 27 73 20 64 ┆s a distant descendant of V7's d┆ 0x04f200…09e600 62 6d 28 33 29 20 72 6f 75 74 69 6e 65 73 2c 20 62 79 20 77 61 79 20 6f 66 0a 4a 61 6d 65 73 20 ┆bm(3) routines, by way of James ┆ 0x04f200…09e600 47 6f 73 6c 69 6e 67 27 73 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 20 6f 66 20 42 53 44 20 6e 64 ┆Gosling's modification of BSD nd┆ 0x04f200…09e600 62 6d 28 29 20 61 73 20 66 6f 75 6e 64 20 69 6e 20 61 6e 63 69 65 6e 74 20 67 6f 73 6d 61 63 73 ┆bm() as found in ancient gosmacs┆ 0x04f200…09e600 0a 76 65 72 73 69 6f 6e 73 20 61 6e 64 20 69 6e 20 74 68 65 20 58 20 77 69 6e 64 6f 77 20 73 79 ┆ versions and in the X window sy┆ 0x04f200…09e600 73 74 65 6d 20 64 69 73 74 72 69 62 75 74 69 6f 6e 2e 0a 20 20 20 41 54 26 54 20 68 61 73 20 70 ┆stem distribution. AT&T has p┆ 0x04f200…09e600 65 72 6d 69 74 74 65 64 20 75 73 65 20 6f 66 20 74 68 65 20 67 6f 73 6d 61 63 73 20 6e 64 62 6d ┆ermitted use of the gosmacs ndbm┆ 0x04f200…09e600 20 63 6f 64 65 20 69 6e 20 63 6f 6d 6d 65 72 63 69 61 6c 20 70 72 6f 64 75 63 74 0a 77 69 74 68 ┆ code in commercial product with┆ 0x04f200…09e600 6f 75 74 20 66 65 65 20 6f 72 20 6c 65 67 61 6c 20 68 69 6e 64 72 61 6e 63 65 20 73 69 6e 63 65 ┆out fee or legal hindrance since┆ 0x04f200…09e600 20 31 39 38 32 20 74 68 75 73 20 69 6d 70 6c 69 63 69 74 6c 79 20 72 65 6c 65 61 73 69 6e 67 20 ┆ 1982 thus implicitly releasing ┆ 0x04f200…09e600 69 74 20 66 6f 72 0a 75 6e 72 65 73 74 72 69 63 74 65 64 20 75 73 65 2e 0a 20 20 20 49 6e 20 61 ┆it for unrestricted use. In a┆ 0x04f200…09e600 6e 79 20 63 61 73 65 2c 20 74 68 69 73 20 76 65 72 73 69 6f 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 ┆ny case, this version no longer ┆ 0x04f200…09e600 75 73 65 73 20 74 68 65 20 68 61 73 68 20 63 6f 6e 73 74 61 6e 74 73 20 6f 66 20 56 37 20 6e 64 ┆uses the hash constants of V7 nd┆ 0x04f200…09e600 62 6d 2c 0a 6e 6f 72 20 64 6f 65 73 20 69 74 20 64 65 70 65 6e 64 20 6f 6e 20 61 6e 79 20 41 54 ┆bm, nor does it depend on any AT┆ 0x04f200…09e600 26 54 20 6f 72 20 42 53 44 20 70 72 6f 70 72 69 65 74 61 72 79 20 63 6f 64 65 2e 20 54 68 6f 75 ┆&T or BSD proprietary code. Thou┆ 0x04f200…09e600 67 68 20 74 68 65 20 61 6c 67 6f 72 69 74 68 6d 73 0a 72 65 6d 61 69 6e 20 73 69 6d 69 6c 61 72 ┆gh the algorithms remain similar┆ 0x04f200…09e600 20 74 6f 20 74 68 6f 73 65 20 6f 66 20 6e 64 62 6d 2c 20 74 68 65 20 69 6e 74 65 72 66 61 63 65 ┆ to those of ndbm, the interface┆ 0x04f200…09e600 20 61 6e 64 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6c 6f 67 69 63 20 64 69 66 66 65 72 ┆ and implementation logic differ┆ 0x04f200…09e600 0a 66 72 6f 6d 20 69 74 20 69 6e 20 73 69 67 6e 69 66 69 63 61 6e 74 20 77 61 79 73 2e 20 54 68 ┆ from it in significant ways. Th┆ 0x04f200…09e600 69 73 20 63 6f 64 65 20 6d 75 73 74 20 74 68 65 72 65 66 6f 72 65 20 62 65 20 6c 65 67 61 6c 6c ┆is code must therefore be legall┆ 0x04f200…09e600 79 20 63 6f 6e 73 69 64 65 72 65 64 20 61 6e 0a 69 6e 64 65 70 65 6e 64 65 6e 74 20 77 6f 72 6b ┆y considered an independent work┆ 0x04f200…09e600 20 6f 66 20 74 68 65 20 61 75 74 68 6f 72 2e 0a 0a 49 4e 54 45 52 4e 41 4c 53 0a 20 20 20 44 61 ┆ of the author. INTERNALS Da┆ 0x04f200…09e600 74 61 62 61 73 65 20 74 75 70 6c 65 73 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20 2e 70 61 67 ┆tabase tuples are stored in .pag┆ 0x04f200…09e600 20 66 69 6c 65 20 62 6c 6f 63 6b 73 20 61 73 20 28 6b 65 79 2c 20 6f 66 66 73 65 74 2c 20 6c 65 ┆ file blocks as (key, offset, le┆ 0x04f200…09e600 6e 29 20 77 69 74 68 0a 74 68 65 20 6b 65 79 20 61 6e 64 20 74 68 65 20 6f 66 66 73 65 74 20 61 ┆n) with the key and the offset a┆ 0x04f200…09e600 6e 64 20 6c 65 6e 67 74 68 20 6f 66 20 69 74 73 20 64 61 74 75 6d 20 69 6e 20 74 68 65 20 2e 64 ┆nd length of its datum in the .d┆ 0x04f200…09e600 61 74 20 66 69 6c 65 20 62 65 69 6e 67 20 73 74 6f 72 65 64 0a 6e 65 78 74 20 74 6f 20 65 61 63 ┆at file being stored next to eac┆ 0x04f200…09e600 68 20 6f 74 68 65 72 2e 20 54 68 65 20 66 6f 72 6d 61 74 20 6f 66 20 65 61 63 68 20 2e 70 61 67 ┆h other. The format of each .pag┆ 0x04f200…09e600 20 62 6c 6f 63 6b 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 20 28 77 69 74 68 20 73 20 3d 20 0a ┆ block is as follows (with s = ┆ 0x04f200…09e600 73 69 7a 65 6f 66 28 73 68 6f 72 74 29 2c 20 6c 20 3d 20 73 69 7a 65 6f 66 28 6c 6f 6e 67 29 29 ┆sizeof(short), l = sizeof(long))┆ 0x04f200…09e600 3a 0a 0a 09 20 20 20 20 20 30 73 3a 20 69 74 65 6d 5f 63 6f 75 6e 74 0a 09 20 20 20 20 20 31 73 ┆: 0s: item_count 1s┆ 0x04f200…09e600 3a 20 6f 64 30 20 28 62 75 66 66 65 72 20 6f 66 66 73 65 74 20 6f 66 20 64 61 74 75 6d 20 30 29 ┆: od0 (buffer offset of datum 0)┆ 0x04f200…09e600 0a 09 20 20 20 20 20 32 73 3a 20 6f 64 31 20 28 62 75 66 66 65 72 20 6f 66 66 73 65 74 20 6f 66 ┆ 2s: od1 (buffer offset of┆ 0x04f200…09e600 20 64 61 74 75 6d 20 31 29 0a 09 09 20 2e 2e 2e 0a 09 20 20 20 28 6e 29 73 3a 20 6f 64 6e 20 28 ┆ datum 1) ... (n)s: odn (┆ 0x04f200…09e600 62 75 66 66 65 72 20 6f 66 66 73 65 74 20 6f 66 20 64 61 74 75 6d 20 6e 29 0a 0a 09 09 20 3c 66 ┆buffer offset of datum n) <f┆ 0x04f200…09e600 72 65 65 20 73 70 61 63 65 3e 0a 0a 09 20 20 20 20 6f 64 6e 3a 20 2e 64 61 74 20 73 65 65 6b 20 ┆ree space> odn: .dat seek ┆ 0x04f200…09e600 61 64 64 72 65 73 73 20 6f 66 20 64 61 74 75 6d 20 6e 0a 09 20 20 6f 64 6e 2b 6c 3a 20 6c 65 6e ┆address of datum n odn+l: len┆ 0x04f200…09e600 67 74 68 20 6f 66 20 64 61 74 75 6d 20 6e 0a 09 20 30 64 6e 2b 32 6c 3a 20 73 74 61 72 74 20 6f ┆gth of datum n 0dn+2l: start o┆ 0x04f200…09e600 66 20 6b 65 79 20 6f 66 20 64 61 74 75 6d 20 6e 0a 09 09 20 2e 2e 2e 0a 09 20 20 20 20 6f 64 31 ┆f key of datum n ... od1┆ 0x04f200…09e600 3a 20 2e 64 61 74 20 73 65 65 6b 20 61 64 64 72 65 73 73 20 6f 66 20 64 61 74 75 6d 20 31 0a 09 ┆: .dat seek address of datum 1 ┆ 0x04f200…09e600 20 20 6f 64 31 2b 6c 3a 20 6c 65 6e 67 74 68 20 6f 66 20 64 61 74 75 6d 20 31 0a 09 20 30 64 31 ┆ od1+l: length of datum 1 0d1┆ 0x04f200…09e600 2b 32 6c 3a 20 73 74 61 72 74 20 6f 66 20 6b 65 79 20 6f 66 20 64 61 74 75 6d 20 31 0a 09 20 20 ┆+2l: start of key of datum 1 ┆ 0x04f200…09e600 20 20 6f 64 30 3a 20 2e 64 61 74 20 73 65 65 6b 20 61 64 64 72 65 73 73 20 6f 66 20 64 61 74 75 ┆ od0: .dat seek address of datu┆ 0x04f200…09e600 6d 20 30 0a 09 20 20 6f 64 30 2b 6c 3a 20 6c 65 6e 67 74 68 20 6f 66 20 64 61 74 75 6d 20 30 0a ┆m 0 od0+l: length of datum 0 ┆ 0x04f200…09e600 09 20 30 64 30 2b 32 6c 3a 20 73 74 61 72 74 20 6f 66 20 6b 65 79 20 6f 66 20 64 61 74 75 6d 20 ┆ 0d0+2l: start of key of datum ┆ 0x04f200…09e600 30 0a 09 09 20 3c 65 6e 64 20 6f 66 20 2e 70 61 67 20 66 69 6c 65 20 62 6c 6f 63 6b 3e 0a 0a 20 ┆0 <end of .pag file block> ┆ 0x04f200…09e600 20 20 54 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 61 6e 79 20 69 74 65 6d 20 63 61 6e 20 62 65 20 ┆ The length of any item can be ┆ 0x04f200…09e600 63 6f 6d 70 75 74 65 64 20 61 73 20 28 6f 66 66 73 65 74 20 6f 66 20 70 72 65 76 69 6f 75 73 20 ┆computed as (offset of previous ┆ 0x04f200…09e600 69 74 65 6d 29 20 2d 0a 28 6f 66 66 73 65 74 20 6f 66 20 74 68 69 73 20 69 74 65 6d 29 2c 20 77 ┆item) - (offset of this item), w┆ 0x04f200…09e600 68 65 72 65 20 74 68 65 20 60 6f 66 66 73 65 74 27 20 6f 66 20 69 74 65 6d 20 6e 75 6d 62 65 72 ┆here the `offset' of item number┆ 0x04f200…09e600 20 2d 31 20 69 73 20 74 68 65 20 62 6c 6f 63 6b 0a 73 69 7a 65 2e 0a 20 20 20 54 68 65 20 2e 70 ┆ -1 is the block size. The .p┆ 0x04f200…09e600 61 67 20 66 69 6c 65 73 20 67 72 6f 77 20 6d 6f 72 65 20 6f 72 20 6c 65 73 73 20 62 79 20 70 6f ┆ag files grow more or less by po┆ 0x04f200…09e600 77 65 72 73 20 6f 66 20 74 77 6f 20 28 69 6d 61 67 69 6e 65 20 61 20 74 72 65 65 20 77 69 74 68 ┆wers of two (imagine a tree with┆ 0x04f200…09e600 0a 74 68 65 20 6e 6f 64 65 73 20 6e 75 6d 62 65 72 65 64 20 74 68 75 73 3a 0a 0a 6c 65 76 65 6c ┆ the nodes numbered thus: level┆ 0x04f200…09e600 09 20 20 20 20 20 20 74 72 65 65 09 09 68 61 73 68 20 6d 61 73 6b 20 28 69 6e 20 62 69 6e 61 72 ┆ tree hash mask (in binar┆ 0x04f200…09e600 79 29 0a 30 3a 09 09 30 09 09 09 30 30 30 30 0a 31 3a 09 20 20 20 20 30 09 20 20 20 20 31 09 09 ┆y) 0: 0 0000 1: 0 1 ┆ 0x04f200…09e600 09 30 30 30 31 0a 32 3a 09 20 20 30 20 20 20 32 20 20 20 31 20 20 20 33 09 09 09 30 30 31 31 0a ┆ 0001 2: 0 2 1 3 0011 ┆ 0x04f200…09e600 33 3a 20 20 20 20 20 20 20 30 20 34 20 32 20 36 20 31 20 35 20 33 20 37 09 09 30 31 31 31 0a 09 ┆3: 0 4 2 6 1 5 3 7 0111 ┆ 0x04f200…09e600 20 2d 2d 2d 2d 2d 2d 2d 20 2d 2d 2d 2d 2d 2d 2d 0a 09 20 20 74 68 65 73 65 09 20 20 20 74 68 65 ┆ ------- ------- these the┆ 0x04f200…09e600 73 65 0a 09 20 68 61 73 68 20 74 6f 20 20 68 61 73 68 20 74 6f 0a 09 20 20 58 58 58 30 09 20 20 ┆se hash to hash to XXX0 ┆ 0x04f200…09e600 20 58 58 58 31 0a 0a 65 74 63 2e 29 2e 20 20 49 6e 20 61 20 66 72 65 73 68 20 64 61 74 61 62 61 ┆ XXX1 etc.). In a fresh databa┆ 0x04f200…09e600 73 65 2c 20 79 6f 75 20 73 74 61 72 74 20 61 74 20 6c 65 76 65 6c 20 30 2c 20 61 6e 64 20 74 6f ┆se, you start at level 0, and to┆ 0x04f200…09e600 20 73 74 6f 72 65 20 61 6e 0a 69 74 65 6d 2c 20 79 6f 75 20 63 6f 6d 70 75 74 65 20 61 20 68 61 ┆ store an item, you compute a ha┆ 0x04f200…09e600 73 68 20 6e 75 6d 62 65 72 20 66 6f 72 20 69 74 2c 20 74 68 65 6e 20 75 73 65 20 6e 6f 20 62 69 ┆sh number for it, then use no bi┆ 0x04f200…09e600 74 73 3b 20 61 6c 6c 20 69 74 65 6d 73 0a 74 68 75 73 20 77 69 6e 64 20 75 70 20 69 6e 20 6e 6f ┆ts; all items thus wind up in no┆ 0x04f200…09e600 64 65 20 30 2e 20 20 57 68 65 6e 20 6e 6f 64 65 20 7a 65 72 6f 20 67 65 74 73 20 66 75 6c 6c 2c ┆de 0. When node zero gets full,┆ 0x04f200…09e600 20 79 6f 75 20 60 73 70 6c 69 74 27 20 74 6f 20 6c 65 76 65 6c 0a 31 2c 20 72 65 63 6f 6d 70 75 ┆ you `split' to level 1, recompu┆ 0x04f200…09e600 74 69 6e 67 20 74 68 65 20 68 61 73 68 20 66 6f 72 20 65 61 63 68 20 69 74 65 6d 20 69 6e 20 30 ┆ting the hash for each item in 0┆ 0x04f200…09e600 3b 20 79 6f 75 20 6e 6f 77 20 75 73 65 20 6f 6e 65 20 62 69 74 20 74 6f 20 6d 6f 76 65 0a 61 62 ┆; you now use one bit to move ab┆ 0x04f200…09e600 6f 75 74 20 68 61 6c 66 20 74 68 65 20 64 61 74 61 20 74 6f 20 6e 6f 64 65 20 31 2e 20 20 49 66 ┆out half the data to node 1. If┆ 0x04f200…09e600 20 6e 6f 64 65 20 30 20 67 65 74 73 20 66 75 6c 6c 20 61 67 61 69 6e 2c 20 79 6f 75 20 73 74 61 ┆ node 0 gets full again, you sta┆ 0x04f200…09e600 72 74 0a 75 73 69 6e 67 20 74 77 6f 20 62 69 74 73 2c 20 61 6e 64 20 28 73 69 6e 63 65 20 74 68 ┆rt using two bits, and (since th┆ 0x04f200…09e600 65 20 74 68 69 6e 67 73 20 69 6e 20 69 74 20 61 6c 6c 20 65 6e 64 20 77 69 74 68 20 61 20 7a 65 ┆e things in it all end with a ze┆ 0x04f200…09e600 72 6f 20 62 69 74 29 0a 61 62 6f 75 74 20 68 61 6c 66 20 74 68 65 20 69 74 65 6d 73 20 6d 6f 76 ┆ro bit) about half the items mov┆ 0x04f200…09e600 65 20 74 6f 20 6e 6f 64 65 20 32 3b 20 69 66 20 6e 6f 64 65 20 31 20 67 65 74 73 20 66 75 6c 6c ┆e to node 2; if node 1 gets full┆ 0x04f200…09e600 2c 20 79 6f 75 20 73 74 61 72 74 0a 75 73 69 6e 67 20 74 77 6f 20 62 69 74 73 20 74 68 65 72 65 ┆, you start using two bits there┆ 0x04f200…09e600 20 61 6e 64 20 61 62 6f 75 74 20 68 61 6c 66 20 6d 6f 76 65 20 74 6f 20 33 2e 0a 20 20 20 49 74 ┆ and about half move to 3. It┆ 0x04f200…09e600 20 74 61 6b 65 73 20 6f 6e 65 20 62 69 74 20 70 65 72 20 6e 6f 64 65 20 70 65 72 20 6c 65 76 65 ┆ takes one bit per node per leve┆ 0x04f200…09e600 6c 20 74 6f 20 72 65 6d 65 6d 62 65 72 20 77 68 61 74 20 77 61 73 20 73 70 6c 69 74 3b 20 74 68 ┆l to remember what was split; th┆ 0x04f200…09e600 69 73 20 62 69 74 0a 63 61 6e 20 62 65 20 6e 61 6d 65 64 20 62 79 20 28 68 61 73 68 20 26 20 6d ┆is bit can be named by (hash & m┆ 0x04f200…09e600 61 73 6b 29 20 2b 20 6d 61 73 6b 2e 20 52 65 6d 65 6d 62 65 72 69 6e 67 20 74 68 65 73 65 20 62 ┆ask) + mask. Remembering these b┆ 0x04f200…09e600 69 74 73 20 69 73 20 77 68 61 74 20 74 68 65 20 2e 64 69 72 0a 66 69 6c 65 20 69 73 20 75 73 65 ┆its is what the .dir file is use┆ 0x04f200…09e600 64 20 66 6f 72 2e 20 49 66 20 79 6f 75 20 67 65 74 20 28 75 6e 29 6c 75 63 6b 79 20 77 69 74 68 ┆d for. If you get (un)lucky with┆ 0x04f200…09e600 20 74 68 65 20 68 61 73 68 66 75 6e 63 74 69 6f 6e 20 6f 72 20 68 61 76 65 20 65 6e 6f 75 67 68 ┆ the hashfunction or have enough┆ 0x04f200…09e600 0a 64 61 74 61 2c 20 74 68 65 20 68 61 73 68 69 6e 67 20 63 6f 75 6c 64 20 6c 65 61 6e 20 6f 6e ┆ data, the hashing could lean on┆ 0x04f200…09e600 20 6f 6e 65 20 70 61 74 68 20 74 68 72 6f 75 67 68 20 74 68 65 20 74 72 65 65 2c 20 6d 61 6b 69 ┆ one path through the tree, maki┆ 0x04f200…09e600 6e 67 20 74 68 65 20 61 70 70 61 72 65 6e 74 0a 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 6d 75 ┆ng the apparent database size mu┆ 0x04f200…09e600 63 68 20 6c 61 72 67 65 72 20 74 68 61 6e 20 69 74 20 61 63 74 75 61 6c 6c 79 20 28 6d 69 6e 75 ┆ch larger than it actually (minu┆ 0x04f200…09e600 73 20 68 6f 6c 65 73 29 20 69 73 2e 0a 20 20 20 54 68 65 20 68 65 61 72 74 20 6f 66 20 74 68 65 ┆s holes) is. The heart of the┆ 0x04f200…09e600 20 77 68 6f 6c 65 20 74 68 69 6e 67 20 69 73 20 74 68 65 20 6c 6f 6f 70 0a 0a 09 68 61 73 68 20 ┆ whole thing is the loop hash ┆ 0x04f200…09e600 3d 20 63 61 6c 63 68 61 73 68 28 69 74 65 6d 29 3b 0a 09 66 6f 72 20 28 68 61 73 68 5f 6d 61 73 ┆= calchash(item); for (hash_mas┆ 0x04f200…09e600 6b 20 3d 20 30 3b 3b 20 68 61 73 68 5f 6d 61 73 6b 20 3d 20 28 68 61 73 68 5f 6d 61 73 6b 20 3c ┆k = 0;; hash_mask = (hash_mask <┆ 0x04f200…09e600 3c 20 31 29 20 2b 20 31 29 20 7b 0a 09 09 73 70 6c 69 74 5f 6d 65 6d 6f 72 79 5f 62 69 74 20 3d ┆< 1) + 1) { split_memory_bit =┆ 0x04f200…09e600 20 28 68 61 73 68 20 26 20 68 61 73 68 5f 6d 61 73 6b 29 20 2b 20 68 61 73 68 5f 6d 61 73 6b 3b ┆ (hash & hash_mask) + hash_mask;┆ 0x04f200…09e600 0a 09 09 69 66 20 28 21 62 69 74 5f 69 73 5f 73 65 74 28 73 70 6c 69 74 5f 6d 65 6d 6f 72 79 5f ┆ if (!bit_is_set(split_memory_┆ 0x04f200…09e600 62 69 74 2c 20 73 70 6c 69 74 5f 6d 61 70 5f 74 61 62 6c 65 29 29 0a 09 09 09 62 72 65 61 6b 3b ┆bit, split_map_table)) break;┆ 0x04f200…09e600 0a 09 7d 0a 09 62 6c 6f 63 6b 20 3d 20 68 61 73 68 20 26 20 68 61 73 68 5f 6d 61 73 6b 3b 0a 09 ┆ } block = hash & hash_mask; ┆ 0x04f200…09e600 28 20 69 74 65 6d 20 69 73 20 65 69 74 68 65 72 20 69 6e 20 6e 6f 64 65 20 60 62 6c 6f 63 6b 27 ┆( item is either in node `block'┆ 0x04f200…09e600 20 6f 72 20 6e 6f 74 20 74 68 65 72 65 20 61 74 20 61 6c 6c 20 29 0a 09 28 20 72 65 61 64 20 74 ┆ or not there at all ) ( read t┆ 0x04f200…09e600 68 61 74 20 6e 6f 64 65 20 61 6e 64 20 73 65 61 72 63 68 20 66 6f 72 20 69 74 20 73 65 71 75 65 ┆hat node and search for it seque┆ 0x04f200…09e600 6e 74 69 61 6c 6c 79 20 29 0a 0a 61 6e 64 2c 20 6f 66 20 63 6f 75 72 73 65 20 74 68 65 20 68 61 ┆ntially ) and, of course the ha┆ 0x04f200…09e600 73 68 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 20 20 28 50 73 65 75 64 6f 63 6f 64 65 20 66 6f 72 ┆shing function. (Pseudocode for┆ 0x04f200…09e600 20 74 68 65 20 73 70 6c 69 74 0a 72 6f 75 74 69 6e 65 20 69 73 20 6c 65 66 74 20 61 73 20 61 6e ┆ the split routine is left as an┆ 0x04f200…09e600 20 65 78 65 72 63 69 73 65 20 66 6f 72 20 74 68 65 20 73 74 75 64 65 6e 74 20 3a 2d 29 20 2e 29 ┆ exercise for the student :-) .)┆ 0x04f200…09e600 0a 20 20 20 54 68 65 20 62 61 73 69 63 20 70 75 72 70 6f 73 65 20 6f 66 20 74 68 65 20 68 61 73 ┆ The basic purpose of the has┆ 0x04f200…09e600 68 20 69 73 20 74 6f 20 74 75 72 6e 20 77 68 61 74 20 6d 69 67 68 74 20 62 65 20 6c 61 72 67 65 ┆h is to turn what might be large┆ 0x04f200…09e600 6c 79 0a 77 65 6c 6c 2d 63 6f 72 72 65 6c 61 74 65 64 20 62 69 74 20 70 61 74 74 65 72 6e 73 20 ┆ly well-correlated bit patterns ┆ 0x04f200…09e600 69 6e 74 6f 20 77 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 6c 61 72 67 65 6c 79 20 72 61 6e 64 ┆into what should be largely rand┆ 0x04f200…09e600 6f 6d 0a 62 69 74 20 70 61 74 74 65 72 6e 73 2e 20 20 54 68 65 20 6d 6f 72 65 20 72 61 6e 64 6f ┆om bit patterns. The more rando┆ 0x04f200…09e600 6d 20 74 68 65 20 62 69 74 20 70 61 74 74 65 72 6e 73 2c 20 74 68 65 20 66 6c 61 74 74 65 72 0a ┆m the bit patterns, the flatter ┆ 0x04f200…09e600 74 68 65 20 6e 6f 64 65 20 74 72 65 65 20 77 69 6c 6c 20 62 65 63 6f 6d 65 2e 0a 0a 41 55 54 48 ┆the node tree will become. AUTH┆ 0x04f200…09e600 4f 52 0a 20 20 20 45 72 69 63 20 53 2e 20 52 61 79 6d 6f 6e 64 0a 20 20 20 54 68 65 20 49 4e 54 ┆OR Eric S. Raymond The INT┆ 0x04f200…09e600 45 52 4e 41 4c 53 20 73 65 63 74 69 6f 6e 20 69 73 20 70 61 72 74 6c 79 20 62 61 73 65 64 20 6f ┆ERNALS section is partly based o┆ 0x04f200…09e600 6e 20 43 68 72 69 73 20 54 6f 72 65 6b 27 73 20 55 53 45 4e 45 54 20 70 6f 73 74 69 6e 67 0a 3c ┆n Chris Torek's USENET posting <┆ 0x04f200…09e600 31 31 39 35 33 40 6d 69 6d 73 79 2e 55 55 43 50 3e 2c 20 64 61 74 65 64 20 31 34 20 4a 75 6e 20 ┆11953@mimsy.UUCP>, dated 14 Jun ┆ 0x04f200…09e600 38 38 20 30 33 3a 32 37 3a 31 39 20 47 4d 54 2e 0a 20 20 20 54 68 69 73 20 73 6f 66 74 77 61 72 ┆88 03:27:19 GMT. This softwar┆ 0x04f200…09e600 65 20 69 73 20 43 6f 70 79 72 69 67 68 74 20 28 43 29 20 31 39 38 39 20 62 79 20 45 72 69 63 20 ┆e is Copyright (C) 1989 by Eric ┆ 0x04f200…09e600 53 2e 20 52 61 79 6d 6f 6e 64 20 66 6f 72 20 74 68 65 20 73 6f 6c 65 20 70 75 72 70 6f 73 65 0a ┆S. Raymond for the sole purpose ┆ 0x04f200…09e600 6f 66 20 70 72 6f 74 65 63 74 69 6e 67 20 66 72 65 65 20 72 65 64 69 73 74 72 69 62 75 74 69 6f ┆of protecting free redistributio┆ 0x04f200…09e600 6e 3b 20 73 65 65 20 74 68 65 20 4c 49 43 45 4e 53 45 20 66 69 6c 65 20 66 6f 72 20 64 65 74 61 ┆n; see the LICENSE file for deta┆ 0x04f200…09e600 69 6c 73 2e 0a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆ils. **************************┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆********************************┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 4c 49 4e 54 4c 49 42 52 41 52 59 2a 2f 0a 23 ┆*************/ /*LINTLIBRARY*/ #┆ 0x04f200…09e600 69 6e 63 6c 75 64 65 20 22 6c 69 62 70 6f 72 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 65 64 ┆include "libport.h" #include "ed┆ 0x04f200…09e600 62 6d 2e 68 22 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 76 61 78 29 20 7c 7c 20 64 65 66 69 6e ┆bm.h" #if defined(vax) || defin┆ 0x04f200…09e600 65 64 28 69 41 50 58 33 38 36 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 69 33 38 36 29 20 7c 7c 20 ┆ed(iAPX386) || defined(i386) || ┆ 0x04f200…09e600 64 65 66 69 6e 65 64 28 6d 63 36 38 30 33 30 29 0a 23 64 65 66 69 6e 65 20 4e 4f 5f 41 4c 49 47 ┆defined(mc68030) #define NO_ALIG┆ 0x04f200…09e600 4e 4d 45 4e 54 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 48 41 52 45 44 0a 2f 2a 20 23 ┆NMENT #endif #ifdef SHARED /* #┆ 0x04f200…09e600 75 6e 64 65 66 20 53 48 41 52 45 44 09 09 2f 2a 20 53 48 41 52 45 44 20 66 6f 72 6d 61 74 20 64 ┆undef SHARED /* SHARED format d┆ 0x04f200…09e600 6f 65 73 6e 27 74 20 77 6f 72 6b 20 79 65 74 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 ┆oesn't work yet */ #endif #defi┆ 0x04f200…09e600 6e 65 09 42 59 54 45 53 49 5a 09 38 09 2f 2a 20 62 69 74 73 20 70 65 72 20 62 79 74 65 20 2a 2f ┆ne BYTESIZ 8 /* bits per byte */┆ 0x04f200…09e600 0a 23 64 65 66 69 6e 65 20 45 58 54 4c 45 4e 09 35 09 2f 2a 20 6c 65 6e 67 74 68 20 6f 66 20 2e ┆ #define EXTLEN 5 /* length of .┆ 0x04f200…09e600 70 61 67 2c 20 2e 64 69 72 20 6f 72 20 2e 64 61 74 20 65 78 74 65 6e 73 69 6f 6e 20 2b 20 31 20 ┆pag, .dir or .dat extension + 1 ┆ 0x04f200…09e600 4e 55 4c 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 70 72 69 76 61 74 65 0a 23 64 65 66 69 6e 65 20 ┆NUL */ #ifndef private #define ┆ 0x04f200…09e600 70 72 69 76 61 74 65 20 73 74 61 74 69 63 0a 23 65 6e 64 69 66 0a 0a 64 61 74 61 62 61 73 65 20 ┆private static #endif database ┆ 0x04f200…09e600 2a 6c 61 73 74 64 61 74 61 62 61 73 65 3b 0a 66 6f 72 77 61 72 64 20 73 74 61 74 69 63 20 69 6e ┆*lastdatabase; forward static in┆ 0x04f200…09e600 74 20 73 65 74 75 70 5f 64 62 28 29 3b 0a 0a 23 69 66 64 65 66 20 55 4e 49 58 50 43 0a 23 69 66 ┆t setup_db(); #ifdef UNIXPC #if┆ 0x04f200…09e600 64 65 66 20 6c 69 6e 74 0a 69 6e 74 20 6c 6f 63 6b 69 6e 67 28 66 64 2c 20 6f 70 2c 20 73 69 7a ┆def lint int locking(fd, op, siz┆ 0x04f200…09e600 65 29 20 69 6e 74 20 66 64 2c 20 6f 70 3b 20 6c 6f 6e 67 20 73 69 7a 65 3b 20 7b 72 65 74 75 72 ┆e) int fd, op; long size; {retur┆ 0x04f200…09e600 6e 28 28 69 6e 74 29 28 66 64 2b 6f 70 2b 73 69 7a 65 29 29 3b 7d 0a 23 65 6e 64 69 66 0a 23 65 ┆n((int)(fd+op+size));} #endif #e┆ 0x04f200…09e600 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68 65 73 65 20 74 79 70 65 64 65 66 73 20 63 6f 6e 74 72 ┆ndif /* * These typedefs contr┆ 0x04f200…09e600 6f 6c 20 74 68 65 20 73 69 7a 65 73 20 6f 66 20 74 68 65 20 6e 75 6d 65 72 69 63 20 69 74 65 6d ┆ol the sizes of the numeric item┆ 0x04f200…09e600 73 20 69 6e 20 61 20 2e 70 61 67 20 62 6c 6f 63 6b 2e 0a 20 2a 20 54 68 65 20 6c 65 66 74 20 73 ┆s in a .pag block. * The left s┆ 0x04f200…09e600 69 64 65 20 6f 66 20 74 68 65 20 74 79 70 65 64 65 66 20 6d 61 79 20 62 65 20 6f 6e 65 20 6f 66 ┆ide of the typedef may be one of┆ 0x04f200…09e600 20 73 68 6f 72 74 2c 20 69 6e 74 2c 20 6f 72 20 6c 6f 6e 67 2e 0a 20 2a 20 49 66 20 79 6f 75 27 ┆ short, int, or long. * If you'┆ 0x04f200…09e600 72 65 20 74 72 79 69 6e 67 20 74 6f 20 73 68 61 72 65 20 64 61 74 61 62 61 73 65 73 20 62 65 74 ┆re trying to share databases bet┆ 0x04f200…09e600 77 65 65 6e 20 64 69 66 66 65 72 65 6e 74 20 6d 61 63 68 69 6e 65 73 2c 20 63 68 6f 6f 73 65 0a ┆ween different machines, choose ┆ 0x04f200…09e600 20 2a 20 76 61 6c 75 65 73 20 66 6f 72 20 74 68 65 73 65 20 6f 6e 20 65 61 63 68 20 6d 61 63 68 ┆ * values for these on each mach┆ 0x04f200…09e600 69 6e 65 20 74 68 61 74 20 67 69 76 65 20 74 68 65 20 73 61 6d 65 20 62 79 74 65 20 73 69 7a 65 ┆ine that give the same byte size┆ 0x04f200…09e600 73 20 6f 6e 20 61 6c 6c 2e 0a 20 2a 20 54 68 69 73 20 6d 69 67 68 74 20 6d 65 61 6e 20 6d 61 6b ┆s on all. * This might mean mak┆ 0x04f200…09e600 69 6e 67 20 27 73 73 68 6f 72 74 27 20 61 20 6c 6f 6e 67 20 6f 72 20 69 6e 74 2c 20 6f 72 20 27 ┆ing 'sshort' a long or int, or '┆ 0x04f200…09e600 73 6c 6f 6e 67 27 20 61 6e 20 69 6e 74 2e 0a 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 68 6f 72 74 ┆slong' an int. */ typedef short┆ 0x04f200…09e600 20 73 73 68 6f 72 74 3b 09 2f 2a 20 32 2d 62 79 74 65 20 69 6e 74 65 67 72 61 6c 20 74 79 70 65 ┆ sshort; /* 2-byte integral type┆ 0x04f200…09e600 20 2a 2f 0a 74 79 70 65 64 65 66 20 6c 6f 6e 67 20 73 6c 6f 6e 67 3b 09 2f 2a 20 34 2d 62 79 74 ┆ */ typedef long slong; /* 4-byt┆ 0x04f200…09e600 65 20 69 6e 74 65 72 6e 61 6c 20 74 79 70 65 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 48 41 52 45 ┆e internal type */ #ifdef SHARE┆ 0x04f200…09e600 44 0a 2f 2a 0a 20 2a 20 54 68 69 73 20 63 6f 64 65 20 77 6f 72 6b 73 20 62 79 20 74 72 61 6e 73 ┆D /* * This code works by trans┆ 0x04f200…09e600 6c 61 74 69 6e 67 20 2e 70 61 67 20 62 6c 6f 63 6b 73 20 6f 75 74 20 6f 66 20 61 20 66 69 78 65 ┆lating .pag blocks out of a fixe┆ 0x04f200…09e600 64 20 62 69 67 2d 65 6e 64 69 61 6e 20 66 6f 72 6d 61 74 0a 20 2a 20 6a 75 73 74 20 61 66 74 65 ┆d big-endian format * just afte┆ 0x04f200…09e600 72 20 74 68 65 79 27 72 65 20 72 65 61 64 20 69 6e 74 6f 20 63 6f 72 65 2c 20 61 6e 64 20 69 6e ┆r they're read into core, and in┆ 0x04f200…09e600 74 6f 20 69 74 20 6a 75 73 74 20 62 65 66 6f 72 65 20 74 68 65 79 27 72 65 20 77 72 69 74 74 65 ┆to it just before they're writte┆ 0x04f200…09e600 6e 0a 20 2a 20 6f 75 74 2e 20 54 68 65 20 2e 64 69 72 20 61 6e 64 20 2e 64 61 74 20 66 6f 72 6d ┆n * out. The .dir and .dat form┆ 0x04f200…09e600 61 74 73 20 61 72 65 20 61 6c 72 65 61 64 79 20 71 75 69 74 65 20 70 6f 72 74 61 62 6c 65 2c 20 ┆ats are already quite portable, ┆ 0x04f200…09e600 64 65 70 65 6e 64 69 6e 67 20 6f 6e 6c 79 20 6f 6e 0a 20 2a 20 42 59 54 45 53 49 5a 2e 20 54 68 ┆depending only on * BYTESIZ. Th┆ 0x04f200…09e600 69 73 20 63 6f 64 65 20 77 69 6c 6c 20 70 65 72 6d 69 74 20 73 68 61 72 69 6e 67 20 62 65 74 77 ┆is code will permit sharing betw┆ 0x04f200…09e600 65 65 6e 20 61 6e 79 20 6d 61 63 68 69 6e 65 73 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 0a 20 ┆een any machines with the same ┆ 0x04f200…09e600 2a 20 73 73 68 6f 72 74 20 61 6e 64 20 73 6c 6f 6e 67 20 73 69 7a 65 73 20 28 68 61 6e 64 6c 69 ┆* sshort and slong sizes (handli┆ 0x04f200…09e600 6e 67 20 64 69 66 66 65 72 65 6e 74 20 73 69 7a 65 73 20 69 73 20 61 20 2a 6d 75 63 68 2a 20 68 ┆ng different sizes is a *much* h┆ 0x04f200…09e600 61 72 64 65 72 20 70 72 6f 62 6c 65 6d 2c 0a 20 2a 20 73 6f 72 72 79 20 61 62 6f 75 74 20 74 68 ┆arder problem, * sorry about th┆ 0x04f200…09e600 61 74 21 29 2e 0a 20 2a 2f 0a 70 72 69 76 61 74 65 20 76 6f 69 64 20 66 72 6f 6d 62 69 67 65 6e ┆at!). */ private void frombigen┆ 0x04f200…09e600 64 28 72 65 70 2c 20 73 69 7a 65 29 0a 2f 2a 20 64 65 63 6f 64 65 20 61 20 73 68 6f 72 74 20 6f ┆d(rep, size) /* decode a short o┆ 0x04f200…09e600 72 20 6c 6f 6e 67 20 66 72 6f 6d 20 62 69 67 2d 65 6e 64 69 61 6e 20 6e 65 74 77 6f 72 6b 2d 69 ┆r long from big-endian network-i┆ 0x04f200…09e600 6e 64 65 70 65 6e 64 65 6e 74 20 6f 72 64 65 72 20 2a 2f 0a 63 68 61 72 09 2a 72 65 70 3b 0a 69 ┆ndependent order */ char *rep; i┆ 0x04f200…09e600 6e 74 20 20 20 20 20 73 69 7a 65 3b 0a 7b 0a 20 20 20 20 72 65 67 69 73 74 65 72 20 63 68 61 72 ┆nt size; { register char┆ 0x04f200…09e600 20 2a 72 70 20 3d 20 72 65 70 3b 0a 20 20 20 20 72 65 67 69 73 74 65 72 20 69 6e 74 20 69 20 3d ┆ *rp = rep; register int i =┆ 0x04f200…09e600 20 73 69 7a 65 3b 0a 20 20 20 20 6c 6f 6e 67 09 76 61 6c 20 3d 20 30 4c 3b 0a 0a 20 20 20 20 2f ┆ size; long val = 0L; /┆ 0x04f200…09e600 2a 20 72 65 61 64 20 4d 53 42 20 66 69 72 73 74 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 20 28 69 ┆* read MSB first */ while (i┆ 0x04f200…09e600 2d 2d 29 0a 20 20 20 20 7b 0a 09 76 61 6c 20 3c 3c 3d 20 42 59 54 45 53 49 5a 3b 09 2f 2a 20 77 ┆--) { val <<= BYTESIZ; /* w┆ 0x04f200…09e600 6f 6f 21 20 66 69 72 73 74 20 74 69 6d 65 20 49 27 76 65 20 75 73 65 64 20 6f 6e 65 20 6f 66 20 ┆oo! first time I've used one of ┆ 0x04f200…09e600 74 68 65 73 65 2e 2e 2e 20 2a 2f 0a 09 76 61 6c 20 2b 3d 20 28 2a 72 70 2b 2b 20 26 20 30 78 30 ┆these... */ val += (*rp++ & 0x0┆ 0x04f200…09e600 66 29 3b 09 2f 2a 20 69 66 20 79 6f 75 27 72 65 20 63 6f 6e 66 75 73 65 64 2c 20 6c 6f 6f 6b 20 ┆f); /* if you're confused, look ┆ 0x04f200…09e600 69 74 20 75 70 20 69 6e 20 4b 26 52 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 28 76 6f 69 64 29 ┆it up in K&R */ } (void)┆ 0x04f200…09e600 20 6d 65 6d 63 70 79 28 72 65 70 2c 20 28 63 68 61 72 20 2a 29 76 61 6c 2c 20 73 69 7a 65 29 3b ┆ memcpy(rep, (char *)val, size);┆ 0x04f200…09e600 0a 7d 0a 0a 70 72 69 76 61 74 65 20 76 6f 69 64 20 66 72 6f 6d 73 68 61 72 65 64 28 62 75 66 29 ┆ } private void fromshared(buf)┆ 0x04f200…09e600 0a 2f 2a 20 74 72 61 6e 73 6c 61 74 65 20 61 20 2e 70 61 67 20 62 6c 6f 63 6b 20 6f 75 74 20 6f ┆ /* translate a .pag block out o┆ 0x04f200…09e600 66 20 53 48 41 52 45 44 20 66 6f 72 6d 61 74 20 2a 2f 0a 63 68 61 72 20 20 20 20 62 75 66 5b 50 ┆f SHARED format */ char buf[P┆ 0x04f200…09e600 42 4c 4b 53 49 5a 5d 3b 0a 7b 0a 20 20 20 20 72 65 67 69 73 74 65 72 20 73 73 68 6f 72 74 20 2a ┆BLKSIZ]; { register sshort *┆ 0x04f200…09e600 73 70 3b 0a 20 20 20 20 72 65 67 69 73 74 65 72 20 69 6e 74 20 69 2c 20 6f 66 66 73 65 74 2c 20 ┆sp; register int i, offset, ┆ 0x04f200…09e600 64 61 74 63 6f 75 6e 74 3b 0a 0a 23 69 66 6e 64 65 66 20 6c 69 6e 74 0a 20 20 20 20 73 70 20 3d ┆datcount; #ifndef lint sp =┆ 0x04f200…09e600 20 28 73 73 68 6f 72 74 20 2a 29 20 62 75 66 3b 0a 23 65 6c 73 65 0a 20 20 20 20 73 70 20 3d 20 ┆ (sshort *) buf; #else sp = ┆ 0x04f200…09e600 28 73 73 68 6f 72 74 20 2a 29 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 66 72 6f 6d ┆(sshort *) NULL; #endif from┆ 0x04f200…09e600 62 69 67 65 6e 64 28 62 75 66 2c 20 73 69 7a 65 6f 66 28 73 73 68 6f 72 74 29 29 3b 0a 20 20 20 ┆bigend(buf, sizeof(sshort)); ┆ 0x04f200…09e600 20 64 61 74 63 6f 75 6e 74 20 3d 20 2a 73 70 2b 2b 3b 0a 20 20 20 20 66 6f 72 20 28 69 20 3d 20 ┆ datcount = *sp++; for (i = ┆ 0x04f200…09e600 30 3b 20 69 20 3c 20 64 61 74 63 6f 75 6e 74 3b 20 69 2b 2b 2c 20 73 70 2b 2b 29 0a 20 20 20 20 ┆0; i < datcount; i++, sp++) ┆ 0x04f200…09e600 7b 0a 09 69 6e 74 09 6f 66 66 73 65 74 20 3d 20 2a 73 70 3b 0a 0a 09 2f 2a 20 74 72 61 6e 73 6c ┆{ int offset = *sp; /* transl┆ 0x04f200…09e600 61 74 65 20 70 61 67 65 20 62 6c 6f 63 6b 20 6f 66 66 73 65 74 73 20 6f 75 74 20 6f 66 20 53 48 ┆ate page block offsets out of SH┆ 0x04f200…09e600 41 52 45 44 20 66 6f 72 6d 61 74 20 2a 2f 0a 09 66 72 6f 6d 62 69 67 65 6e 64 28 28 63 68 61 72 ┆ARED format */ frombigend((char┆ 0x04f200…09e600 20 2a 29 73 70 2c 20 73 69 7a 65 6f 66 28 73 73 68 6f 72 74 29 29 3b 0a 0a 09 2f 2a 20 74 72 61 ┆ *)sp, sizeof(sshort)); /* tra┆ 0x04f200…09e600 6e 73 6c 61 74 65 20 61 64 64 72 65 73 73 20 61 6e 64 20 6c 65 6e 67 74 68 20 6c 6f 6e 67 73 20 ┆nslate address and length longs ┆ 0x04f200…09e600 6f 75 74 20 6f 66 20 53 48 41 52 45 44 20 66 6f 72 6d 61 74 20 2a 2f 0a 09 66 72 6f 6d 62 69 67 ┆out of SHARED format */ frombig┆ 0x04f200…09e600 65 6e 64 28 62 75 66 20 2b 20 6f 66 66 73 65 74 2c 20 73 69 7a 65 6f 66 28 73 6c 6f 6e 67 29 29 ┆end(buf + offset, sizeof(slong))┆ 0x04f200…09e600 3b 0a 09 66 72 6f 6d 62 69 67 65 6e 64 28 62 75 66 20 2b 20 6f 66 66 73 65 74 20 2b 20 73 69 7a ┆; frombigend(buf + offset + siz┆ 0x04f200…09e600 65 6f 66 28 73 6c 6f 6e 67 29 2c 20 73 69 7a 65 6f 66 28 73 6c 6f 6e 67 29 29 3b 0a 20 20 20 20 ┆eof(slong), sizeof(slong)); ┆ 0x04f200…09e600 7d 0a 7d 0a 0a 70 72 69 76 61 74 65 20 76 6f 69 64 20 74 6f 62 69 67 65 6e 64 28 76 61 6c 2c 20 ┆} } private void tobigend(val, ┆ 0x04f200…09e600 72 65 70 2c 20 73 69 7a 65 29 0a 2f 2a 20 65 78 70 72 65 73 73 20 61 20 75 6e 73 69 67 6e 65 64 ┆rep, size) /* express a unsigned┆ 0x04f200…09e600 20 69 6e 74 65 67 65 72 20 6f 72 20 6c 6f 6e 67 20 69 6e 20 6e 65 74 77 6f 72 6b 2d 69 6e 64 65 ┆ integer or long in network-inde┆ 0x04f200…09e600 70 65 6e 64 65 6e 74 20 6f 72 64 65 72 20 2a 2f 0a 73 6c 6f 6e 67 09 76 61 6c 3b 0a 63 68 61 72 ┆pendent order */ slong val; char┆ 0x04f200…09e600 09 2a 72 65 70 3b 0a 69 6e 74 20 20 20 20 20 73 69 7a 65 3b 0a 7b 0a 20 20 20 20 2f 2a 20 77 72 ┆ *rep; int size; { /* wr┆ 0x04f200…09e600 69 74 65 20 69 6e 20 6e 6f 6e 2d 70 65 72 76 65 72 73 65 20 62 79 74 65 20 6f 72 64 65 72 2c 20 ┆ite in non-perverse byte order, ┆ 0x04f200…09e600 4d 53 42 20 66 69 72 73 74 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 20 28 73 69 7a 65 2d 2d 29 0a ┆MSB first */ while (size--) ┆ 0x04f200…09e600 09 2a 72 65 70 2b 2b 20 3d 20 28 76 61 6c 20 3e 3e 20 28 42 59 54 45 53 49 5a 20 2a 20 73 69 7a ┆ *rep++ = (val >> (BYTESIZ * siz┆ 0x04f200…09e600 65 29 29 20 26 20 30 78 66 66 3b 0a 7d 0a 0a 70 72 69 76 61 74 65 20 76 6f 69 64 20 74 6f 73 68 ┆e)) & 0xff; } private void tosh┆ 0x04f200…09e600 61 72 65 64 28 62 75 66 29 0a 2f 2a 20 63 68 65 63 6b 20 2e 70 61 67 20 62 6c 6f 63 6b 20 66 6f ┆ared(buf) /* check .pag block fo┆ 0x04f200…09e600 72 20 76 61 6c 69 64 69 74 79 2c 20 74 72 61 6e 73 6c 61 74 65 20 69 74 20 74 6f 20 53 48 41 52 ┆r validity, translate it to SHAR┆ 0x04f200…09e600 45 44 20 66 6f 72 6d 61 74 20 2a 2f 0a 63 68 61 72 20 20 20 20 62 75 66 5b 50 42 4c 4b 53 49 5a ┆ED format */ char buf[PBLKSIZ┆ 0x04f200…09e600 5d 3b 0a 7b 0a 20 20 20 20 72 65 67 69 73 74 65 72 20 73 68 6f 72 74 20 2a 73 70 3b 0a 20 20 20 ┆]; { register short *sp; ┆ 0x04f200…09e600 20 72 65 67 69 73 74 65 72 20 69 6e 74 20 69 2c 20 64 61 74 63 6f 75 6e 74 3b 0a 0a 23 69 66 6e ┆ register int i, datcount; #ifn┆ 0x04f200…09e600 64 65 66 20 6c 69 6e 74 0a 20 20 20 20 73 70 20 3d 20 28 73 73 68 6f 72 74 20 2a 29 20 62 75 66 ┆def lint sp = (sshort *) buf┆ 0x04f200…09e600 3b 0a 23 65 6c 73 65 0a 20 20 20 20 73 70 20 3d 20 28 73 73 68 6f 72 74 20 2a 29 20 4e 55 4c 4c ┆; #else sp = (sshort *) NULL┆ 0x04f200…09e600 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 74 6f 62 69 67 65 6e 64 28 64 61 74 63 6f 75 6e 74 20 3d ┆; #endif tobigend(datcount =┆ 0x04f200…09e600 20 2a 73 70 2b 2b 2c 20 62 75 66 2c 20 73 69 7a 65 6f 66 28 73 73 68 6f 72 74 29 29 3b 0a 20 20 ┆ *sp++, buf, sizeof(sshort)); ┆ 0x04f200…09e600 20 20 66 6f 72 20 28 69 20 3d 20 30 3b 20 69 20 3c 20 64 61 74 63 6f 75 6e 74 3b 20 69 2b 2b 2c ┆ for (i = 0; i < datcount; i++,┆ 0x04f200…09e600 20 73 70 2b 2b 29 0a 20 20 20 20 7b 0a 09 69 6e 74 09 6f 66 66 73 65 74 3b 0a 09 73 6c 6f 6e 67 ┆ sp++) { int offset; slong┆ 0x04f200…09e600 09 2a 6c 70 3b 0a 0a 09 2f 2a 20 74 72 61 6e 73 6c 61 74 65 20 70 61 67 65 20 62 6c 6f 63 6b 20 ┆ *lp; /* translate page block ┆ 0x04f200…09e600 6f 66 66 73 65 74 73 20 69 6e 74 6f 20 53 48 41 52 45 44 20 66 6f 72 6d 61 74 20 2a 2f 0a 09 74 ┆offsets into SHARED format */ t┆ 0x04f200…09e600 6f 62 69 67 65 6e 64 28 6f 66 66 73 65 74 20 3d 20 2a 73 70 2c 20 28 63 68 61 72 20 2a 29 73 70 ┆obigend(offset = *sp, (char *)sp┆ 0x04f200…09e600 2c 20 73 69 7a 65 6f 66 28 73 73 68 6f 72 74 29 29 3b 0a 0a 09 2f 2a 20 74 72 61 6e 73 6c 61 74 ┆, sizeof(sshort)); /* translat┆ 0x04f200…09e600 65 20 61 64 64 72 65 73 73 20 61 6e 64 20 6c 65 6e 67 74 68 20 6c 6f 6e 67 73 20 69 6e 74 6f 20 ┆e address and length longs into ┆ 0x04f200…09e600 53 48 41 52 45 44 20 66 6f 72 6d 61 74 20 2a 2f 0a 09 6c 70 20 3d 20 28 73 6c 6f 6e 67 20 2a 29 ┆SHARED format */ lp = (slong *)┆ 0x04f200…09e600 28 62 75 66 20 2b 20 6f 66 66 73 65 74 29 3b 0a 09 74 6f 62 69 67 65 6e 64 28 6c 70 5b 30 5d 2c ┆(buf + offset); tobigend(lp[0],┆ 0x04f200…09e600 20 62 75 66 20 2b 20 6f 66 66 73 65 74 2c 20 73 69 7a 65 6f 66 28 73 6c 6f 6e 67 29 29 3b 0a 09 ┆ buf + offset, sizeof(slong)); ┆ 0x04f200…09e600 74 6f 62 69 67 65 6e 64 28 6c 70 5b 31 5d 2c 20 62 75 66 20 2b 20 6f 66 66 73 65 74 20 2b 20 73 ┆tobigend(lp[1], buf + offset + s┆ 0x04f200…09e600 69 7a 65 6f 66 28 73 6c 6f 6e 67 29 2c 20 73 69 7a 65 6f 66 28 73 6c 6f 6e 67 29 29 3b 0a 20 20 ┆izeof(slong), sizeof(slong)); ┆ 0x04f200…09e600 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 48 41 52 45 44 20 2a 2f 0a 0a 2f 2a 0a 20 2a ┆ } } #endif /* SHARED */ /* *┆ 0x04f200…09e600 20 55 73 69 6e 67 20 74 68 69 73 20 6d 61 63 72 6f 20 66 6f 72 20 66 72 65 65 69 6e 67 20 74 68 ┆ Using this macro for freeing th┆ 0x04f200…09e600 65 20 63 75 72 72 65 6e 74 20 64 61 74 61 20 61 6c 6c 6f 63 20 61 72 65 61 20 67 75 61 72 61 6e ┆e current data alloc area guaran┆ 0x04f200…09e600 74 65 65 73 20 74 68 61 74 0a 20 2a 20 69 74 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 70 6f 69 6e ┆tees that * it will always poin┆ 0x04f200…09e600 74 20 65 69 74 68 65 72 20 74 6f 20 61 6e 20 61 6c 6c 6f 63 61 74 65 64 20 64 61 74 61 20 61 72 ┆t either to an allocated data ar┆ 0x04f200…09e600 65 61 20 6f 72 20 62 65 20 4e 55 4c 4c 2e 0a 20 2a 2f 0a 23 64 65 66 69 6e 65 20 46 52 45 45 28 ┆ea or be NULL. */ #define FREE(┆ 0x04f200…09e600 64 29 09 69 66 28 64 2d 3e 66 72 65 65 70 74 72 29 7b 28 76 6f 69 64 29 66 72 65 65 28 64 2d 3e ┆d) if(d->freeptr){(void)free(d->┆ 0x04f200…09e600 66 72 65 65 70 74 72 29 3b 64 2d 3e 66 72 65 65 70 74 72 3d 28 63 68 61 72 2a 29 4e 55 4c 4c 3b ┆freeptr);d->freeptr=(char*)NULL;┆ 0x04f200…09e600 7d 0a 0a 64 61 74 61 62 61 73 65 20 2a 64 62 6d 6f 70 65 6e 28 66 69 6c 65 29 0a 2f 2a 20 6f 70 ┆} database *dbmopen(file) /* op┆ 0x04f200…09e600 65 6e 73 20 61 20 64 61 74 61 62 61 73 65 20 66 6f 72 20 75 73 65 20 2a 2f 0a 63 68 61 72 20 20 ┆ens a database for use */ char ┆ 0x04f200…09e600 20 2a 66 69 6c 65 3b 0a 7b 0a 20 20 20 20 2f 2a 20 77 65 20 75 73 65 20 63 61 6c 6c 6f 63 28 29 ┆ *file; { /* we use calloc()┆ 0x04f200…09e600 20 62 65 63 61 75 73 65 20 66 72 65 65 70 74 72 20 66 69 65 6c 64 20 6d 75 73 74 20 62 65 20 69 ┆ because freeptr field must be i┆ 0x04f200…09e600 6e 69 74 69 61 6c 6c 79 20 7a 65 72 6f 65 64 20 6f 75 74 20 2a 2f 0a 23 69 66 6e 64 65 66 20 6c ┆nitially zeroed out */ #ifndef l┆ 0x04f200…09e600 69 6e 74 0a 20 20 20 20 72 65 67 69 73 74 65 72 20 64 61 74 61 62 61 73 65 20 2a 64 62 20 3d 20 ┆int register database *db = ┆ 0x04f200…09e600 28 64 61 74 61 62 61 73 65 20 2a 29 20 63 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 64 62 29 2c ┆(database *) calloc(sizeof(*db),┆ 0x04f200…09e600 20 31 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 72 65 67 69 73 74 65 72 20 64 61 74 61 62 61 73 65 ┆ 1); #else register database┆ 0x04f200…09e600 20 2a 64 62 20 3d 20 28 64 61 74 61 62 61 73 65 20 2a 29 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66 20 ┆ *db = (database *)NULL; #endif ┆ 0x04f200…09e600 2f 2a 20 6c 69 6e 74 20 2a 2f 0a 20 20 20 20 72 65 67 69 73 74 65 72 20 69 6e 74 09 20 20 6c 65 ┆/* lint */ register int le┆ 0x04f200…09e600 6e 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74 09 20 20 73 74 61 74 62 3b 0a 0a 20 20 20 ┆n; struct stat statb; ┆ 0x04f200…09e600 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 66 69 6c 65 29 20 2b 20 45 58 54 4c 45 4e 3b 0a 20 20 ┆ len = strlen(file) + EXTLEN; ┆ 0x04f200…09e600 20 20 64 62 2d 3e 64 69 72 6e 6d 20 3d 20 6d 61 6c 6c 6f 63 28 28 75 6e 73 69 67 6e 65 64 29 20 ┆ db->dirnm = malloc((unsigned) ┆ 0x04f200…09e600 28 34 20 2a 20 6c 65 6e 29 29 3b 0a 20 20 20 20 64 62 2d 3e 70 61 67 6e 6d 20 3d 20 64 62 2d 3e ┆(4 * len)); db->pagnm = db->┆ 0x04f200…09e600 64 69 72 6e 6d 20 2b 20 6c 65 6e 3b 0a 20 20 20 20 64 62 2d 3e 64 61 74 6e 6d 20 3d 20 64 62 2d ┆dirnm + len; db->datnm = db-┆ 0x04f200…09e600 3e 70 61 67 6e 6d 20 2b 20 6c 65 6e 3b 0a 20 20 20 20 64 62 2d 3e 64 62 6e 6d 20 20 3d 20 64 62 ┆>pagnm + len; db->dbnm = db┆ 0x04f200…09e600 2d 3e 64 61 74 6e 6d 20 2b 20 6c 65 6e 3b 0a 20 20 20 20 6c 65 6e 20 2d 3d 20 45 58 54 4c 45 4e ┆->datnm + len; len -= EXTLEN┆ 0x04f200…09e600 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 73 74 72 63 70 79 28 64 62 2d 3e 64 69 72 6e 6d 2c 20 66 ┆; (void) strcpy(db->dirnm, f┆ 0x04f200…09e600 69 6c 65 29 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 73 74 72 63 70 79 28 64 62 2d 3e 64 69 72 6e ┆ile); (void) strcpy(db->dirn┆ 0x04f200…09e600 6d 20 2b 20 6c 65 6e 2c 20 22 2e 64 69 72 22 29 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 73 74 72 ┆m + len, ".dir"); (void) str┆ 0x04f200…09e600 63 70 79 28 64 62 2d 3e 70 61 67 6e 6d 2c 20 66 69 6c 65 29 3b 0a 20 20 20 20 28 76 6f 69 64 29 ┆cpy(db->pagnm, file); (void)┆ 0x04f200…09e600 20 73 74 72 63 70 79 28 64 62 2d 3e 70 61 67 6e 6d 20 2b 20 6c 65 6e 2c 20 22 2e 70 61 67 22 29 ┆ strcpy(db->pagnm + len, ".pag")┆ 0x04f200…09e600 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 73 74 72 63 70 79 28 64 62 2d 3e 64 61 74 6e 6d 2c 20 66 ┆; (void) strcpy(db->datnm, f┆ 0x04f200…09e600 69 6c 65 29 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 73 74 72 63 70 79 28 64 62 2d 3e 64 61 74 6e ┆ile); (void) strcpy(db->datn┆ 0x04f200…09e600 6d 20 2b 20 6c 65 6e 2c 20 22 2e 64 61 74 22 29 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 73 74 72 ┆m + len, ".dat"); (void) str┆ 0x04f200…09e600 63 70 79 28 64 62 2d 3e 64 62 6e 6d 2c 20 66 69 6c 65 29 3b 0a 20 20 20 20 64 62 2d 3e 6f 6c 64 ┆cpy(db->dbnm, file); db->old┆ 0x04f200…09e600 70 61 67 62 20 3d 20 64 62 2d 3e 6f 6c 64 64 69 72 62 20 3d 20 2d 31 3b 0a 20 20 20 20 69 66 20 ┆pagb = db->olddirb = -1; if ┆ 0x04f200…09e600 28 73 65 74 75 70 5f 64 62 28 64 62 29 20 3d 3d 20 46 41 49 4c 29 0a 20 20 20 20 7b 0a 09 28 76 ┆(setup_db(db) == FAIL) { (v┆ 0x04f200…09e600 6f 69 64 29 20 66 72 65 65 28 64 62 2d 3e 64 69 72 6e 6d 29 3b 0a 09 28 76 6f 69 64 29 20 66 72 ┆oid) free(db->dirnm); (void) fr┆ 0x04f200…09e600 65 65 28 28 63 68 61 72 20 2a 29 20 64 62 29 3b 0a 09 72 65 74 75 72 6e 28 28 64 61 74 61 62 61 ┆ee((char *) db); return((databa┆ 0x04f200…09e600 73 65 20 2a 29 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 28 76 6f 69 64 29 20 66 73 74 ┆se *)NULL); } (void) fst┆ 0x04f200…09e600 61 74 28 64 62 2d 3e 64 69 72 66 2c 20 26 73 74 61 74 62 29 3b 0a 20 20 20 20 64 62 2d 3e 6d 61 ┆at(db->dirf, &statb); db->ma┆ 0x04f200…09e600 78 62 6e 6f 20 3d 20 73 74 61 74 62 2e 73 74 5f 73 69 7a 65 20 2a 20 42 59 54 45 53 49 5a 20 2d ┆xbno = statb.st_size * BYTESIZ -┆ 0x04f200…09e600 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 28 64 62 29 3b 0a 7d 0a 0a 76 6f 69 64 20 64 62 6d 63 ┆ 1; return(db); } void dbmc┆ 0x04f200…09e600 6c 6f 73 65 28 64 62 29 0a 72 65 67 69 73 74 65 72 20 20 20 20 64 61 74 61 62 61 73 65 20 2a 64 ┆lose(db) register database *d┆ 0x04f200…09e600 62 3b 20 0a 7b 0a 20 20 20 20 69 66 20 28 64 62 20 3d 3d 20 28 64 61 74 61 62 61 73 65 20 2a 29 ┆b; { if (db == (database *)┆ 0x04f200…09e600 4e 55 4c 4c 29 0a 09 72 65 74 75 72 6e 3b 0a 20 20 20 20 69 66 20 28 6c 61 73 74 64 61 74 61 62 ┆NULL) return; if (lastdatab┆ 0x04f200…09e600 61 73 65 20 3d 3d 20 64 62 29 0a 20 20 20 20 7b 0a 09 69 66 20 28 64 62 2d 3e 64 69 72 66 20 3e ┆ase == db) { if (db->dirf >┆ 0x04f200…09e600 20 30 29 0a 09 20 20 20 20 28 76 6f 69 64 29 20 63 6c 6f 73 65 28 64 62 2d 3e 64 69 72 66 29 3b ┆ 0) (void) close(db->dirf);┆ 0x04f200…09e600 0a 09 69 66 20 28 64 62 2d 3e 70 61 67 66 20 3e 20 30 29 0a 09 20 20 20 20 28 76 6f 69 64 29 20 ┆ if (db->pagf > 0) (void) ┆ 0x04f200…09e600 63 6c 6f 73 65 28 64 62 2d 3e 70 61 67 66 29 3b 0a 09 69 66 20 28 64 62 2d 3e 64 61 74 66 20 3e ┆close(db->pagf); if (db->datf >┆ 0x04f200…09e600 20 30 29 0a 09 20 20 20 20 28 76 6f 69 64 29 20 63 6c 6f 73 65 28 64 62 2d 3e 64 61 74 66 29 3b ┆ 0) (void) close(db->datf);┆ 0x04f200…09e600 0a 09 64 62 2d 3e 64 69 72 66 20 3d 20 64 62 2d 3e 70 61 67 66 20 3d 20 64 62 2d 3e 64 61 74 66 ┆ db->dirf = db->pagf = db->datf┆ 0x04f200…09e600 20 3d 20 46 41 49 4c 3b 0a 09 6c 61 73 74 64 61 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 20 20 20 ┆ = FAIL; lastdatabase = 0; ┆ 0x04f200…09e600 7d 0a 20 20 20 20 28 76 6f 69 64 29 20 66 72 65 65 28 64 62 2d 3e 64 69 72 6e 6d 29 3b 0a 20 20 ┆} (void) free(db->dirnm); ┆ 0x04f200…09e600 20 20 28 76 6f 69 64 29 20 66 72 65 65 28 28 63 68 61 72 20 2a 29 64 62 29 3b 0a 7d 0a 0a 70 72 ┆ (void) free((char *)db); } pr┆ 0x04f200…09e600 69 76 61 74 65 20 69 6e 74 20 73 65 74 75 70 5f 64 62 28 64 62 29 0a 2f 2a 20 65 6e 73 75 72 65 ┆ivate int setup_db(db) /* ensure┆ 0x04f200…09e600 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 61 72 65 20 6f 70 65 ┆ that the database files are ope┆ 0x04f200…09e600 6e 20 6f 72 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 72 65 67 69 73 74 65 72 20 20 64 61 74 61 ┆n or available */ register data┆ 0x04f200…09e600 62 61 73 65 20 2a 64 62 3b 20 0a 7b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 09 65 72 72 6e ┆base *db; { extern int errn┆ 0x04f200…09e600 6f 3b 0a 23 69 66 64 65 66 20 53 59 53 56 32 0a 23 69 66 6e 64 65 66 20 4c 4f 43 4b 46 0a 20 20 ┆o; #ifdef SYSV2 #ifndef LOCKF ┆ 0x04f200…09e600 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 20 20 20 64 6c 6f 63 6b 3b 0a 0a 20 20 20 20 64 6c ┆ struct flock dlock; dl┆ 0x04f200…09e600 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20 20 20 20 64 6c 6f 63 6b 2e ┆ock.l_type = F_WRLCK; dlock.┆ 0x04f200…09e600 6c 5f 73 74 61 72 74 20 3d 20 64 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 64 6c 6f 63 6b ┆l_start = dlock.l_whence = dlock┆ 0x04f200…09e600 2e 6c 5f 6c 65 6e 20 3d 20 30 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 21 4c 4f 43 4b 46 20 2a 2f 0a ┆.l_len = 0; #endif /* !LOCKF */ ┆ 0x04f200…09e600 23 65 6e 64 69 66 20 2f 2a 20 53 59 53 56 32 20 2a 2f 0a 0a 20 20 20 20 69 66 20 28 64 62 20 3d ┆#endif /* SYSV2 */ if (db =┆ 0x04f200…09e600 3d 20 28 64 61 74 61 62 61 73 65 20 2a 29 4e 55 4c 4c 29 0a 09 20 20 20 20 72 65 74 75 72 6e 28 ┆= (database *)NULL) return(┆ 0x04f200…09e600 46 41 49 4c 29 3b 0a 20 20 20 20 69 66 20 28 6c 61 73 74 64 61 74 61 62 61 73 65 20 3d 3d 20 64 ┆FAIL); if (lastdatabase == d┆ 0x04f200…09e600 62 29 0a 09 20 20 20 20 72 65 74 75 72 6e 28 53 55 43 43 45 45 44 29 3b 0a 20 20 20 20 69 66 20 ┆b) return(SUCCEED); if ┆ 0x04f200…09e600 28 6c 61 73 74 64 61 74 61 62 61 73 65 29 20 7b 0a 09 69 66 20 28 6c 61 73 74 64 61 74 61 62 61 ┆(lastdatabase) { if (lastdataba┆ 0x04f200…09e600 73 65 2d 3e 64 69 72 66 20 3e 20 30 29 0a 09 20 20 20 20 28 76 6f 69 64 29 20 63 6c 6f 73 65 28 ┆se->dirf > 0) (void) close(┆ 0x04f200…09e600 6c 61 73 74 64 61 74 61 62 61 73 65 2d 3e 64 69 72 66 29 3b 0a 09 69 66 20 28 6c 61 73 74 64 61 ┆lastdatabase->dirf); if (lastda┆ 0x04f200…09e600 74 61 62 61 73 65 2d 3e 70 61 67 66 20 3e 20 30 29 0a 09 20 20 20 20 28 76 6f 69 64 29 20 63 6c ┆tabase->pagf > 0) (void) cl┆ 0x04f200…09e600 6f 73 65 28 6c 61 73 74 64 61 74 61 62 61 73 65 2d 3e 70 61 67 66 29 3b 0a 09 69 66 20 28 6c 61 ┆ose(lastdatabase->pagf); if (la┆ 0x04f200…09e600 73 74 64 61 74 61 62 61 73 65 2d 3e 64 61 74 66 20 3e 20 30 29 0a 09 20 20 20 20 28 76 6f 69 64 ┆stdatabase->datf > 0) (void┆ 0x04f200…09e600 29 20 63 6c 6f 73 65 28 6c 61 73 74 64 61 74 61 62 61 73 65 2d 3e 64 61 74 66 29 3b 0a 09 6c 61 ┆) close(lastdatabase->datf); la┆ 0x04f200…09e600 73 74 64 61 74 61 62 61 73 65 2d 3e 64 69 72 66 20 3d 20 6c 61 73 74 64 61 74 61 62 61 73 65 2d ┆stdatabase->dirf = lastdatabase-┆ 0x04f200…09e600 3e 70 61 67 66 20 3d 20 6c 61 73 74 64 61 74 61 62 61 73 65 2d 3e 64 61 74 66 20 3d 20 2d 31 3b ┆>pagf = lastdatabase->datf = -1;┆ 0x04f200…09e600 0a 09 6c 61 73 74 64 61 74 61 62 61 73 65 20 3d 20 28 64 61 74 61 62 61 73 65 20 2a 29 4e 55 4c ┆ lastdatabase = (database *)NUL┆ 0x04f200…09e600 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 62 2d 3e 64 69 72 66 20 3d 20 6f 70 65 6e 28 64 62 ┆L; } db->dirf = open(db┆ 0x04f200…09e600 2d 3e 64 69 72 6e 6d 2c 20 32 29 3b 0a 20 20 20 20 64 62 2d 3e 64 62 72 64 6f 6e 6c 79 20 3d 20 ┆->dirnm, 2); db->dbrdonly = ┆ 0x04f200…09e600 46 41 4c 53 45 3b 0a 20 20 20 20 69 66 20 28 64 62 2d 3e 64 69 72 66 20 3c 20 30 29 0a 20 20 20 ┆FALSE; if (db->dirf < 0) ┆ 0x04f200…09e600 20 7b 0a 09 64 62 2d 3e 64 62 72 64 6f 6e 6c 79 20 3d 20 54 52 55 45 3b 0a 09 64 62 2d 3e 64 69 ┆ { db->dbrdonly = TRUE; db->di┆ 0x04f200…09e600 72 66 20 3d 20 6f 70 65 6e 28 64 62 2d 3e 64 69 72 6e 6d 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 0a ┆rf = open(db->dirnm, 0); } ┆ 0x04f200…09e600 20 20 20 20 64 62 2d 3e 70 61 67 66 20 3d 20 6f 70 65 6e 28 64 62 2d 3e 70 61 67 6e 6d 2c 20 64 ┆ db->pagf = open(db->pagnm, d┆ 0x04f200…09e600 62 2d 3e 64 62 72 64 6f 6e 6c 79 20 3f 20 30 20 3a 20 32 29 3b 0a 20 20 20 20 64 62 2d 3e 64 61 ┆b->dbrdonly ? 0 : 2); db->da┆ 0x04f200…09e600 74 66 20 3d 20 6f 70 65 6e 28 64 62 2d 3e 64 61 74 6e 6d 2c 20 64 62 2d 3e 64 62 72 64 6f 6e 6c ┆tf = open(db->datnm, db->dbrdonl┆ 0x04f200…09e600 79 20 3f 20 30 20 3a 20 32 29 3b 0a 0a 20 20 20 20 69 66 20 28 64 62 2d 3e 64 69 72 66 20 3c 20 ┆y ? 0 : 2); if (db->dirf < ┆ 0x04f200…09e600 30 20 7c 7c 20 64 62 2d 3e 70 61 67 66 20 3c 20 30 20 7c 7c 20 64 62 2d 3e 64 61 74 66 20 3c 20 ┆0 || db->pagf < 0 || db->datf < ┆ 0x04f200…09e600 30 29 0a 20 20 20 20 7b 0a 09 28 76 6f 69 64 29 20 63 6c 6f 73 65 28 64 62 2d 3e 64 69 72 66 29 ┆0) { (void) close(db->dirf)┆ 0x04f200…09e600 3b 0a 09 28 76 6f 69 64 29 20 63 6c 6f 73 65 28 64 62 2d 3e 70 61 67 66 29 3b 0a 09 28 76 6f 69 ┆; (void) close(db->pagf); (voi┆ 0x04f200…09e600 64 29 20 63 6c 6f 73 65 28 64 62 2d 3e 64 61 74 66 29 3b 0a 09 72 65 74 75 72 6e 28 46 41 49 4c ┆d) close(db->datf); return(FAIL┆ 0x04f200…09e600 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 59 53 56 32 0a 23 69 66 6e 64 65 66 20 4c 4f ┆); } #ifdef SYSV2 #ifndef LO┆ 0x04f200…09e600 43 4b 46 0a 20 20 20 20 64 6c 6f 63 6b 2e 6c 5f 70 69 64 20 3d 20 67 65 74 70 69 64 20 28 29 3b ┆CKF dlock.l_pid = getpid ();┆ 0x04f200…09e600 0a 20 20 20 20 28 76 6f 69 64 29 20 66 63 6e 74 6c 20 28 28 69 6e 74 29 20 64 62 2d 3e 64 69 72 ┆ (void) fcntl ((int) db->dir┆ 0x04f200…09e600 66 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 64 6c 6f 63 6b 29 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 ┆f, F_SETLK, &dlock); (void) ┆ 0x04f200…09e600 66 63 6e 74 6c 20 28 28 69 6e 74 29 20 64 62 2d 3e 70 61 67 66 2c 20 46 5f 53 45 54 4c 4b 2c 20 ┆fcntl ((int) db->pagf, F_SETLK, ┆ 0x04f200…09e600 26 64 6c 6f 63 6b 29 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 66 63 6e 74 6c 20 28 28 69 6e 74 29 ┆&dlock); (void) fcntl ((int)┆ 0x04f200…09e600 20 64 62 2d 3e 64 61 74 66 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 64 6c 6f 63 6b 29 3b 0a 23 65 6e ┆ db->datf, F_SETLK, &dlock); #en┆ 0x04f200…09e600 64 69 66 20 2f 2a 20 21 4c 4f 43 4b 46 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 53 59 53 56 32 ┆dif /* !LOCKF */ #endif /* SYSV2┆ 0x04f200…09e600 20 2a 2f 0a 23 69 66 64 65 66 20 46 49 4f 43 4c 45 58 0a 23 69 66 6e 64 65 66 20 4c 4f 43 4b 46 ┆ */ #ifdef FIOCLEX #ifndef LOCKF┆ 0x04f200…09e600 0a 23 69 66 6e 64 65 66 20 6c 69 6e 74 0a 20 20 20 20 2f 2a 20 6c 69 6e 74 20 63 61 6e 27 74 20 ┆ #ifndef lint /* lint can't ┆ 0x04f200…09e600 73 65 65 20 74 68 69 73 20 62 65 63 61 75 73 65 20 34 2e 32 20 61 6e 64 20 34 2e 33 20 64 69 73 ┆see this because 4.2 and 4.3 dis┆ 0x04f200…09e600 61 67 72 65 65 20 6f 6e 20 32 6e 64 20 61 72 67 20 74 79 70 65 20 2a 2f 0a 20 20 20 20 28 76 6f ┆agree on 2nd arg type */ (vo┆ 0x04f200…09e600 69 64 29 20 69 6f 63 74 6c 28 28 69 6e 74 29 20 64 62 2d 3e 64 69 72 66 2c 20 46 49 4f 43 4c 45 ┆id) ioctl((int) db->dirf, FIOCLE┆ 0x04f200…09e600 58 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 69 6f 63 ┆X, (char *)NULL); (void) ioc┆ 0x04f200…09e600 74 6c 28 28 69 6e 74 29 20 64 62 2d 3e 70 61 67 66 2c 20 46 49 4f 43 4c 45 58 2c 20 28 63 68 61 ┆tl((int) db->pagf, FIOCLEX, (cha┆ 0x04f200…09e600 72 20 2a 29 4e 55 4c 4c 29 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 69 6f 63 74 6c 28 28 69 6e 74 ┆r *)NULL); (void) ioctl((int┆ 0x04f200…09e600 29 20 64 62 2d 3e 64 61 74 66 2c 20 46 49 4f 43 4c 45 58 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c ┆) db->datf, FIOCLEX, (char *)NUL┆ 0x04f200…09e600 4c 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 21 6c 69 6e 74 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a ┆L); #endif /* !lint */ #endif /*┆ 0x04f200…09e600 20 21 4c 4f 43 4b 46 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 46 49 4f 43 4c 45 58 20 2a 2f 0a ┆ !LOCKF */ #endif /* FIOCLEX */ ┆ 0x04f200…09e600 20 20 20 20 6c 61 73 74 64 61 74 61 62 61 73 65 20 3d 20 64 62 3b 0a 20 20 20 20 72 65 74 75 72 ┆ lastdatabase = db; retur┆ 0x04f200…09e600 6e 28 53 55 43 43 45 45 44 29 3b 0a 7d 0a 0a 76 6f 69 64 20 64 62 6d 74 72 75 6e 63 28 64 62 29 ┆n(SUCCEED); } void dbmtrunc(db)┆ 0x04f200…09e600 0a 2f 2a 20 63 6c 65 61 6e 73 20 6f 75 74 20 61 6e 20 65 78 69 73 74 69 6e 67 20 64 61 74 61 62 ┆ /* cleans out an existing datab┆ 0x04f200…09e600 61 73 65 20 2a 2f 0a 64 61 74 61 62 61 73 65 09 2a 64 62 3b 0a 7b 0a 20 20 20 20 72 65 67 69 73 ┆ase */ database *db; { regis┆ 0x04f200…09e600 74 65 72 20 69 6e 74 20 20 66 64 3b 0a 0a 23 69 66 64 65 66 20 4d 41 49 4e 0a 20 20 20 20 65 72 ┆ter int fd; #ifdef MAIN er┆ 0x04f200…09e600 72 6e 6f 20 3d 20 30 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 69 ┆rno = 0; #endif /* MAIN */ i┆ 0x04f200…09e600 66 20 28 28 66 64 20 3d 20 63 72 65 61 74 28 64 62 2d 3e 64 69 72 6e 6d 2c 20 30 37 37 37 29 29 ┆f ((fd = creat(db->dirnm, 0777))┆ 0x04f200…09e600 20 21 3d 20 46 41 49 4c 29 0a 09 28 76 6f 69 64 29 20 63 6c 6f 73 65 28 66 64 29 3b 0a 23 69 66 ┆ != FAIL) (void) close(fd); #if┆ 0x04f200…09e600 64 65 66 20 4d 41 49 4e 0a 20 20 20 20 65 6c 73 65 0a 09 28 76 6f 69 64 29 20 70 72 69 6e 74 66 ┆def MAIN else (void) printf┆ 0x04f200…09e600 28 22 64 62 6d 74 72 75 6e 63 3a 20 65 72 72 6e 6f 20 25 64 20 6f 6e 20 63 72 65 61 74 28 25 73 ┆("dbmtrunc: errno %d on creat(%s┆ 0x04f200…09e600 2e 64 69 72 29 5c 6e 22 2c 65 72 72 6e 6f 2c 64 62 2d 3e 64 69 72 6e 6d 29 3b 0a 20 20 20 20 65 ┆.dir)\n",errno,db->dirnm); e┆ 0x04f200…09e600 72 72 6e 6f 20 3d 20 30 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 4d 41 49 4e 20 2a 2f 0a 0a 20 20 20 ┆rrno = 0; #endif /* MAIN */ ┆ 0x04f200…09e600 20 69 66 20 28 28 66 64 20 3d 20 63 72 65 61 74 28 64 62 2d 3e 70 61 67 6e 6d 2c 20 30 37 37 37 ┆ if ((fd = creat(db->pagnm, 0777┆ 0x04f200…09e600 29 29 20 21 3d 20 46 41 49 4c 29 0a 09 28 76 6f 69 64 29 20 63 6c 6f 73 65 28 66 64 29 3b 0a 23 ┆)) != FAIL) (void) close(fd); #┆ 0x04f200…09e600 69 66 64 65 66 20 4d 41 49 4e 0a 20 20 20 20 65 6c 73 65 0a 09 28 76 6f 69 64 29 20 70 72 69 6e ┆ifdef MAIN else (void) prin┆ 0x04f200…09e600 74 66 28 22 64 62 6d 74 72 75 6e 63 3a 20 65 72 72 6e 6f 20 25 64 20 6f 6e 20 63 72 65 61 74 28 ┆tf("dbmtrunc: errno %d on creat(┆ 0x04f200…09e600 25 73 2e 70 61 67 29 5c 6e 22 2c 65 72 72 6e 6f 2c 64 62 2d 3e 70 61 67 6e 6d 29 3b 0a 20 20 20 ┆%s.pag)\n",errno,db->pagnm); ┆ 0x04f200…09e600 20 65 72 72 6e 6f 20 3d 20 30 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 4d 41 49 4e 20 2a 2f 0a 0a 20 ┆ errno = 0; #endif /* MAIN */ ┆ 0x04f200…09e600 20 20 20 69 66 20 28 28 66 64 20 3d 20 63 72 65 61 74 28 64 62 2d 3e 64 61 74 6e 6d 2c 20 30 37 ┆ if ((fd = creat(db->datnm, 07┆ 0x04f200…09e600 37 37 29 29 20 21 3d 20 46 41 49 4c 29 0a 09 28 76 6f 69 64 29 20 63 6c 6f 73 65 28 66 64 29 3b ┆77)) != FAIL) (void) close(fd);┆ 0x04f200…09e600 0a 23 69 66 64 65 66 20 4d 41 49 4e 0a 20 20 20 20 65 6c 73 65 0a 09 28 76 6f 69 64 29 20 70 72 ┆ #ifdef MAIN else (void) pr┆ 0x04f200…09e600 69 6e 74 66 28 22 64 62 6d 74 72 75 6e 63 3a 20 65 72 72 6e 6f 20 25 64 20 6f 6e 20 63 72 65 61 ┆intf("dbmtrunc: errno %d on crea┆ 0x04f200…09e600 74 28 25 73 2e 64 61 74 29 5c 6e 22 2c 65 72 72 6e 6f 2c 64 62 2d 3e 64 61 74 6e 6d 29 3b 0a 23 ┆t(%s.dat)\n",errno,db->datnm); #┆ 0x04f200…09e600 65 6e 64 69 66 20 2f 2a 20 4d 41 49 4e 20 2a 2f 0a 7d 0a 0a 76 6f 69 64 20 64 62 6d 72 65 77 69 ┆endif /* MAIN */ } void dbmrewi┆ 0x04f200…09e600 6e 64 28 64 62 29 0a 2f 2a 20 72 65 77 69 6e 64 2c 20 6e 65 78 74 20 64 62 6d 6e 65 78 74 28 29 ┆nd(db) /* rewind, next dbmnext()┆ 0x04f200…09e600 20 67 65 74 73 20 31 73 74 20 6b 65 79 20 2a 2f 0a 72 65 67 69 73 74 65 72 20 64 61 74 61 62 61 ┆ gets 1st key */ register databa┆ 0x04f200…09e600 73 65 20 2a 64 62 3b 0a 7b 0a 20 20 20 20 46 52 45 45 28 64 62 29 3b 0a 20 20 20 20 64 62 2d 3e ┆se *db; { FREE(db); db->┆ 0x04f200…09e600 63 75 72 72 65 6e 74 2e 64 70 74 72 20 3d 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 3b 0a 7d 0a 0a ┆current.dptr = (char *)NULL; } ┆ 0x04f200…09e600 73 74 61 74 69 63 20 6c 6f 6e 67 20 74 61 62 6c 65 5b 5d 5b 30 32 30 5d 20 3d 0a 7b 0a 20 20 20 ┆static long table[][020] = { ┆ 0x04f200…09e600 20 30 32 33 37 34 32 33 33 30 37 37 30 4c 2c 20 30 30 33 35 37 36 30 32 34 32 35 31 4c 2c 20 30 ┆ 023742330770L, 003576024251L, 0┆ 0x04f200…09e600 31 33 31 32 37 37 34 32 30 30 37 4c 2c 20 30 33 33 36 35 32 36 31 36 32 30 31 4c 2c 20 0a 20 20 ┆13127742007L, 033652616201L, ┆ 0x04f200…09e600 20 20 30 32 31 36 32 31 36 34 33 35 33 30 4c 2c 20 30 33 33 33 35 30 30 34 35 35 30 34 4c 2c 20 ┆ 021621643530L, 033350045504L, ┆ 0x04f200…09e600 30 33 32 36 33 35 34 36 30 32 31 36 4c 2c 20 30 30 37 30 36 31 31 34 31 33 36 34 4c 2c 20 0a 20 ┆032635460216L, 007061141364L, ┆ 0x04f200…09e600 20 20 20 30 30 37 31 35 36 30 35 31 37 32 31 4c 2c 20 30 31 36 30 32 32 37 35 35 33 35 32 4c 2c ┆ 007156051721L, 016022755352L,┆ 0x04f200…09e600 20 30 31 37 32 31 35 37 36 37 32 36 36 4c 2c 20 30 30 36 30 30 30 34 33 34 30 35 31 4c 2c 20 0a ┆ 017215767266L, 006000434051L, ┆ 0x04f200…09e600 20 20 20 20 30 32 35 33 33 37 36 37 31 36 35 32 4c 2c 20 30 30 37 36 33 37 35 35 37 30 36 31 4c ┆ 025337671652L, 007637557061L┆ 0x04f200…09e600 2c 20 30 32 32 32 37 35 33 34 35 34 34 33 4c 2c 20 30 33 35 34 36 33 32 32 37 34 33 36 4c 2c 20 ┆, 022275345443L, 035463227436L, ┆ 0x04f200…09e600 0a 20 20 20 20 30 31 36 32 36 34 37 31 34 32 35 35 4c 2c 20 30 31 36 30 34 32 36 32 30 36 33 30 ┆ 016264714255L, 016042620630┆ 0x04f200…09e600 4c 2c 20 30 31 34 30 35 32 36 31 31 37 32 36 4c 2c 20 30 32 36 32 36 33 37 37 37 32 35 35 4c 2c ┆L, 014052611726L, 026263777255L,┆ 0x04f200…09e600 20 0a 20 20 20 20 30 30 33 30 31 32 37 30 31 30 35 35 4c 2c 20 30 31 34 33 30 30 35 36 33 36 32 ┆ 003012701055L, 01430056362┆ 0x04f200…09e600 37 4c 2c 20 30 30 34 36 35 36 32 37 31 33 36 32 4c 2c 20 30 31 34 34 30 34 35 33 37 33 37 33 4c ┆7L, 004656271362L, 014404537373L┆ 0x04f200…09e600 2c 20 0a 20 20 20 20 30 31 33 32 37 34 36 33 35 36 32 35 4c 2c 20 30 30 31 31 33 31 34 31 33 31 ┆, 013274635625L, 0011314131┆ 0x04f200…09e600 37 35 4c 2c 20 30 31 31 33 32 30 30 30 33 34 37 34 4c 2c 20 30 33 30 32 34 36 34 37 33 32 30 34 ┆75L, 011320003474L, 030246473204┆ 0x04f200…09e600 4c 2c 20 0a 20 20 20 20 30 33 33 37 35 34 35 35 36 30 36 32 4c 2c 20 30 30 36 35 30 35 36 33 36 ┆L, 033754556062L, 006505636┆ 0x04f200…09e600 31 34 32 4c 2c 20 30 33 33 35 31 34 33 31 30 30 33 31 4c 2c 20 30 31 30 33 36 30 35 31 31 37 37 ┆142L, 033514310031L, 01036051177┆ 0x04f200…09e600 36 4c 2c 20 0a 20 20 20 20 30 31 33 37 34 36 37 36 36 34 35 35 4c 2c 20 30 31 32 36 32 35 33 32 ┆6L, 013746766455L, 01262532┆ 0x04f200…09e600 30 31 31 36 4c 2c 20 30 31 30 37 33 30 35 36 37 30 30 32 4c 2c 20 30 32 33 32 30 34 34 37 32 31 ┆0116L, 010730567002L, 0232044721┆ 0x04f200…09e600 34 34 4c 2c 20 0a 20 20 20 20 30 33 36 36 32 35 37 36 32 31 37 33 4c 2c 20 30 30 37 33 32 32 32 ┆44L, 036625762173L, 0073222┆ 0x04f200…09e600 33 31 32 36 34 4c 2c 20 30 32 34 36 30 32 32 34 32 30 30 34 4c 2c 20 30 32 32 32 36 34 36 31 32 ┆31264L, 024602242004L, 022264612┆ 0x04f200…09e600 30 36 37 4c 2c 20 0a 20 20 20 20 30 33 30 31 33 37 37 35 35 36 31 35 4c 2c 20 30 32 34 37 37 31 ┆067L, 030137755615L, 024771┆ 0x04f200…09e600 34 31 32 37 31 34 4c 2c 20 30 32 37 31 30 31 32 36 33 31 31 34 4c 2c 20 30 31 31 36 34 31 30 37 ┆412714L, 027101263114L, 01164107┆ 0x04f200…09e600 33 34 37 36 4c 2c 20 0a 20 20 20 20 30 31 35 36 33 32 30 35 36 31 35 35 4c 2c 20 30 33 35 31 35 ┆3476L, 015632056155L, 03515┆ 0x04f200…09e600 36 31 34 33 33 37 36 4c 2c 20 30 31 31 34 33 31 37 30 36 37 32 34 4c 2c 20 30 31 35 33 34 33 30 ┆6143376L, 011431706724L, 0153430┆ 0x04f200…09e600 32 30 31 32 35 4c 2c 20 0a 20 20 20 20 30 32 32 30 37 32 32 31 33 31 31 37 4c 2c 20 30 31 30 36 ┆20125L, 022072213117L, 0106┆ 0x04f200…09e600 36 30 32 34 37 31 37 36 4c 2c 20 30 32 33 33 32 33 35 31 36 31 30 37 4c 2c 20 30 32 33 36 32 30 ┆60247176L, 023323516107L, 023620┆ 0x04f200…09e600 30 36 35 33 30 31 4c 2c 20 0a 20 20 20 20 30 32 31 30 32 35 33 32 34 34 35 37 4c 2c 20 30 33 34 ┆065301L, 021025324457L, 034┆ 0x04f200…09e600 37 34 37 34 30 33 34 37 35 4c 2c 20 30 33 35 35 37 34 33 31 35 35 31 36 4c 2c 20 30 30 34 35 35 ┆747403475L, 035574315516L, 00455┆ 0x04f200…09e600 30 31 30 30 36 31 32 4c 2c 20 0a 20 20 20 20 30 32 32 37 36 30 35 34 37 31 30 31 4c 2c 20 30 31 ┆0100612L, 022760547101L, 01┆ 0x04f200…09e600 35 36 34 32 37 37 37 35 32 32 4c 2c 20 30 32 36 32 30 31 35 34 37 34 34 31 4c 2c 20 30 30 36 32 ┆5642777522L, 026201547441L, 0062┆ 0x04f200…09e600 36 33 36 30 30 34 32 35 4c 2c 20 0a 20 20 20 20 30 32 34 33 31 34 30 34 31 31 35 37 4c 2c 20 30 ┆63600425L, 024314041157L, 0┆ 0x04f200…09e600 30 35 36 36 30 32 31 34 37 32 31 4c 2c 20 30 31 30 34 35 35 35 37 33 31 32 31 4c 2c 20 30 31 32 ┆05660214721L, 010455573121L, 012┆ 0x04f200…09e600 33 36 34 35 36 30 32 30 35 4c 2c 20 0a 20 20 20 20 30 30 31 33 32 34 36 34 34 35 37 30 4c 2c 20 ┆364560205L, 001324644570L, ┆ 0x04f200…09e600 30 31 37 33 33 32 35 32 32 30 35 30 4c 2c 20 30 33 31 33 37 36 36 32 36 35 36 32 4c 2c 20 30 33 ┆017332522050L, 031376626562L, 03┆ 0x04f200…09e600 34 30 31 35 37 35 32 31 36 36 4c 2c 20 0a 20 20 20 20 30 31 31 34 30 36 34 35 30 34 33 33 4c 2c ┆4015752166L, 011406450433L,┆ 0x04f200…09e600 20 30 33 37 36 36 34 35 36 33 35 36 30 4c 2c 20 30 30 35 34 31 33 30 35 34 36 31 30 4c 2c 20 30 ┆ 037664563560L, 005413054610L, 0┆ 0x04f200…09e600 33 30 31 32 37 37 32 31 36 33 32 4c 2c 20 0a 20 20 20 20 30 31 35 35 34 32 32 33 31 31 30 34 4c ┆30127721632L, 015542231104L┆ 0x04f200…09e600 2c 20 30 30 37 30 37 33 33 33 34 30 35 31 4c 2c 20 30 32 33 30 36 32 36 35 32 37 35 30 4c 2c 20 ┆, 007073334051L, 023062652750L, ┆ 0x04f200…09e600 30 30 30 33 35 31 33 31 33 34 36 35 4c 2c 20 0a 20 20 20 20 30 33 35 33 33 37 35 34 36 36 35 33 ┆000351313465L, 035337546653┆ 0x04f200…09e600 4c 2c 20 30 31 35 34 36 34 34 33 32 31 37 37 4c 2c 20 30 30 36 33 35 37 34 36 31 34 32 31 4c 2c ┆L, 015464432177L, 006357461421L,┆ 0x04f200…09e600 20 30 32 32 35 33 32 30 30 37 34 34 31 4c 2c 20 0a 20 20 20 20 30 31 34 31 36 32 37 34 30 35 36 ┆ 022532007441L, 01416274056┆ 0x04f200…09e600 37 4c 2c 20 30 31 35 34 32 33 31 33 35 31 35 34 4c 2c 20 30 33 36 32 36 33 37 37 30 32 31 37 4c ┆7L, 015423135154L, 036263770217L┆ 0x04f200…09e600 2c 20 30 33 36 33 37 33 36 32 33 30 31 37 4c 2c 20 0a 20 20 20 20 30 32 34 32 34 30 35 30 30 30 ┆, 036373623017L, 0242405000┆ 0x04f200…09e600 32 32 4c 2c 20 30 30 37 33 34 35 32 34 31 32 35 32 4c 2c 20 30 31 36 33 36 30 33 34 37 36 30 32 ┆22L, 007345241252L, 016360347602┆ 0x04f200…09e600 4c 2c 20 30 32 31 36 30 36 33 36 35 31 30 32 4c 2c 20 0a 20 20 20 20 30 32 37 31 34 33 34 37 33 ┆L, 021606365102L, 027143473┆ 0x04f200…09e600 35 30 35 4c 2c 20 30 32 31 36 32 30 36 36 32 33 36 37 4c 2c 20 30 33 32 37 35 35 37 34 37 30 33 ┆505L, 021620662367L, 03275574703┆ 0x04f200…09e600 35 4c 2c 20 30 33 33 35 33 33 37 33 33 32 37 32 4c 2c 20 0a 20 20 20 20 30 33 36 32 35 32 32 31 ┆5L, 033533733272L, 03625221┆ 0x04f200…09e600 30 37 33 34 4c 2c 20 30 32 30 32 31 34 35 33 37 33 36 36 4c 2c 20 30 33 34 33 31 33 33 36 35 37 ┆0734L, 020214537366L, 0343133657┆ 0x04f200…09e600 34 31 4c 2c 20 30 30 32 31 30 30 37 37 30 34 35 34 4c 2c 20 0a 20 20 20 20 30 30 37 35 34 30 32 ┆41L, 002100770454L, 0075402┆ 0x04f200…09e600 36 32 36 33 36 4c 2c 20 30 30 33 31 32 34 33 35 31 36 33 34 4c 2c 20 30 31 32 30 30 31 32 31 34 ┆62636L, 003124351634L, 012001214┆ 0x04f200…09e600 31 30 32 4c 2c 20 30 33 34 32 30 35 33 30 33 37 35 31 4c 2c 20 0a 20 20 20 20 30 33 33 37 31 32 ┆102L, 034205303751L, 033712┆ 0x04f200…09e600 31 30 34 34 36 31 4c 2c 20 30 32 30 33 37 37 33 33 32 35 37 33 4c 2c 20 30 30 34 35 37 33 33 36 ┆104461L, 020377332573L, 00457336┆ 0x04f200…09e600 37 35 37 36 4c 2c 20 30 32 30 32 33 37 36 36 34 30 31 36 4c 2c 20 0a 20 20 20 20 30 30 35 34 37 ┆7576L, 020237664016L, 00547┆ 0x04f200…09e600 30 30 37 34 30 33 32 4c 2c 20 30 32 35 37 35 32 34 37 33 31 30 37 4c 2c 20 30 30 35 36 34 32 32 ┆0074032L, 025752473107L, 0056422┆ 0x04f200…09e600 30 37 33 30 33 4c 2c 20 30 33 34 32 31 34 34 31 33 37 36 31 4c 2c 20 0a 20 20 20 20 30 31 34 32 ┆07303L, 034214413761L, 0142┆ 0x04f200…09e600 35 37 35 32 34 36 36 36 4c 2c 20 30 33 32 34 37 31 36 34 34 37 34 32 4c 2c 20 30 30 36 34 32 35 ┆57524666L, 032471644742L, 006425┆ 0x04f200…09e600 34 37 30 30 35 31 4c 2c 20 30 32 33 32 37 30 33 30 35 32 36 33 4c 2c 20 0a 20 20 20 20 30 30 36 ┆470051L, 023270305263L, 006┆ 0x04f200…09e600 30 35 32 35 33 30 33 30 35 4c 2c 20 30 32 37 30 31 32 32 31 31 37 37 30 4c 2c 20 30 32 30 32 31 ┆052530305L, 027012211770L, 02021┆ 0x04f200…09e600 34 31 31 30 31 33 34 4c 2c 20 30 31 32 36 30 37 33 34 34 32 31 35 4c 2c 20 0a 20 20 20 20 30 31 ┆4110134L, 012607344215L, 01┆ 0x04f200…09e600 31 34 31 30 35 36 35 32 31 34 4c 2c 20 30 33 35 30 36 37 36 32 30 31 30 31 4c 2c 20 30 31 32 30 ┆1410565214L, 035067620101L, 0120┆ 0x04f200…09e600 30 31 30 31 36 36 33 31 4c 2c 20 30 33 30 37 36 37 37 32 32 34 30 36 4c 2c 20 0a 20 20 20 20 30 ┆01016631L, 030767722406L, 0┆ 0x04f200…09e600 33 30 32 36 35 30 36 34 36 30 30 4c 2c 20 30 30 31 36 34 34 30 36 32 33 37 34 4c 2c 20 30 32 35 ┆30265064600L, 001644062374L, 025┆ 0x04f200…09e600 37 37 30 37 37 35 30 36 32 4c 2c 20 30 33 37 31 36 37 37 32 32 30 35 33 4c 2c 20 0a 20 20 20 20 ┆770775062L, 037167722053L, ┆ 0x04f200…09e600 30 31 31 31 30 34 34 33 34 34 37 34 4c 2c 20 30 31 34 36 37 34 31 33 35 37 36 32 4c 2c 20 30 31 ┆011104434474L, 014674135762L, 01┆ 0x04f200…09e600 30 31 34 33 36 33 33 32 31 35 4c 2c 20 30 33 32 36 30 33 33 33 34 33 34 31 4c 2c 20 0a 7d 3b 0a ┆0143633215L, 032603334341L, }; ┆ 0x04f200…09e600 0a 2f 2a 0a 20 2a 20 43 61 6c 63 75 6c 61 74 65 20 74 68 65 20 68 61 73 68 20 76 61 6c 20 66 6f ┆ /* * Calculate the hash val fo┆ 0x04f200…09e600 72 20 74 68 65 20 67 69 76 65 6e 20 69 74 65 6d 2e 0a 20 2a 20 41 6c 67 6f 72 69 74 68 6d 20 63 ┆r the given item. * Algorithm c┆ 0x04f200…09e600 68 6f 73 65 6e 20 62 79 20 52 69 63 68 61 72 64 20 53 74 61 6c 6c 6d 61 6e 20 0a 20 2a 20 61 66 ┆hosen by Richard Stallman * af┆ 0x04f200…09e600 74 65 72 20 64 69 73 63 75 73 73 69 6f 6e 73 20 77 69 74 68 20 50 72 6f 66 65 73 73 6f 72 20 52 ┆ter discussions with Professor R┆ 0x04f200…09e600 69 76 65 73 74 2c 0a 20 2a 20 77 69 74 68 6f 75 74 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 74 68 65 ┆ivest, * without looking at the┆ 0x04f200…09e600 20 6f 6e 65 20 66 6f 72 6d 65 72 6c 79 20 64 69 73 74 72 69 62 75 74 65 64 20 77 69 74 68 20 6d ┆ one formerly distributed with m┆ 0x04f200…09e600 64 62 6d 2e 0a 20 2a 2f 0a 70 72 69 76 61 74 65 20 6c 6f 6e 67 20 63 61 6c 63 68 61 73 68 28 70 ┆dbm. */ private long calchash(p┆ 0x04f200…09e600 74 72 2c 20 63 6f 75 6e 74 29 0a 72 65 67 69 73 74 65 72 20 63 68 61 72 20 2a 70 74 72 3b 0a 72 ┆tr, count) register char *ptr; r┆ 0x04f200…09e600 65 67 69 73 74 65 72 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 63 6f 75 6e 74 3b 0a 7b 0a 20 20 ┆egister unsigned int count; { ┆ 0x04f200…09e600 20 20 72 65 67 69 73 74 65 72 20 6c 6f 6e 67 20 61 63 63 75 6d 20 3d 20 30 3b 0a 20 20 20 20 72 ┆ register long accum = 0; r┆ 0x04f200…09e600 65 67 69 73 74 65 72 20 6c 6f 6e 67 20 2a 74 61 62 70 74 72 20 3d 20 26 74 61 62 6c 65 5b 30 5d ┆egister long *tabptr = &table[0]┆ 0x04f200…09e600 5b 30 5d 3b 0a 20 20 20 20 72 65 67 69 73 74 65 72 20 63 68 61 72 20 62 79 74 65 3b 0a 23 69 66 ┆[0]; register char byte; #if┆ 0x04f200…09e600 20 28 42 59 54 45 53 49 5a 20 21 3d 20 38 29 0a 20 20 20 20 72 65 67 69 73 74 65 72 20 63 68 61 ┆ (BYTESIZ != 8) register cha┆ 0x04f200…09e600 72 20 66 75 6c 6c 62 79 74 65 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 77 68 69 6c 65 20 28 63 ┆r fullbyte; #endif while (c┆ 0x04f200…09e600 6f 75 6e 74 2d 2d 29 0a 20 20 20 20 7b 0a 09 62 79 74 65 20 3d 20 2a 70 74 72 2b 2b 3b 0a 23 69 ┆ount--) { byte = *ptr++; #i┆ 0x04f200…09e600 66 20 28 42 59 54 45 53 49 5a 20 3d 3d 20 38 29 0a 09 61 63 63 75 6d 20 2b 3d 20 74 61 62 70 74 ┆f (BYTESIZ == 8) accum += tabpt┆ 0x04f200…09e600 72 5b 62 79 74 65 20 26 20 30 78 66 5d 3b 20 74 61 62 70 74 72 20 2b 3d 20 30 78 31 30 3b 0a 09 ┆r[byte & 0xf]; tabptr += 0x10; ┆ 0x04f200…09e600 61 63 63 75 6d 20 2b 3d 20 74 61 62 70 74 72 5b 28 62 79 74 65 20 3e 3e 20 34 29 20 26 20 30 78 ┆accum += tabptr[(byte >> 4) & 0x┆ 0x04f200…09e600 66 5d 3b 20 74 61 62 70 74 72 20 2b 3d 20 30 78 31 30 3b 0a 09 69 66 20 28 74 61 62 70 74 72 20 ┆f]; tabptr += 0x10; if (tabptr ┆ 0x04f200…09e600 3d 3d 20 28 26 74 61 62 6c 65 5b 30 5d 5b 30 5d 20 2b 20 28 73 69 7a 65 6f 66 28 74 61 62 6c 65 ┆== (&table[0][0] + (sizeof(table┆ 0x04f200…09e600 29 20 2f 20 73 69 7a 65 6f 66 28 6c 6f 6e 67 29 29 29 29 0a 09 7b 0a 09 20 20 20 20 74 61 62 70 ┆) / sizeof(long)))) { tabp┆ 0x04f200…09e600 74 72 20 3d 20 26 74 61 62 6c 65 5b 30 5d 5b 30 5d 3b 0a 09 20 20 20 20 61 63 63 75 6d 20 3d 20 ┆tr = &table[0][0]; accum = ┆ 0x04f200…09e600 28 61 63 63 75 6d 20 3c 3c 20 31 29 20 2b 20 28 31 20 26 20 28 61 63 63 75 6d 20 3e 3e 20 33 31 ┆(accum << 1) + (1 & (accum >> 31┆ 0x04f200…09e600 29 29 3b 0a 09 7d 0a 23 65 6c 73 65 0a 09 66 75 6c 6c 62 79 74 65 20 3d 20 2d 31 3b 0a 09 77 68 ┆)); } #else fullbyte = -1; wh┆ 0x04f200…09e600 69 6c 65 20 28 66 75 6c 6c 62 79 74 65 29 0a 09 7b 0a 09 20 20 20 20 61 63 63 75 6d 20 2b 3d 20 ┆ile (fullbyte) { accum += ┆ 0x04f200…09e600 74 61 62 70 74 72 5b 62 79 74 65 20 26 20 30 78 66 5d 3b 20 74 61 62 70 74 72 20 2b 3d 20 30 78 ┆tabptr[byte & 0xf]; tabptr += 0x┆ 0x04f200…09e600 31 30 3b 0a 09 20 20 20 20 62 79 74 65 20 3e 3e 3d 20 34 3b 0a 09 20 20 20 20 66 75 6c 6c 62 79 ┆10; byte >>= 4; fullby┆ 0x04f200…09e600 74 65 20 3c 3c 3d 20 34 3b 0a 09 20 20 20 20 69 66 20 28 74 61 62 70 74 72 20 3d 3d 20 28 26 74 ┆te <<= 4; if (tabptr == (&t┆ 0x04f200…09e600 61 62 6c 65 5b 30 5d 5b 30 5d 20 2b 20 28 73 69 7a 65 6f 66 20 74 61 62 6c 65 20 2f 20 73 69 7a ┆able[0][0] + (sizeof table / siz┆ 0x04f200…09e600 65 6f 66 28 6c 6f 6e 67 29 29 29 29 0a 09 20 20 20 20 7b 0a 09 09 74 61 62 70 74 72 20 3d 20 26 ┆eof(long)))) { tabptr = &┆ 0x04f200…09e600 74 61 62 6c 65 5b 30 5d 5b 30 5d 3b 0a 09 09 61 63 63 75 6d 20 3d 20 28 61 63 63 75 6d 20 3c 3c ┆table[0][0]; accum = (accum <<┆ 0x04f200…09e600 20 31 29 20 2b 20 28 31 20 26 20 28 61 63 63 75 6d 20 3e 3e 20 33 31 29 29 3b 0a 09 20 20 20 20 ┆ 1) + (1 & (accum >> 31)); ┆ 0x04f200…09e600 7d 0a 09 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 28 42 59 54 45 53 49 5a 20 21 3d 20 38 29 20 2a 2f ┆} } #endif /* (BYTESIZ != 8) */┆ 0x04f200…09e600 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 28 61 63 63 75 6d 29 3b 0a 7d 0a 0a 2f 2a 0a ┆ } return(accum); } /* ┆ 0x04f200…09e600 20 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 66 75 6e 63 74 69 6f 6e 73 20 65 ┆ * The following two functions e┆ 0x04f200…09e600 6e 63 61 70 73 75 6c 61 74 65 20 61 6c 6c 20 68 61 6e 64 6c 69 6e 67 20 6f 66 20 74 68 65 20 2e ┆ncapsulate all handling of the .┆ 0x04f200…09e600 64 69 72 20 66 69 6c 65 2e 0a 20 2a 20 54 68 65 79 20 69 6d 70 6c 65 6d 65 6e 74 20 67 65 74 2f ┆dir file. * They implement get/┆ 0x04f200…09e600 73 65 74 20 6f 66 20 74 68 65 20 62 69 74 20 73 70 65 63 69 66 69 65 64 20 62 79 20 64 62 2d 3e ┆set of the bit specified by db->┆ 0x04f200…09e600 62 69 74 6e 6f 20 69 6e 20 74 68 65 20 2e 64 69 72 20 66 69 6c 65 2e 0a 20 2a 2f 0a 23 64 65 66 ┆bitno in the .dir file. */ #def┆ 0x04f200…09e600 69 6e 65 20 72 65 61 64 5f 64 69 72 62 28 64 62 2c 20 62 29 20 28 76 6f 69 64 29 20 72 65 61 64 ┆ine read_dirb(db, b) (void) read┆ 0x04f200…09e600 28 64 62 2d 3e 64 69 72 66 2c 20 28 62 29 2c 20 28 69 6f 6c 65 6e 5f 74 29 44 42 4c 4b 53 49 5a ┆(db->dirf, (b), (iolen_t)DBLKSIZ┆ 0x04f200…09e600 29 0a 23 64 65 66 69 6e 65 20 77 72 69 74 65 5f 64 69 72 62 28 64 62 2c 62 29 20 28 76 6f 69 64 ┆) #define write_dirb(db,b) (void┆ 0x04f200…09e600 29 20 77 72 69 74 65 28 64 62 2d 3e 64 69 72 66 2c 20 28 62 29 2c 20 28 69 6f 6c 65 6e 5f 74 29 ┆) write(db->dirf, (b), (iolen_t)┆ 0x04f200…09e600 44 42 4c 4b 53 49 5a 29 0a 23 64 65 66 69 6e 65 20 6c 6f 63 6b 5f 64 69 72 62 28 64 62 29 20 20 ┆DBLKSIZ) #define lock_dirb(db) ┆ 0x04f200…09e600 20 20 28 76 6f 69 64 29 20 6c 6f 63 6b 66 28 28 64 62 29 2d 3e 64 69 72 66 2c 20 46 5f 4c 4f 43 ┆ (void) lockf((db)->dirf, F_LOC┆ 0x04f200…09e600 4b 2c 20 28 6c 6f 6e 67 29 44 42 4c 4b 53 49 5a 29 0a 23 64 65 66 69 6e 65 20 75 6e 6c 6f 63 6b ┆K, (long)DBLKSIZ) #define unlock┆ 0x04f200…09e600 5f 64 69 72 62 28 64 62 29 20 20 28 76 6f 69 64 29 20 6c 6f 63 6b 66 28 28 64 62 29 2d 3e 64 69 ┆_dirb(db) (void) lockf((db)->di┆ 0x04f200…09e600 72 66 2c 20 46 5f 55 4c 4f 43 4b 2c 20 28 6c 6f 6e 67 29 44 42 4c 4b 53 49 5a 29 0a 0a 2f 2a 41 ┆rf, F_ULOCK, (long)DBLKSIZ) /*A┆ 0x04f200…09e600 52 47 53 55 53 45 44 31 2a 2f 0a 70 72 69 76 61 74 65 20 69 6e 74 20 62 69 74 67 65 74 28 64 62 ┆RGSUSED1*/ private int bitget(db┆ 0x04f200…09e600 2c 20 77 6c 6f 63 6b 29 0a 2f 2a 20 66 65 74 63 68 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 ┆, wlock) /* fetch the directory ┆ 0x04f200…09e600 62 6c 6f 63 6b 20 69 6e 64 65 78 65 64 20 62 79 20 64 62 2d 3e 62 69 74 6e 6f 20 2a 2f 0a 72 65 ┆block indexed by db->bitno */ re┆ 0x04f200…09e600 67 69 73 74 65 72 20 64 61 74 61 62 61 73 65 20 2a 64 62 3b 0a 62 6f 6f 6c 20 77 6c 6f 63 6b 3b ┆gister database *db; bool wlock;┆ 0x04f200…09e600 0a 7b 0a 20 20 20 20 6c 6f 6e 67 09 62 79 74 65 6e 75 6d 3b 0a 20 20 20 20 72 65 67 69 73 74 65 ┆ { long bytenum; registe┆ 0x04f200…09e600 72 20 6c 6f 6e 67 20 62 6c 6f 63 6b 6e 75 6d 2c 20 62 6f 66 66 73 65 74 2c 20 62 69 74 3b 0a 0a ┆r long blocknum, boffset, bit; ┆ 0x04f200…09e600 20 20 20 20 69 66 20 28 64 62 2d 3e 62 69 74 6e 6f 20 3e 20 64 62 2d 3e 6d 61 78 62 6e 6f 29 0a ┆ if (db->bitno > db->maxbno) ┆ 0x04f200…09e600 09 72 65 74 75 72 6e 28 30 29 3b 0a 20 20 20 20 62 69 74 20 3d 20 64 62 2d 3e 62 69 74 6e 6f 20 ┆ return(0); bit = db->bitno ┆ 0x04f200…09e600 25 20 42 59 54 45 53 49 5a 3b 0a 20 20 20 20 62 79 74 65 6e 75 6d 20 3d 20 64 62 2d 3e 62 69 74 ┆% BYTESIZ; bytenum = db->bit┆ 0x04f200…09e600 6e 6f 20 2f 20 42 59 54 45 53 49 5a 3b 0a 20 20 20 20 62 6f 66 66 73 65 74 20 3d 20 62 79 74 65 ┆no / BYTESIZ; boffset = byte┆ 0x04f200…09e600 6e 75 6d 20 25 20 44 42 4c 4b 53 49 5a 3b 0a 20 20 20 20 62 6c 6f 63 6b 6e 75 6d 20 3d 20 62 79 ┆num % DBLKSIZ; blocknum = by┆ 0x04f200…09e600 74 65 6e 75 6d 20 2f 20 44 42 4c 4b 53 49 5a 3b 0a 23 69 66 6e 64 65 66 20 4c 4f 43 4b 46 09 2f ┆tenum / DBLKSIZ; #ifndef LOCKF /┆ 0x04f200…09e600 2a 20 63 61 6e 27 74 20 62 75 66 66 65 72 20 62 6c 6f 63 6b 73 20 69 6e 20 6d 65 6d 6f 72 79 20 ┆* can't buffer blocks in memory ┆ 0x04f200…09e600 69 66 20 6d 75 6c 74 69 2d 75 73 65 72 20 2a 2f 0a 20 20 20 20 69 66 20 28 62 6c 6f 63 6b 6e 75 ┆if multi-user */ if (blocknu┆ 0x04f200…09e600 6d 20 21 3d 20 64 62 2d 3e 6f 6c 64 64 69 72 62 29 0a 20 20 20 20 7b 0a 23 65 6e 64 69 66 20 2f ┆m != db->olddirb) { #endif /┆ 0x04f200…09e600 2a 20 4c 4f 43 4b 46 20 2a 2f 0a 09 28 76 6f 69 64 29 20 62 7a 65 72 6f 28 64 62 2d 3e 64 69 72 ┆* LOCKF */ (void) bzero(db->dir┆ 0x04f200…09e600 62 75 66 2c 20 44 42 4c 4b 53 49 5a 29 3b 0a 09 28 76 6f 69 64 29 20 73 65 74 75 70 5f 64 62 28 ┆buf, DBLKSIZ); (void) setup_db(┆ 0x04f200…09e600 64 62 29 3b 0a 23 69 66 64 65 66 20 4d 41 49 4e 0a 09 28 76 6f 69 64 29 20 70 72 69 6e 74 66 28 ┆db); #ifdef MAIN (void) printf(┆ 0x04f200…09e600 22 65 64 62 6d 3a 20 73 65 65 6b 69 6e 67 20 74 6f 20 2e 64 69 72 20 62 6c 6f 63 6b 20 25 6c 64 ┆"edbm: seeking to .dir block %ld┆ 0x04f200…09e600 5c 6e 22 2c 20 62 6c 6f 63 6b 6e 75 6d 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 4d 41 49 4e 20 2a ┆\n", blocknum); #endif /* MAIN *┆ 0x04f200…09e600 2f 0a 09 28 76 6f 69 64 29 20 6c 73 65 65 6b 28 28 64 62 29 2d 3e 64 69 72 66 2c 20 28 6f 66 66 ┆/ (void) lseek((db)->dirf, (off┆ 0x04f200…09e600 5f 74 29 28 62 6c 6f 63 6b 6e 75 6d 20 2a 20 44 42 4c 4b 53 49 5a 29 2c 20 53 45 45 4b 5f 53 45 ┆_t)(blocknum * DBLKSIZ), SEEK_SE┆ 0x04f200…09e600 54 29 3b 0a 23 69 66 64 65 66 20 4c 4f 43 4b 46 0a 09 69 66 20 28 77 6c 6f 63 6b 29 0a 09 7b 0a ┆T); #ifdef LOCKF if (wlock) { ┆ 0x04f200…09e600 23 69 66 64 65 66 20 4d 41 49 4e 0a 09 20 20 20 20 28 76 6f 69 64 29 20 70 72 69 6e 74 66 28 22 ┆#ifdef MAIN (void) printf("┆ 0x04f200…09e600 65 64 62 6d 3a 20 6c 6f 63 6b 69 6e 67 20 2e 64 69 72 20 62 6c 6f 63 6b 20 25 6c 64 5c 6e 22 2c ┆edbm: locking .dir block %ld\n",┆ 0x04f200…09e600 20 62 6c 6f 63 6b 6e 75 6d 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 4d 41 49 4e 20 2a 2f 0a 09 20 ┆ blocknum); #endif /* MAIN */ ┆ 0x04f200…09e600 20 20 20 6c 6f 63 6b 5f 64 69 72 62 28 64 62 29 3b 0a 09 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4c ┆ lock_dirb(db); } #endif /* L┆ 0x04f200…09e600 4f 43 4b 46 20 2a 2f 0a 23 69 66 64 65 66 20 4d 41 49 4e 0a 09 28 76 6f 69 64 29 20 70 72 69 6e ┆OCKF */ #ifdef MAIN (void) prin┆ 0x04f200…09e600 74 66 28 22 65 64 62 6d 3a 20 72 65 61 64 69 6e 67 20 2e 64 69 72 20 62 6c 6f 63 6b 20 25 6c 64 ┆tf("edbm: reading .dir block %ld┆ 0x04f200…09e600 2e 2e 2e 22 2c 20 62 6c 6f 63 6b 6e 75 6d 29 3b 0a 09 28 76 6f 69 64 29 20 66 66 6c 75 73 68 28 ┆...", blocknum); (void) fflush(┆ 0x04f200…09e600 73 74 64 6f 75 74 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 4d 41 49 4e 20 2a 2f 0a 09 72 65 61 64 ┆stdout); #endif /* MAIN */ read┆ 0x04f200…09e600 5f 64 69 72 62 28 64 62 2c 20 64 62 2d 3e 64 69 72 62 75 66 29 3b 0a 23 69 66 64 65 66 20 4d 41 ┆_dirb(db, db->dirbuf); #ifdef MA┆ 0x04f200…09e600 49 4e 0a 09 28 76 6f 69 64 29 20 70 72 69 6e 74 66 28 22 67 6f 74 20 69 74 5c 6e 22 29 3b 0a 23 ┆IN (void) printf("got it\n"); #┆ 0x04f200…09e600 65 6e 64 69 66 20 2f 2a 20 4d 41 49 4e 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4c 4f 43 4b 46 20 0a ┆endif /* MAIN */ #ifndef LOCKF ┆ 0x04f200…09e600 09 64 62 2d 3e 6f 6c 64 64 69 72 62 20 3d 20 62 6c 6f 63 6b 6e 75 6d 3b 0a 20 20 20 20 7d 0a 23 ┆ db->olddirb = blocknum; } #┆ 0x04f200…09e600 65 6e 64 69 66 20 2f 2a 20 4c 4f 43 4b 46 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 28 28 64 ┆endif /* LOCKF */ return ((d┆ 0x04f200…09e600 62 2d 3e 64 69 72 62 75 66 5b 62 6f 66 66 73 65 74 5d 20 26 20 28 31 20 3c 3c 20 62 69 74 29 29 ┆b->dirbuf[boffset] & (1 << bit))┆ 0x04f200…09e600 20 21 3d 20 30 29 3b 0a 7d 0a 0a 70 72 69 76 61 74 65 20 69 6e 74 20 62 69 74 73 65 74 28 64 62 ┆ != 0); } private int bitset(db┆ 0x04f200…09e600 29 0a 72 65 67 69 73 74 65 72 20 20 20 20 64 61 74 61 62 61 73 65 20 2a 64 62 3b 0a 7b 0a 20 20 ┆) register database *db; { ┆ 0x04f200…09e600 20 20 6c 6f 6e 67 09 62 79 74 65 6e 75 6d 3b 0a 20 20 20 20 72 65 67 69 73 74 65 72 20 6c 6f 6e ┆ long bytenum; register lon┆ 0x04f200…09e600 67 20 62 6f 66 66 73 65 74 2c 20 62 69 74 2c 20 62 6c 6f 63 6b 6e 75 6d 3b 0a 0a 20 20 20 20 69 ┆g boffset, bit, blocknum; i┆ 0x04f200…09e600 66 20 28 64 62 2d 3e 64 62 72 64 6f 6e 6c 79 29 0a 09 72 65 74 75 72 6e 28 46 41 49 4c 29 3b 0a ┆f (db->dbrdonly) return(FAIL); ┆ 0x04f200…09e600 20 20 20 20 69 66 20 28 64 62 2d 3e 62 69 74 6e 6f 20 3e 20 64 62 2d 3e 6d 61 78 62 6e 6f 29 0a ┆ if (db->bitno > db->maxbno) ┆ 0x04f200…09e600 20 20 20 20 7b 0a 09 64 62 2d 3e 6d 61 78 62 6e 6f 20 3d 20 64 62 2d 3e 62 69 74 6e 6f 3b 0a 09 ┆ { db->maxbno = db->bitno; ┆ 0x04f200…09e600 28 76 6f 69 64 29 20 62 69 74 67 65 74 28 64 62 2c 20 54 52 55 45 29 3b 09 2f 2a 20 74 68 69 73 ┆(void) bitget(db, TRUE); /* this┆ 0x04f200…09e600 20 64 6f 65 73 20 61 20 6c 6f 63 6b 5f 64 69 72 62 28 29 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 ┆ does a lock_dirb() */ } ┆ 0x04f200…09e600 20 62 69 74 20 3d 20 64 62 2d 3e 62 69 74 6e 6f 20 25 20 42 59 54 45 53 49 5a 3b 0a 20 20 20 20 ┆ bit = db->bitno % BYTESIZ; ┆ 0x04f200…09e600 62 79 74 65 6e 75 6d 20 3d 20 64 62 2d 3e 62 69 74 6e 6f 20 2f 20 42 59 54 45 53 49 5a 3b 0a 20 ┆bytenum = db->bitno / BYTESIZ; ┆ 0x04f200…09e600 20 20 20 62 6f 66 66 73 65 74 20 3d 20 62 79 74 65 6e 75 6d 20 25 20 44 42 4c 4b 53 49 5a 3b 0a ┆ boffset = bytenum % DBLKSIZ; ┆ 0x04f200…09e600 20 20 20 20 62 6c 6f 63 6b 6e 75 6d 20 3d 20 62 79 74 65 6e 75 6d 20 2f 20 44 42 4c 4b 53 49 5a ┆ blocknum = bytenum / DBLKSIZ┆ 0x04f200…09e600 3b 0a 20 20 20 20 64 62 2d 3e 64 69 72 62 75 66 5b 62 6f 66 66 73 65 74 5d 20 7c 3d 20 28 31 20 ┆; db->dirbuf[boffset] |= (1 ┆ 0x04f200…09e600 3c 3c 20 62 69 74 29 3b 0a 0a 20 20 20 20 28 76 6f 69 64 29 20 73 65 74 75 70 5f 64 62 28 64 62 ┆<< bit); (void) setup_db(db┆ 0x04f200…09e600 29 3b 0a 23 69 66 64 65 66 20 4d 41 49 4e 0a 20 20 20 20 28 76 6f 69 64 29 20 70 72 69 6e 74 66 ┆); #ifdef MAIN (void) printf┆ 0x04f200…09e600 28 22 65 64 62 6d 3a 20 73 65 65 6b 69 6e 67 20 74 6f 20 2e 64 69 72 20 62 6c 6f 63 6b 20 25 6c ┆("edbm: seeking to .dir block %l┆ 0x04f200…09e600 64 5c 6e 22 2c 20 62 6c 6f 63 6b 6e 75 6d 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 4d 41 49 4e 20 ┆d\n", blocknum); #endif /* MAIN ┆ 0x04f200…09e600 2a 2f 0a 20 20 20 20 28 76 6f 69 64 29 20 6c 73 65 65 6b 28 28 64 62 29 2d 3e 64 69 72 66 2c 20 ┆*/ (void) lseek((db)->dirf, ┆ 0x04f200…09e600 28 6f 66 66 5f 74 29 28 62 6c 6f 63 6b 6e 75 6d 20 2a 20 44 42 4c 4b 53 49 5a 29 2c 20 53 45 45 ┆(off_t)(blocknum * DBLKSIZ), SEE┆ 0x04f200…09e600 4b 5f 53 45 54 29 3b 0a 23 69 66 64 65 66 20 4d 41 49 4e 0a 20 20 20 20 28 76 6f 69 64 29 20 70 ┆K_SET); #ifdef MAIN (void) p┆ 0x04f200…09e600 72 69 6e 74 66 28 22 65 64 62 6d 3a 20 77 72 69 74 69 6e 67 20 2e 64 69 72 20 62 6c 6f 63 6b 20 ┆rintf("edbm: writing .dir block ┆ 0x04f200…09e600 25 6c 64 2e 2e 2e 22 2c 20 62 6c 6f 63 6b 6e 75 6d 29 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 66 ┆%ld...", blocknum); (void) f┆ 0x04f200…09e600 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 4d 41 49 4e 20 2a 2f ┆flush(stdout); #endif /* MAIN */┆ 0x04f200…09e600 0a 20 20 20 20 77 72 69 74 65 5f 64 69 72 62 28 64 62 2c 20 64 62 2d 3e 64 69 72 62 75 66 29 3b ┆ write_dirb(db, db->dirbuf);┆ 0x04f200…09e600 0a 23 69 66 64 65 66 20 4d 41 49 4e 0a 20 20 20 20 28 76 6f 69 64 29 20 70 72 69 6e 74 66 28 22 ┆ #ifdef MAIN (void) printf("┆ 0x04f200…09e600 64 69 64 20 69 74 5c 6e 22 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 4d 41 49 4e 20 2a 2f 0a 23 69 ┆did it\n"); #endif /* MAIN */ #i┆ 0x04f200…09e600 66 64 65 66 20 4c 4f 43 4b 46 0a 23 69 66 64 65 66 20 4d 41 49 4e 0a 20 20 20 20 28 76 6f 69 64 ┆fdef LOCKF #ifdef MAIN (void┆ 0x04f200…09e600 29 20 70 72 69 6e 74 66 28 22 65 64 62 6d 3a 20 73 65 65 6b 69 6e 67 20 74 6f 20 2e 64 69 72 20 ┆) printf("edbm: seeking to .dir ┆ 0x04f200…09e600 62 6c 6f 63 6b 20 25 6c 64 5c 6e 22 2c 20 62 6c 6f 63 6b 6e 75 6d 29 3b 0a 23 65 6e 64 69 66 20 ┆block %ld\n", blocknum); #endif ┆ 0x04f200…09e600 2f 2a 20 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 28 76 6f 69 64 29 20 6c 73 65 65 6b 28 28 64 62 29 ┆/* MAIN */ (void) lseek((db)┆ 0x04f200…09e600 2d 3e 64 69 72 66 2c 20 28 6f 66 66 5f 74 29 28 62 6c 6f 63 6b 6e 75 6d 20 2a 20 44 42 4c 4b 53 ┆->dirf, (off_t)(blocknum * DBLKS┆ 0x04f200…09e600 49 5a 29 2c 20 53 45 45 4b 5f 53 45 54 29 3b 20 20 20 20 0a 23 69 66 64 65 66 20 4d 41 49 4e 0a ┆IZ), SEEK_SET); #ifdef MAIN ┆ 0x04f200…09e600 20 20 20 20 28 76 6f 69 64 29 20 70 72 69 6e 74 66 28 22 65 64 62 6d 3a 20 75 6e 6c 6f 63 6b 69 ┆ (void) printf("edbm: unlocki┆ 0x04f200…09e600 6e 67 20 2e 64 69 72 20 62 6c 6f 63 6b 20 25 6c 64 2e 2e 2e 22 2c 20 62 6c 6f 63 6b 6e 75 6d 29 ┆ng .dir block %ld...", blocknum)┆ 0x04f200…09e600 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b 0a 23 65 6e ┆; (void) fflush(stdout); #en┆ 0x04f200…09e600 64 69 66 20 2f 2a 20 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 75 6e 6c 6f 63 6b 5f 64 69 72 62 28 64 ┆dif /* MAIN */ unlock_dirb(d┆ 0x04f200…09e600 62 29 3b 0a 23 69 66 64 65 66 20 4d 41 49 4e 0a 20 20 20 20 28 76 6f 69 64 29 20 70 72 69 6e 74 ┆b); #ifdef MAIN (void) print┆ 0x04f200…09e600 66 28 22 64 69 64 20 69 74 5c 6e 22 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 4d 41 49 4e 20 2a 2f ┆f("did it\n"); #endif /* MAIN */┆ 0x04f200…09e600 0a 23 65 6e 64 69 66 20 2f 2a 20 4c 4f 43 4b 46 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 28 53 ┆ #endif /* LOCKF */ return(S┆ 0x04f200…09e600 55 43 43 45 45 44 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 4f 6e 6c 79 20 74 68 65 20 66 6f 6c 6c 6f ┆UCCEED); } /* * Only the follo┆ 0x04f200…09e600 77 69 6e 67 20 66 69 76 65 20 66 75 6e 63 74 69 6f 6e 73 20 6b 6e 6f 77 20 61 62 6f 75 74 20 74 ┆wing five functions know about t┆ 0x04f200…09e600 68 65 20 69 6e 74 65 72 6e 61 6c 20 66 6f 72 6d 61 74 20 6f 66 0a 20 2a 20 2e 70 61 67 20 62 6c ┆he internal format of * .pag bl┆ 0x04f200…09e600 6f 63 6b 73 2e 0a 20 2a 2f 0a 70 72 69 76 61 74 65 20 64 61 74 75 6d 20 6d 61 6b 64 61 74 75 6d ┆ocks. */ private datum makdatum┆ 0x04f200…09e600 28 62 75 66 2c 20 6e 29 0a 63 68 61 72 20 20 20 20 62 75 66 5b 50 42 4c 4b 53 49 5a 5d 3b 0a 69 ┆(buf, n) char buf[PBLKSIZ]; i┆ 0x04f200…09e600 6e 74 20 6e 3b 0a 7b 0a 20 20 20 20 72 65 67 69 73 74 65 72 20 73 68 6f 72 74 20 2a 73 70 2c 20 ┆nt n; { register short *sp, ┆ 0x04f200…09e600 6f 66 66 73 65 74 3b 0a 20 20 20 20 72 65 67 69 73 74 65 72 20 69 6e 74 20 74 3b 0a 20 20 20 20 ┆offset; register int t; ┆ 0x04f200…09e600 72 65 67 69 73 74 65 72 20 63 68 61 72 20 09 2a 6c 70 3b 0a 20 20 20 20 64 61 74 75 6d 09 69 74 ┆register char *lp; datum it┆ 0x04f200…09e600 65 6d 3b 0a 0a 23 69 66 6e 64 65 66 20 6c 69 6e 74 0a 20 20 20 20 73 70 20 3d 20 28 73 73 68 6f ┆em; #ifndef lint sp = (ssho┆ 0x04f200…09e600 72 74 20 2a 29 20 62 75 66 3b 0a 23 65 6c 73 65 0a 20 20 20 20 73 70 20 3d 20 4e 55 4c 4c 3b 0a ┆rt *) buf; #else sp = NULL; ┆ 0x04f200…09e600 23 65 6e 64 69 66 0a 20 20 20 20 69 66 20 28 6e 20 3c 20 30 20 7c 7c 20 6e 20 3e 3d 20 73 70 5b ┆#endif if (n < 0 || n >= sp[┆ 0x04f200…09e600 30 5d 29 0a 20 20 20 20 7b 0a 09 69 74 65 6d 2e 64 70 74 72 20 3d 20 28 63 68 61 72 20 2a 29 4e ┆0]) { item.dptr = (char *)N┆ 0x04f200…09e600 55 4c 4c 3b 0a 09 69 74 65 6d 2e 64 73 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 ┆ULL; item.dsize = 0; } ┆ 0x04f200…09e600 65 6c 73 65 0a 20 20 20 20 7b 0a 09 74 20 3d 20 50 42 4c 4b 53 49 5a 3b 0a 09 69 66 20 28 6e 20 ┆else { t = PBLKSIZ; if (n ┆ 0x04f200…09e600 3e 20 30 29 0a 09 20 20 20 20 74 20 3d 20 73 70 5b 6e 20 2b 20 31 20 2d 20 31 5d 3b 0a 09 6c 70 ┆> 0) t = sp[n + 1 - 1]; lp┆ 0x04f200…09e600 20 3d 20 62 75 66 20 2b 20 28 6f 66 66 73 65 74 20 3d 20 73 70 5b 6e 20 2b 20 31 5d 29 3b 0a 23 ┆ = buf + (offset = sp[n + 1]); #┆ 0x04f200…09e600 69 66 20 64 65 66 69 6e 65 64 28 6c 69 6e 74 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f ┆if defined(lint) || !defined(NO_┆ 0x04f200…09e600 41 4c 49 47 4e 4d 45 4e 54 29 0a 09 28 76 6f 69 64 29 20 6d 65 6d 63 70 79 28 28 63 68 61 72 20 ┆ALIGNMENT) (void) memcpy((char ┆ 0x04f200…09e600 2a 29 26 69 74 65 6d 2e 64 61 64 64 72 65 73 73 2c 20 6c 70 2c 20 73 69 7a 65 6f 66 28 73 6c 6f ┆*)&item.daddress, lp, sizeof(slo┆ 0x04f200…09e600 6e 67 29 29 3b 0a 23 65 6c 73 65 0a 09 2a 28 28 73 6c 6f 6e 67 20 2a 29 20 26 69 74 65 6d 2e 64 ┆ng)); #else *((slong *) &item.d┆ 0x04f200…09e600 61 64 64 72 65 73 73 29 20 3d 20 2a 28 28 73 6c 6f 6e 67 20 2a 29 20 6c 70 29 3b 0a 23 65 6e 64 ┆address) = *((slong *) lp); #end┆ 0x04f200…09e600 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 6c 69 6e 74 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 ┆if /* defined(lint) || !defined(┆ 0x04f200…09e600 4e 4f 5f 41 4c 49 47 4e 4d 45 4e 54 29 20 2a 2f 0a 09 6c 70 20 2b 3d 20 73 69 7a 65 6f 66 28 73 ┆NO_ALIGNMENT) */ lp += sizeof(s┆ 0x04f200…09e600 6c 6f 6e 67 29 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 6c 69 6e 74 29 20 7c 7c 20 21 64 65 66 ┆long); #if defined(lint) || !def┆ 0x04f200…09e600 69 6e 65 64 28 4e 4f 5f 41 4c 49 47 4e 4d 45 4e 54 29 0a 09 28 76 6f 69 64 29 20 6d 65 6d 63 70 ┆ined(NO_ALIGNMENT) (void) memcp┆ 0x04f200…09e600 79 28 28 63 68 61 72 20 2a 29 26 69 74 65 6d 2e 64 6c 65 6e 67 74 68 2c 20 6c 70 2c 20 73 69 7a ┆y((char *)&item.dlength, lp, siz┆ 0x04f200…09e600 65 6f 66 28 73 6c 6f 6e 67 29 29 3b 0a 23 65 6c 73 65 0a 09 2a 28 28 73 6c 6f 6e 67 20 2a 29 20 ┆eof(slong)); #else *((slong *) ┆ 0x04f200…09e600 26 69 74 65 6d 2e 64 6c 65 6e 67 74 68 29 20 3d 20 2a 28 28 73 6c 6f 6e 67 20 2a 29 20 6c 70 29 ┆&item.dlength) = *((slong *) lp)┆ 0x04f200…09e600 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 6c 69 6e 74 29 20 7c 7c 20 21 64 65 ┆; #endif /* defined(lint) || !de┆ 0x04f200…09e600 66 69 6e 65 64 28 4e 4f 5f 41 4c 49 47 4e 4d 45 4e 54 29 20 2a 2f 0a 09 6c 70 20 2b 3d 20 73 69 ┆fined(NO_ALIGNMENT) */ lp += si┆ 0x04f200…09e600 7a 65 6f 66 28 73 6c 6f 6e 67 29 3b 0a 09 69 74 65 6d 2e 64 70 74 72 20 3d 20 6c 70 3b 0a 09 69 ┆zeof(slong); item.dptr = lp; i┆ 0x04f200…09e600 74 65 6d 2e 64 73 69 7a 65 20 3d 20 74 20 2d 20 6f 66 66 73 65 74 20 2d 20 32 20 2a 20 73 69 7a ┆tem.dsize = t - offset - 2 * siz┆ 0x04f200…09e600 65 6f 66 28 73 6c 6f 6e 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 28 69 74 65 ┆eof(slong); } return(ite┆ 0x04f200…09e600 6d 29 3b 0a 7d 0a 0a 70 72 69 76 61 74 65 20 69 6e 74 20 64 65 6c 69 74 65 6d 28 62 75 66 2c 20 ┆m); } private int delitem(buf, ┆ 0x04f200…09e600 6e 29 0a 2f 2a 20 64 65 6c 65 74 65 20 61 6e 20 69 74 65 6d 20 6f 75 74 20 6f 66 20 61 20 64 61 ┆n) /* delete an item out of a da┆ 0x04f200…09e600 74 61 62 61 73 65 20 70 61 67 65 20 2a 2f 0a 63 68 61 72 20 20 20 20 62 75 66 5b 50 42 4c 4b 53 ┆tabase page */ char buf[PBLKS┆ 0x04f200…09e600 49 5a 5d 3b 0a 7b 0a 20 20 20 20 72 65 67 69 73 74 65 72 20 73 68 6f 72 74 20 2a 73 70 3b 0a 20 ┆IZ]; { register short *sp; ┆ 0x04f200…09e600 20 20 20 72 65 67 69 73 74 65 72 20 75 6e 73 69 67 6e 65 64 20 20 20 20 69 31 2c 20 69 32 2c 20 ┆ register unsigned i1, i2, ┆ 0x04f200…09e600 69 33 3b 0a 0a 23 69 66 6e 64 65 66 20 6c 69 6e 74 0a 20 20 20 20 73 70 20 3d 20 28 73 73 68 6f ┆i3; #ifndef lint sp = (ssho┆ 0x04f200…09e600 72 74 20 2a 29 20 62 75 66 3b 0a 23 65 6c 73 65 0a 20 20 20 20 73 70 20 3d 20 4e 55 4c 4c 3b 0a ┆rt *) buf; #else sp = NULL; ┆ 0x04f200…09e600 23 65 6e 64 69 66 0a 20 20 20 20 69 66 20 28 6e 20 3c 20 30 20 7c 7c 20 6e 20 3e 3d 20 73 70 5b ┆#endif if (n < 0 || n >= sp[┆ 0x04f200…09e600 30 5d 29 0a 09 20 20 20 20 72 65 74 75 72 6e 28 46 41 49 4c 29 3b 0a 20 20 20 20 69 31 20 3d 20 ┆0]) return(FAIL); i1 = ┆ 0x04f200…09e600 73 70 5b 6e 20 2b 20 31 5d 3b 0a 20 20 20 20 69 32 20 3d 20 50 42 4c 4b 53 49 5a 3b 0a 20 20 20 ┆sp[n + 1]; i2 = PBLKSIZ; ┆ 0x04f200…09e600 20 69 66 20 28 6e 20 3e 20 30 29 0a 09 69 32 20 3d 20 73 70 5b 6e 20 2b 20 31 20 2d 20 31 5d 3b ┆ if (n > 0) i2 = sp[n + 1 - 1];┆ 0x04f200…09e600 0a 20 20 20 20 69 33 20 3d 20 73 70 5b 73 70 5b 30 5d 20 2b 20 31 20 2d 20 31 5d 3b 0a 20 20 20 ┆ i3 = sp[sp[0] + 1 - 1]; ┆ 0x04f200…09e600 20 69 66 20 28 69 32 20 3e 20 69 31 29 0a 09 77 68 69 6c 65 20 28 69 31 20 3e 20 69 33 29 0a 09 ┆ if (i2 > i1) while (i1 > i3) ┆ 0x04f200…09e600 7b 0a 09 20 20 20 20 69 31 2d 2d 3b 20 69 32 2d 2d 3b 0a 09 20 20 20 20 62 75 66 5b 69 32 5d 20 ┆{ i1--; i2--; buf[i2] ┆ 0x04f200…09e600 3d 20 62 75 66 5b 69 31 5d 3b 0a 09 20 20 20 20 62 75 66 5b 69 31 5d 20 3d 20 30 3b 0a 09 7d 0a ┆= buf[i1]; buf[i1] = 0; } ┆ 0x04f200…09e600 20 20 20 20 69 32 20 2d 3d 20 69 31 3b 0a 20 20 20 20 66 6f 72 20 28 69 31 20 3d 20 6e 20 2b 20 ┆ i2 -= i1; for (i1 = n + ┆ 0x04f200…09e600 31 3b 20 69 31 20 3c 20 73 70 5b 30 5d 3b 20 69 31 2b 2b 29 0a 09 20 20 20 20 73 70 5b 69 31 20 ┆1; i1 < sp[0]; i1++) sp[i1 ┆ 0x04f200…09e600 2b 20 31 20 2d 20 31 5d 20 3d 20 73 70 5b 69 31 20 2b 20 31 5d 20 2b 20 69 32 3b 0a 20 20 20 20 ┆+ 1 - 1] = sp[i1 + 1] + i2; ┆ 0x04f200…09e600 73 70 5b 30 5d 2d 2d 3b 0a 20 20 20 20 73 70 5b 73 70 5b 30 5d 20 2b 20 31 5d 20 3d 20 30 3b 0a ┆sp[0]--; sp[sp[0] + 1] = 0; ┆ 0x04f200…09e600 20 20 20 20 72 65 74 75 72 6e 28 53 55 43 43 45 45 44 29 3b 0a 7d 0a 0a 70 72 69 76 61 74 65 20 ┆ return(SUCCEED); } private ┆ 0x04f200…09e600 69 6e 74 20 61 64 64 69 74 65 6d 28 62 75 66 2c 20 69 74 65 6d 29 0a 63 68 61 72 09 62 75 66 5b ┆int additem(buf, item) char buf[┆ 0x04f200…09e600 50 42 4c 4b 53 49 5a 5d 3b 0a 64 61 74 75 6d 09 69 74 65 6d 3b 0a 7b 0a 20 20 20 20 72 65 67 69 ┆PBLKSIZ]; datum item; { regi┆ 0x04f200…09e600 73 74 65 72 20 73 68 6f 72 74 20 2a 73 70 3b 0a 20 20 20 20 72 65 67 69 73 74 65 72 20 63 68 61 ┆ster short *sp; register cha┆ 0x04f200…09e600 72 20 2a 70 3b 0a 20 20 20 20 72 65 67 69 73 74 65 72 20 75 6e 73 69 67 6e 65 64 20 69 31 2c 20 ┆r *p; register unsigned i1, ┆ 0x04f200…09e600 69 32 3b 0a 0a 23 69 66 6e 64 65 66 20 6c 69 6e 74 0a 20 20 20 20 73 70 20 3d 20 28 73 73 68 6f ┆i2; #ifndef lint sp = (ssho┆ 0x04f200…09e600 72 74 20 2a 29 20 62 75 66 3b 0a 23 65 6c 73 65 0a 20 20 20 20 73 70 20 3d 20 4e 55 4c 4c 3b 0a ┆rt *) buf; #else sp = NULL; ┆ 0x04f200…09e600 23 65 6e 64 69 66 0a 20 20 20 20 69 31 20 3d 20 50 42 4c 4b 53 49 5a 3b 0a 20 20 20 20 69 66 20 ┆#endif i1 = PBLKSIZ; if ┆ 0x04f200…09e600 28 73 70 5b 30 5d 20 3e 20 30 29 0a 09 69 31 20 3d 20 73 70 5b 73 70 5b 30 5d 20 2b 20 31 20 2d ┆(sp[0] > 0) i1 = sp[sp[0] + 1 -┆ 0x04f200…09e600 20 31 5d 3b 0a 20 20 20 20 69 31 20 2d 3d 20 69 74 65 6d 2e 64 73 69 7a 65 20 2b 20 32 20 2a 20 ┆ 1]; i1 -= item.dsize + 2 * ┆ 0x04f200…09e600 73 69 7a 65 6f 66 28 73 6c 6f 6e 67 29 3b 0a 20 20 20 20 69 32 20 3d 20 28 73 70 5b 30 5d 20 2b ┆sizeof(slong); i2 = (sp[0] +┆ 0x04f200…09e600 20 32 29 20 2a 20 73 69 7a 65 6f 66 28 73 73 68 6f 72 74 29 3b 0a 20 20 20 20 69 66 20 28 69 31 ┆ 2) * sizeof(sshort); if (i1┆ 0x04f200…09e600 20 3c 3d 20 69 32 29 0a 09 72 65 74 75 72 6e 28 46 41 49 4c 29 3b 0a 20 20 20 20 73 70 5b 73 70 ┆ <= i2) return(FAIL); sp[sp┆ 0x04f200…09e600 5b 30 5d 20 2b 20 31 5d 20 3d 20 69 31 3b 0a 20 20 20 20 70 20 3d 20 26 62 75 66 5b 69 31 5d 3b ┆[0] + 1] = i1; p = &buf[i1];┆ 0x04f200…09e600 0a 20 20 20 20 28 76 6f 69 64 29 20 6d 65 6d 63 70 79 28 70 2c 20 28 63 68 61 72 20 2a 29 26 69 ┆ (void) memcpy(p, (char *)&i┆ 0x04f200…09e600 74 65 6d 2e 64 61 64 64 72 65 73 73 2c 20 73 69 7a 65 6f 66 28 73 6c 6f 6e 67 29 29 3b 0a 20 20 ┆tem.daddress, sizeof(slong)); ┆ 0x04f200…09e600 20 20 70 20 2b 3d 20 73 69 7a 65 6f 66 28 73 6c 6f 6e 67 29 3b 0a 20 20 20 20 28 76 6f 69 64 29 ┆ p += sizeof(slong); (void)┆ 0x04f200…09e600 20 6d 65 6d 63 70 79 28 70 2c 20 28 63 68 61 72 20 2a 29 26 69 74 65 6d 2e 64 6c 65 6e 67 74 68 ┆ memcpy(p, (char *)&item.dlength┆ 0x04f200…09e600 2c 20 73 69 7a 65 6f 66 28 73 6c 6f 6e 67 29 29 3b 0a 20 20 20 20 70 20 2b 3d 20 73 69 7a 65 6f ┆, sizeof(slong)); p += sizeo┆ 0x04f200…09e600 66 28 73 6c 6f 6e 67 29 3b 0a 20 20 20 20 66 6f 72 20 28 69 32 20 3d 20 30 3b 20 69 32 20 3c 20 ┆f(slong); for (i2 = 0; i2 < ┆ 0x04f200…09e600 69 74 65 6d 2e 64 73 69 7a 65 3b 20 69 32 2b 2b 29 0a 09 2a 70 2b 2b 20 3d 20 69 74 65 6d 2e 64 ┆item.dsize; i2++) *p++ = item.d┆ 0x04f200…09e600 70 74 72 5b 69 32 5d 3b 0a 20 20 20 20 73 70 5b 30 5d 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e ┆ptr[i2]; sp[0]++; return┆ 0x04f200…09e600 28 73 70 5b 30 5d 20 2d 20 31 29 3b 0a 7d 0a 0a 70 72 69 76 61 74 65 20 69 6e 74 20 63 68 6b 62 ┆(sp[0] - 1); } private int chkb┆ 0x04f200…09e600 6c 6b 28 62 75 66 29 0a 2f 2a 20 63 68 65 63 6b 20 2e 70 61 67 20 62 6c 6f 63 6b 20 66 6f 72 20 ┆lk(buf) /* check .pag block for ┆ 0x04f200…09e600 76 61 6c 69 64 69 74 79 20 2a 2f 0a 63 68 61 72 20 20 20 20 62 75 66 5b 50 42 4c 4b 53 49 5a 5d ┆validity */ char buf[PBLKSIZ]┆ 0x04f200…09e600 3b 0a 7b 0a 20 20 20 20 72 65 67 69 73 74 65 72 20 73 68 6f 72 74 20 2a 73 70 3b 0a 20 20 20 20 ┆; { register short *sp; ┆ 0x04f200…09e600 72 65 67 69 73 74 65 72 20 69 6e 74 20 74 2c 20 69 3b 0a 0a 23 69 66 6e 64 65 66 20 6c 69 6e 74 ┆register int t, i; #ifndef lint┆ 0x04f200…09e600 0a 20 20 20 20 73 70 20 3d 20 28 73 73 68 6f 72 74 20 2a 29 20 62 75 66 3b 0a 23 65 6c 73 65 0a ┆ sp = (sshort *) buf; #else ┆ 0x04f200…09e600 20 20 20 20 73 70 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 74 20 3d 20 50 42 ┆ sp = NULL; #endif t = PB┆ 0x04f200…09e600 4c 4b 53 49 5a 3b 0a 20 20 20 20 66 6f 72 20 28 69 20 3d 20 30 3b 20 69 20 3c 20 73 70 5b 30 5d ┆LKSIZ; for (i = 0; i < sp[0]┆ 0x04f200…09e600 3b 20 69 2b 2b 29 0a 20 20 20 20 7b 0a 09 69 66 20 28 73 70 5b 69 20 2b 20 31 5d 20 3e 20 74 29 ┆; i++) { if (sp[i + 1] > t)┆ 0x04f200…09e600 0a 09 20 20 20 20 67 6f 74 6f 20 62 61 64 3b 0a 09 74 20 3d 20 73 70 5b 69 20 2b 20 31 5d 3b 0a ┆ goto bad; t = sp[i + 1]; ┆ 0x04f200…09e600 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 74 20 3e 3d 20 28 73 70 5b 30 5d 20 2b 20 31 29 20 2a ┆ } if (t >= (sp[0] + 1) *┆ 0x04f200…09e600 20 73 69 7a 65 6f 66 28 73 73 68 6f 72 74 29 29 0a 09 72 65 74 75 72 6e 28 53 55 43 43 45 45 44 ┆ sizeof(sshort)) return(SUCCEED┆ 0x04f200…09e600 29 3b 0a 62 61 64 3a 0a 20 20 20 20 28 76 6f 69 64 29 20 62 7a 65 72 6f 28 62 75 66 2c 20 50 42 ┆); bad: (void) bzero(buf, PB┆ 0x04f200…09e600 4c 4b 53 49 5a 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 28 46 41 49 4c 29 3b 0a 7d 0a 0a 2f 2a 0a ┆LKSIZ); return(FAIL); } /* ┆ 0x04f200…09e600 20 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 66 75 6e 63 74 69 6f 6e 73 20 65 ┆ * The following two functions e┆ 0x04f200…09e600 6e 63 61 70 73 75 6c 61 74 65 20 61 6c 6c 20 49 2f 4f 20 68 61 6e 64 6c 69 6e 67 20 6f 66 20 74 ┆ncapsulate all I/O handling of t┆ 0x04f200…09e600 68 65 20 2e 70 61 67 20 66 69 6c 65 2e 0a 20 2a 20 54 68 65 79 20 69 6d 70 6c 65 6d 65 6e 74 20 ┆he .pag file. * They implement ┆ 0x04f200…09e600 72 65 61 64 20 61 6e 64 20 77 72 69 74 65 20 6f 66 20 70 61 67 65 20 73 65 63 74 69 6f 6e 73 2e ┆read and write of page sections.┆ 0x04f200…09e600 0a 20 2a 2f 0a 23 64 65 66 69 6e 65 20 73 65 65 6b 5f 70 61 67 65 28 64 62 2c 20 6e 29 20 28 76 ┆ */ #define seek_page(db, n) (v┆ 0x04f200…09e600 6f 69 64 29 20 6c 73 65 65 6b 28 28 64 62 29 2d 3e 70 61 67 66 2c 28 6f 66 66 5f 74 29 28 28 6e ┆oid) lseek((db)->pagf,(off_t)((n┆ 0x04f200…09e600 29 2a 50 42 4c 4b 53 49 5a 29 2c 53 45 45 4b 5f 53 45 54 29 0a 23 64 65 66 69 6e 65 20 72 65 61 ┆)*PBLKSIZ),SEEK_SET) #define rea┆ 0x04f200…09e600 64 5f 70 61 67 65 28 64 62 2c 20 62 29 20 28 76 6f 69 64 29 20 72 65 61 64 28 64 62 2d 3e 70 61 ┆d_page(db, b) (void) read(db->pa┆ 0x04f200…09e600 67 66 2c 20 28 62 29 2c 20 28 69 6f 6c 65 6e 5f 74 29 20 50 42 4c 4b 53 49 5a 29 0a 23 64 65 66 ┆gf, (b), (iolen_t) PBLKSIZ) #def┆ 0x04f200…09e600 69 6e 65 20 77 72 69 74 65 5f 70 61 67 65 28 64 62 2c 62 29 20 28 76 6f 69 64 29 20 77 72 69 74 ┆ine write_page(db,b) (void) writ┆ 0x04f200…09e600 65 28 64 62 2d 3e 70 61 67 66 2c 20 28 62 29 2c 20 28 69 6f 6c 65 6e 5f 74 29 50 42 4c 4b 53 49 ┆e(db->pagf, (b), (iolen_t)PBLKSI┆ 0x04f200…09e600 5a 29 0a 23 64 65 66 69 6e 65 20 6c 6f 63 6b 5f 70 61 67 65 28 64 62 29 20 20 20 20 28 76 6f 69 ┆Z) #define lock_page(db) (voi┆ 0x04f200…09e600 64 29 20 6c 6f 63 6b 66 28 28 64 62 29 2d 3e 70 61 67 66 2c 20 46 5f 4c 4f 43 4b 2c 20 28 6c 6f ┆d) lockf((db)->pagf, F_LOCK, (lo┆ 0x04f200…09e600 6e 67 29 50 42 4c 4b 53 49 5a 29 0a 23 64 65 66 69 6e 65 20 75 6e 6c 6f 63 6b 5f 70 61 67 65 28 ┆ng)PBLKSIZ) #define unlock_page(┆ 0x04f200…09e600 64 62 29 20 20 28 76 6f 69 64 29 20 6c 6f 63 6b 66 28 28 64 62 29 2d 3e 70 61 67 66 2c 20 46 5f ┆db) (void) lockf((db)->pagf, F_┆ 0x04f200…09e600 55 4c 4f 43 4b 2c 20 28 6c 6f 6e 67 29 50 42 4c 4b 53 49 5a 29 0a 0a 2f 2a 41 52 47 53 55 53 45 ┆ULOCK, (long)PBLKSIZ) /*ARGSUSE┆ 0x04f200…09e600 44 32 2a 2f 0a 70 72 69 76 61 74 65 20 69 6e 74 20 67 65 74 5f 70 61 67 65 28 68 61 73 68 2c 20 ┆D2*/ private int get_page(hash, ┆ 0x04f200…09e600 64 62 2c 20 77 6c 6f 63 6b 29 0a 2f 2a 20 66 65 74 63 68 20 74 68 65 20 66 69 72 73 74 20 64 61 ┆db, wlock) /* fetch the first da┆ 0x04f200…09e600 74 61 62 61 73 65 20 66 69 6c 65 20 62 75 63 6b 65 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 ┆tabase file bucket corresponding┆ 0x04f200…09e600 20 74 6f 20 61 20 67 69 76 65 6e 20 68 61 73 68 20 76 61 6c 75 65 20 2a 2f 0a 72 65 67 69 73 74 ┆ to a given hash value */ regist┆ 0x04f200…09e600 65 72 20 64 61 74 61 62 61 73 65 20 2a 64 62 3b 0a 6c 6f 6e 67 20 20 20 20 68 61 73 68 3b 0a 69 ┆er database *db; long hash; i┆ 0x04f200…09e600 6e 74 09 77 6c 6f 63 6b 3b 0a 7b 0a 20 20 20 20 66 6f 72 20 28 64 62 2d 3e 68 6d 61 73 6b 20 3d ┆nt wlock; { for (db->hmask =┆ 0x04f200…09e600 20 30 3b 3b 20 64 62 2d 3e 68 6d 61 73 6b 20 3d 20 28 64 62 2d 3e 68 6d 61 73 6b 20 3c 3c 20 31 ┆ 0;; db->hmask = (db->hmask << 1┆ 0x04f200…09e600 29 20 2b 20 31 29 0a 20 20 20 20 7b 0a 09 64 62 2d 3e 62 6c 6b 6e 6f 20 3d 20 68 61 73 68 20 26 ┆) + 1) { db->blkno = hash &┆ 0x04f200…09e600 20 64 62 2d 3e 68 6d 61 73 6b 3b 0a 09 64 62 2d 3e 62 69 74 6e 6f 20 3d 20 64 62 2d 3e 62 6c 6b ┆ db->hmask; db->bitno = db->blk┆ 0x04f200…09e600 6e 6f 20 2b 20 64 62 2d 3e 68 6d 61 73 6b 3b 0a 09 69 66 20 28 62 69 74 67 65 74 28 64 62 2c 20 ┆no + db->hmask; if (bitget(db, ┆ 0x04f200…09e600 46 41 4c 53 45 29 20 3d 3d 20 30 29 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 ┆FALSE) == 0) break; } #┆ 0x04f200…09e600 69 66 6e 64 65 66 20 4c 4f 43 4b 46 09 09 2f 2a 20 63 61 6e 27 74 20 62 75 66 66 65 72 20 62 6c ┆ifndef LOCKF /* can't buffer bl┆ 0x04f200…09e600 6f 63 6b 73 20 69 66 20 6d 75 6c 74 69 2d 75 73 65 72 20 2a 2f 0a 20 20 20 20 69 66 20 28 64 62 ┆ocks if multi-user */ if (db┆ 0x04f200…09e600 2d 3e 62 6c 6b 6e 6f 20 21 3d 20 64 62 2d 3e 6f 6c 64 70 61 67 62 29 0a 20 20 20 20 7b 0a 23 65 ┆->blkno != db->oldpagb) { #e┆ 0x04f200…09e600 6e 64 69 66 20 2f 2a 20 4c 4f 43 4b 46 20 2a 2f 0a 09 28 76 6f 69 64 29 20 62 7a 65 72 6f 28 64 ┆ndif /* LOCKF */ (void) bzero(d┆ 0x04f200…09e600 62 2d 3e 70 61 67 62 75 66 2c 20 50 42 4c 4b 53 49 5a 29 3b 0a 09 28 76 6f 69 64 29 20 73 65 74 ┆b->pagbuf, PBLKSIZ); (void) set┆ 0x04f200…09e600 75 70 5f 64 62 28 64 62 29 3b 0a 23 69 66 64 65 66 20 4d 41 49 4e 0a 09 28 76 6f 69 64 29 20 70 ┆up_db(db); #ifdef MAIN (void) p┆ 0x04f200…09e600 72 69 6e 74 66 28 22 65 64 62 6d 3a 20 73 65 65 6b 69 6e 67 20 74 6f 20 2e 70 61 67 20 62 6c 6f ┆rintf("edbm: seeking to .pag blo┆ 0x04f200…09e600 63 6b 20 25 6c 64 5c 6e 22 2c 20 64 62 2d 3e 62 6c 6b 6e 6f 29 3b 0a 23 65 6e 64 69 66 20 2f 2a ┆ck %ld\n", db->blkno); #endif /*┆ 0x04f200…09e600 20 4d 41 49 4e 20 2a 2f 0a 09 73 65 65 6b 5f 70 61 67 65 28 64 62 2c 20 64 62 2d 3e 62 6c 6b 6e ┆ MAIN */ seek_page(db, db->blkn┆ 0x04f200…09e600 6f 29 3b 0a 23 69 66 64 65 66 20 4c 4f 43 4b 46 0a 09 69 66 20 28 77 6c 6f 63 6b 29 0a 09 7b 0a ┆o); #ifdef LOCKF if (wlock) { ┆ 0x04f200…09e600 23 69 66 64 65 66 20 4d 41 49 4e 0a 09 20 20 20 20 28 76 6f 69 64 29 20 70 72 69 6e 74 66 28 22 ┆#ifdef MAIN (void) printf("┆ 0x04f200…09e600 65 64 62 6d 3a 20 6c 6f 63 6b 69 6e 67 20 2e 70 61 67 20 62 6c 6f 63 6b 20 25 6c 64 5c 6e 22 2c ┆edbm: locking .pag block %ld\n",┆ 0x04f200…09e600 20 64 62 2d 3e 62 6c 6b 6e 6f 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 4d 41 49 4e 20 2a 2f 0a 09 ┆ db->blkno); #endif /* MAIN */ ┆ 0x04f200…09e600 20 20 20 20 6c 6f 63 6b 5f 70 61 67 65 28 64 62 29 3b 0a 09 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 ┆ lock_page(db); } #endif /* ┆ 0x04f200…09e600 4c 4f 43 4b 46 20 2a 2f 0a 23 69 66 64 65 66 20 4d 41 49 4e 0a 09 28 76 6f 69 64 29 20 70 72 69 ┆LOCKF */ #ifdef MAIN (void) pri┆ 0x04f200…09e600 6e 74 66 28 22 65 64 62 6d 3a 20 72 65 61 64 69 6e 67 20 2e 70 61 67 20 62 6c 6f 63 6b 20 25 6c ┆ntf("edbm: reading .pag block %l┆ 0x04f200…09e600 64 2e 2e 2e 22 2c 20 64 62 2d 3e 62 6c 6b 6e 6f 29 3b 0a 09 28 76 6f 69 64 29 20 66 66 6c 75 73 ┆d...", db->blkno); (void) fflus┆ 0x04f200…09e600 68 28 73 74 64 6f 75 74 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 4d 41 49 4e 20 2a 2f 0a 09 72 65 ┆h(stdout); #endif /* MAIN */ re┆ 0x04f200…09e600 61 64 5f 70 61 67 65 28 64 62 2c 20 64 62 2d 3e 70 61 67 62 75 66 29 3b 0a 23 69 66 64 65 66 20 ┆ad_page(db, db->pagbuf); #ifdef ┆ 0x04f200…09e600 4d 41 49 4e 0a 09 28 76 6f 69 64 29 20 70 72 69 6e 74 66 28 22 67 6f 74 20 69 74 5c 6e 22 29 3b ┆MAIN (void) printf("got it\n");┆ 0x04f200…09e600 0a 23 65 6e 64 69 66 20 2f 2a 20 4d 41 49 4e 20 2a 2f 0a 23 69 66 64 65 66 20 53 48 41 52 45 44 ┆ #endif /* MAIN */ #ifdef SHARED┆ 0x04f200…09e600 0a 09 66 72 6f 6d 73 68 61 72 65 64 28 64 62 2d 3e 70 61 67 62 75 66 29 3b 0a 23 65 6e 64 69 66 ┆ fromshared(db->pagbuf); #endif┆ 0x04f200…09e600 20 2f 2a 20 53 48 41 52 45 44 20 2a 2f 0a 09 28 76 6f 69 64 29 20 63 68 6b 62 6c 6b 28 64 62 2d ┆ /* SHARED */ (void) chkblk(db-┆ 0x04f200…09e600 3e 70 61 67 62 75 66 29 3b 0a 23 69 66 6e 64 65 66 20 4c 4f 43 4b 46 0a 09 64 62 2d 3e 6f 6c 64 ┆>pagbuf); #ifndef LOCKF db->old┆ 0x04f200…09e600 70 61 67 62 20 3d 20 64 62 2d 3e 62 6c 6b 6e 6f 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f ┆pagb = db->blkno; } #endif /┆ 0x04f200…09e600 2a 20 4c 4f 43 4b 46 20 2a 2f 0a 7d 0a 0a 76 6f 69 64 20 70 75 74 5f 70 61 67 65 28 64 62 2c 20 ┆* LOCKF */ } void put_page(db, ┆ 0x04f200…09e600 62 6c 6b 6e 6f 2c 20 62 75 66 29 0a 2f 2a 20 77 72 69 74 65 20 61 6e 20 75 70 64 61 74 65 64 20 ┆blkno, buf) /* write an updated ┆ 0x04f200…09e600 62 6c 6f 63 6b 20 74 6f 20 74 68 65 20 2e 70 61 67 20 66 69 6c 65 20 2a 2f 0a 72 65 67 69 73 74 ┆block to the .pag file */ regist┆ 0x04f200…09e600 65 72 20 64 61 74 61 62 61 73 65 20 2a 64 62 3b 0a 6c 6f 6e 67 20 62 6c 6b 6e 6f 3b 0a 63 68 61 ┆er database *db; long blkno; cha┆ 0x04f200…09e600 72 20 2a 62 75 66 3b 0a 7b 0a 23 69 66 64 65 66 20 4d 41 49 4e 0a 20 20 20 20 28 76 6f 69 64 29 ┆r *buf; { #ifdef MAIN (void)┆ 0x04f200…09e600 20 70 72 69 6e 74 66 28 22 65 64 62 6d 3a 20 73 65 65 6b 69 6e 67 20 74 6f 20 2e 70 61 67 20 62 ┆ printf("edbm: seeking to .pag b┆ 0x04f200…09e600 6c 6f 63 6b 20 25 6c 64 5c 6e 22 2c 20 62 6c 6b 6e 6f 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 4d ┆lock %ld\n", blkno); #endif /* M┆ 0x04f200…09e600 41 49 4e 20 2a 2f 0a 20 20 20 20 73 65 65 6b 5f 70 61 67 65 28 64 62 2c 20 62 6c 6b 6e 6f 29 3b ┆AIN */ seek_page(db, blkno);┆ 0x04f200…09e600 0a 23 69 66 64 65 66 20 4d 41 49 4e 0a 20 20 20 20 28 76 6f 69 64 29 20 70 72 69 6e 74 66 28 22 ┆ #ifdef MAIN (void) printf("┆ 0x04f200…09e600 65 64 62 6d 3a 20 77 72 69 74 69 6e 67 20 2e 70 61 67 20 62 6c 6f 63 6b 20 25 6c 64 2e 2e 2e 22 ┆edbm: writing .pag block %ld..."┆ 0x04f200…09e600 2c 20 62 6c 6b 6e 6f 29 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 66 66 6c 75 73 68 28 73 74 64 6f ┆, blkno); (void) fflush(stdo┆ 0x04f200…09e600 75 74 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 4d 41 49 4e 20 2a 2f 0a 23 69 66 64 65 66 20 53 48 ┆ut); #endif /* MAIN */ #ifdef SH┆ 0x04f200…09e600 41 52 45 44 0a 20 20 20 20 74 6f 73 68 61 72 65 64 28 62 75 66 29 3b 0a 23 65 6e 64 69 66 20 2f ┆ARED toshared(buf); #endif /┆ 0x04f200…09e600 2a 20 53 48 41 52 45 44 20 2a 2f 0a 20 20 20 20 77 72 69 74 65 5f 70 61 67 65 28 64 62 2c 20 62 ┆* SHARED */ write_page(db, b┆ 0x04f200…09e600 75 66 29 3b 0a 23 69 66 64 65 66 20 4d 41 49 4e 0a 09 28 76 6f 69 64 29 20 70 72 69 6e 74 66 28 ┆uf); #ifdef MAIN (void) printf(┆ 0x04f200…09e600 22 64 69 64 20 69 74 5c 6e 22 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 4d 41 49 4e 20 2a 2f 0a 23 ┆"did it\n"); #endif /* MAIN */ #┆ 0x04f200…09e600 69 66 64 65 66 20 4c 4f 43 4b 46 0a 23 69 66 64 65 66 20 4d 41 49 4e 0a 20 20 20 20 28 76 6f 69 ┆ifdef LOCKF #ifdef MAIN (voi┆ 0x04f200…09e600 64 29 20 70 72 69 6e 74 66 28 22 65 64 62 6d 3a 20 73 65 65 6b 69 6e 67 20 74 6f 20 2e 70 61 67 ┆d) printf("edbm: seeking to .pag┆ 0x04f200…09e600 20 62 6c 6f 63 6b 20 25 6c 64 5c 6e 22 2c 20 62 6c 6b 6e 6f 29 3b 0a 23 65 6e 64 69 66 20 2f 2a ┆ block %ld\n", blkno); #endif /*┆ 0x04f200…09e600 20 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 73 65 65 6b 5f 70 61 67 65 28 64 62 2c 20 62 6c 6b 6e 6f ┆ MAIN */ seek_page(db, blkno┆ 0x04f200…09e600 29 3b 0a 23 69 66 64 65 66 20 4d 41 49 4e 0a 20 20 20 20 28 76 6f 69 64 29 20 70 72 69 6e 74 66 ┆); #ifdef MAIN (void) printf┆ 0x04f200…09e600 28 22 65 64 62 6d 3a 20 75 6e 6c 6f 63 6b 69 6e 67 20 2e 70 61 67 20 62 6c 6f 63 6b 20 25 6c 64 ┆("edbm: unlocking .pag block %ld┆ 0x04f200…09e600 5c 6e 22 2c 20 62 6c 6b 6e 6f 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 4d 41 49 4e 20 2a 2f 0a 20 ┆\n", blkno); #endif /* MAIN */ ┆ 0x04f200…09e600 20 20 20 75 6e 6c 6f 63 6b 5f 70 61 67 65 28 64 62 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 4c 4f ┆ unlock_page(db); #endif /* LO┆ 0x04f200…09e600 43 4b 46 20 2a 2f 0a 7d 0a 0a 23 69 66 64 65 66 20 4c 4f 43 4b 46 0a 76 6f 69 64 20 64 62 6d 75 ┆CKF */ } #ifdef LOCKF void dbmu┆ 0x04f200…09e600 6e 6c 6f 63 6b 28 64 62 29 0a 2f 2a 20 69 66 20 79 6f 75 20 6a 75 73 74 20 6e 65 65 64 20 74 6f ┆nlock(db) /* if you just need to┆ 0x04f200…09e600 20 72 65 6c 65 61 73 65 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20 6c 6f 63 6b 65 64 20 65 6e ┆ release the currently locked en┆ 0x04f200…09e600 74 72 79 20 77 69 74 68 6f 75 74 20 77 72 69 74 69 6e 67 20 69 74 20 2a 2f 0a 72 65 67 69 73 74 ┆try without writing it */ regist┆ 0x04f200…09e600 65 72 20 64 61 74 61 62 61 73 65 20 2a 64 62 3b 0a 7b 0a 23 69 66 64 65 66 20 4d 41 49 4e 0a 20 ┆er database *db; { #ifdef MAIN ┆ 0x04f200…09e600 20 20 20 28 76 6f 69 64 29 20 70 72 69 6e 74 66 28 22 65 64 62 6d 3a 20 73 65 65 6b 69 6e 67 20 ┆ (void) printf("edbm: seeking ┆ 0x04f200…09e600 74 6f 20 2e 64 69 72 20 62 6c 6f 63 6b 20 25 6c 64 5c 6e 22 2c 20 64 62 2d 3e 62 69 74 6e 6f 20 ┆to .dir block %ld\n", db->bitno ┆ 0x04f200…09e600 2f 20 42 59 54 45 53 49 5a 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 4d 41 49 4e 20 2a 2f 0a 20 20 ┆/ BYTESIZ); #endif /* MAIN */ ┆ 0x04f200…09e600 20 20 28 76 6f 69 64 29 20 6c 73 65 65 6b 28 28 64 62 29 2d 3e 64 69 72 66 2c 20 28 6f 66 66 5f ┆ (void) lseek((db)->dirf, (off_┆ 0x04f200…09e600 74 29 28 64 62 2d 3e 62 69 74 6e 6f 20 2f 20 42 59 54 45 53 49 5a 29 2c 20 53 45 45 4b 5f 53 45 ┆t)(db->bitno / BYTESIZ), SEEK_SE┆ 0x04f200…09e600 54 29 3b 0a 23 69 66 64 65 66 20 4d 41 49 4e 0a 20 20 20 20 28 76 6f 69 64 29 20 70 72 69 6e 74 ┆T); #ifdef MAIN (void) print┆ 0x04f200…09e600 66 28 22 65 64 62 6d 3a 20 75 6e 6c 6f 63 6b 69 6e 67 20 2e 64 69 72 20 62 6c 6f 63 6b 20 25 6c ┆f("edbm: unlocking .dir block %l┆ 0x04f200…09e600 64 5c 6e 22 2c 20 64 62 2d 3e 62 6c 6b 6e 6f 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 4d 41 49 4e ┆d\n", db->blkno); #endif /* MAIN┆ 0x04f200…09e600 20 2a 2f 0a 20 20 20 20 75 6e 6c 6f 63 6b 5f 64 69 72 62 28 64 62 29 3b 0a 23 69 66 64 65 66 20 ┆ */ unlock_dirb(db); #ifdef ┆ 0x04f200…09e600 4d 41 49 4e 0a 20 20 20 20 28 76 6f 69 64 29 20 70 72 69 6e 74 66 28 22 65 64 62 6d 3a 20 73 65 ┆MAIN (void) printf("edbm: se┆ 0x04f200…09e600 65 6b 69 6e 67 20 74 6f 20 2e 70 61 67 20 62 6c 6f 63 6b 20 25 6c 64 5c 6e 22 2c 20 64 62 2d 3e ┆eking to .pag block %ld\n", db->┆ 0x04f200…09e600 62 6c 6b 6e 6f 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 73 65 ┆blkno); #endif /* MAIN */ se┆ 0x04f200…09e600 65 6b 5f 70 61 67 65 28 64 62 2c 20 64 62 2d 3e 62 6c 6b 6e 6f 29 3b 0a 23 69 66 64 65 66 20 4d ┆ek_page(db, db->blkno); #ifdef M┆ 0x04f200…09e600 41 49 4e 0a 20 20 20 20 28 76 6f 69 64 29 20 70 72 69 6e 74 66 28 22 65 64 62 6d 3a 20 75 6e 6c ┆AIN (void) printf("edbm: unl┆ 0x04f200…09e600 6f 63 6b 69 6e 67 20 2e 70 61 67 20 62 6c 6f 63 6b 20 25 6c 64 5c 6e 22 2c 20 64 62 2d 3e 62 6c ┆ocking .pag block %ld\n", db->bl┆ 0x04f200…09e600 6b 6e 6f 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 75 6e 6c 6f ┆kno); #endif /* MAIN */ unlo┆ 0x04f200…09e600 63 6b 5f 70 61 67 65 28 64 62 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4c 4f 43 4b 46 20 2a ┆ck_page(db); } #endif /* LOCKF *┆ 0x04f200…09e600 2f 0a 0a 2f 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6f 6e 6c 79 20 64 65 70 65 6e 64 73 ┆/ /* this function only depends┆ 0x04f200…09e600 20 6f 6e 20 6b 6e 6f 77 69 6e 67 20 61 62 6f 75 74 20 74 68 65 20 64 61 74 75 6d 20 73 74 72 75 ┆ on knowing about the datum stru┆ 0x04f200…09e600 63 74 75 72 65 20 2a 2f 0a 0a 70 72 69 76 61 74 65 20 69 6e 74 20 63 6d 70 64 61 74 75 6d 28 6b ┆cture */ private int cmpdatum(k┆ 0x04f200…09e600 65 79 2c 20 6b 65 79 6c 65 6e 2c 20 64 32 29 0a 2f 2a 20 63 6f 6d 70 61 72 65 20 74 77 6f 20 64 ┆ey, keylen, d2) /* compare two d┆ 0x04f200…09e600 61 74 75 6d 73 20 62 79 20 6b 65 79 20 2d 2d 20 61 6e 61 6c 6f 67 6f 75 73 20 74 6f 20 6d 65 6d ┆atums by key -- analogous to mem┆ 0x04f200…09e600 63 6d 70 28 29 20 2a 2f 0a 63 68 61 72 09 20 20 20 20 2a 6b 65 79 3b 0a 75 6e 73 69 67 6e 65 64 ┆cmp() */ char *key; unsigned┆ 0x04f200…09e600 20 20 20 20 6b 65 79 6c 65 6e 3b 0a 64 61 74 75 6d 09 20 20 20 20 64 32 3b 0a 7b 0a 20 20 20 20 ┆ keylen; datum d2; { ┆ 0x04f200…09e600 72 65 67 69 73 74 65 72 20 63 68 61 72 20 20 2a 70 31 2c 20 2a 70 32 3b 0a 20 20 20 20 72 65 67 ┆register char *p1, *p2; reg┆ 0x04f200…09e600 69 73 74 65 72 20 69 6e 74 20 20 20 64 3b 0a 0a 20 20 20 20 69 66 20 28 6b 65 79 6c 65 6e 20 21 ┆ister int d; if (keylen !┆ 0x04f200…09e600 3d 20 64 32 2e 64 73 69 7a 65 29 0a 09 72 65 74 75 72 6e 28 6b 65 79 6c 65 6e 20 2d 20 64 32 2e ┆= d2.dsize) return(keylen - d2.┆ 0x04f200…09e600 64 73 69 7a 65 29 3b 0a 20 20 20 20 69 66 20 28 6b 65 79 6c 65 6e 20 3d 3d 20 30 29 0a 09 72 65 ┆dsize); if (keylen == 0) re┆ 0x04f200…09e600 74 75 72 6e 28 30 29 3b 0a 20 20 20 20 70 31 20 3d 20 6b 65 79 3b 0a 20 20 20 20 70 32 20 3d 20 ┆turn(0); p1 = key; p2 = ┆ 0x04f200…09e600 64 32 2e 64 70 74 72 3b 0a 20 20 20 20 64 6f 0a 20 20 20 20 7b 0a 09 69 66 20 28 64 20 3d 20 2a ┆d2.dptr; do { if (d = *┆ 0x04f200…09e600 70 32 2b 2b 20 2d 20 2a 70 31 2b 2b 29 0a 09 20 20 20 20 72 65 74 75 72 6e 28 64 29 3b 0a 20 20 ┆p2++ - *p1++) return(d); ┆ 0x04f200…09e600 20 20 7d 20 77 68 69 6c 65 0a 09 28 2d 2d 6b 65 79 6c 65 6e 29 3b 0a 20 20 20 20 72 65 74 75 72 ┆ } while (--keylen); retur┆ 0x04f200…09e600 6e 28 30 29 3b 0a 7d 0a 0a 2f 2a 20 6e 6f 77 20 77 65 20 67 65 74 20 74 6f 20 74 68 65 20 61 63 ┆n(0); } /* now we get to the ac┆ 0x04f200…09e600 74 75 61 6c 20 72 65 61 64 69 6e 67 20 61 6e 64 20 77 72 69 74 69 6e 67 20 66 75 6e 63 74 69 6f ┆tual reading and writing functio┆ 0x04f200…09e600 6e 73 20 2a 2f 0a 0a 69 6e 74 20 64 62 6d 73 65 65 6b 28 6b 65 79 2c 20 6b 65 79 6c 65 6e 2c 20 ┆ns */ int dbmseek(key, keylen, ┆ 0x04f200…09e600 64 62 2c 20 77 6c 6f 63 6b 29 0a 2f 2a 20 66 69 6e 64 20 65 6e 74 72 79 20 77 69 74 68 20 73 70 ┆db, wlock) /* find entry with sp┆ 0x04f200…09e600 65 63 69 66 69 65 64 20 6b 65 79 20 2a 2f 0a 63 68 61 72 09 09 20 20 20 20 2a 6b 65 79 3b 0a 75 ┆ecified key */ char *key; u┆ 0x04f200…09e600 6e 73 69 67 6e 65 64 09 20 20 20 20 6b 65 79 6c 65 6e 3b 0a 72 65 67 69 73 74 65 72 20 64 61 74 ┆nsigned keylen; register dat┆ 0x04f200…09e600 61 62 61 73 65 20 20 20 2a 64 62 3b 0a 62 6f 6f 6c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ┆abase *db; bool ┆ 0x04f200…09e600 20 77 6c 6f 63 6b 3b 0a 7b 0a 20 20 20 20 72 65 67 69 73 74 65 72 20 69 6e 74 20 20 20 20 69 3b ┆ wlock; { register int i;┆ 0x04f200…09e600 0a 20 20 20 20 64 61 74 75 6d 09 20 20 20 20 69 74 65 6d 3b 0a 0a 20 20 20 20 67 65 74 5f 70 61 ┆ datum item; get_pa┆ 0x04f200…09e600 67 65 28 63 61 6c 63 68 61 73 68 28 6b 65 79 2c 20 6b 65 79 6c 65 6e 29 2c 20 64 62 2c 20 77 6c ┆ge(calchash(key, keylen), db, wl┆ 0x04f200…09e600 6f 63 6b 29 3b 0a 20 20 20 20 66 6f 72 20 28 69 20 3d 20 30 3b 20 3b 20 69 2b 2b 29 0a 20 20 20 ┆ock); for (i = 0; ; i++) ┆ 0x04f200…09e600 20 7b 0a 09 69 74 65 6d 20 3d 20 6d 61 6b 64 61 74 75 6d 28 64 62 2d 3e 70 61 67 62 75 66 2c 20 ┆ { item = makdatum(db->pagbuf, ┆ 0x04f200…09e600 69 29 3b 0a 09 69 66 20 28 69 74 65 6d 2e 64 70 74 72 20 3d 3d 20 28 63 68 61 72 20 2a 29 4e 55 ┆i); if (item.dptr == (char *)NU┆ 0x04f200…09e600 4c 4c 29 0a 09 20 20 20 20 72 65 74 75 72 6e 28 46 41 49 4c 29 3b 0a 09 69 66 20 28 63 6d 70 64 ┆LL) return(FAIL); if (cmpd┆ 0x04f200…09e600 61 74 75 6d 28 6b 65 79 2c 20 6b 65 79 6c 65 6e 2c 20 69 74 65 6d 29 20 3d 3d 20 30 29 0a 09 7b ┆atum(key, keylen, item) == 0) {┆ 0x04f200…09e600 0a 09 20 20 20 20 46 52 45 45 28 64 62 29 3b 0a 09 20 20 20 20 64 62 2d 3e 63 75 72 72 65 6e 74 ┆ FREE(db); db->current┆ 0x04f200…09e600 20 3d 20 69 74 65 6d 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 28 53 55 43 43 45 45 44 29 3b 0a 09 ┆ = item; return(SUCCEED); ┆ 0x04f200…09e600 7d 0a 20 20 20 20 7d 0a 7d 0a 0a 69 6e 74 20 64 62 6d 64 65 6c 65 74 65 28 64 62 29 0a 2f 2a 20 ┆} } } int dbmdelete(db) /* ┆ 0x04f200…09e600 64 65 6c 65 74 65 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79 20 2a 2f 0a 72 65 67 ┆deletes the current entry */ reg┆ 0x04f200…09e600 69 73 74 65 72 20 64 61 74 61 62 61 73 65 20 2a 64 62 3b 0a 7b 0a 20 20 20 20 72 65 67 69 73 74 ┆ister database *db; { regist┆ 0x04f200…09e600 65 72 20 69 6e 74 09 69 3b 0a 20 20 20 20 64 61 74 75 6d 09 09 69 74 65 6d 3b 0a 0a 20 20 20 20 ┆er int i; datum item; ┆ 0x04f200…09e600 69 66 20 28 64 62 2d 3e 64 62 72 64 6f 6e 6c 79 29 0a 09 72 65 74 75 72 6e 28 46 41 49 4c 29 3b ┆if (db->dbrdonly) return(FAIL);┆ 0x04f200…09e600 0a 20 20 20 20 67 65 74 5f 70 61 67 65 28 63 61 6c 63 68 61 73 68 28 64 62 2d 3e 63 75 72 72 65 ┆ get_page(calchash(db->curre┆ 0x04f200…09e600 6e 74 2e 64 70 74 72 2c 20 64 62 2d 3e 63 75 72 72 65 6e 74 2e 64 73 69 7a 65 29 2c 20 64 62 2c ┆nt.dptr, db->current.dsize), db,┆ 0x04f200…09e600 20 54 52 55 45 29 3b 0a 20 20 20 20 66 6f 72 20 28 69 20 3d 20 30 3b 20 3b 20 69 20 2b 2b 29 20 ┆ TRUE); for (i = 0; ; i ++) ┆ 0x04f200…09e600 7b 0a 09 69 74 65 6d 20 3d 20 6d 61 6b 64 61 74 75 6d 28 64 62 2d 3e 70 61 67 62 75 66 2c 20 69 ┆{ item = makdatum(db->pagbuf, i┆ 0x04f200…09e600 29 3b 0a 09 69 66 20 28 69 74 65 6d 2e 64 70 74 72 20 3d 3d 20 28 63 68 61 72 20 2a 29 4e 55 4c ┆); if (item.dptr == (char *)NUL┆ 0x04f200…09e600 4c 29 0a 09 7b 0a 23 69 66 64 65 66 20 4c 4f 43 4b 46 0a 09 20 20 20 20 64 62 6d 75 6e 6c 6f 63 ┆L) { #ifdef LOCKF dbmunloc┆ 0x04f200…09e600 6b 28 64 62 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 4c 4f 43 4b 46 20 2a 2f 0a 09 20 20 20 20 72 ┆k(db); #endif /* LOCKF */ r┆ 0x04f200…09e600 65 74 75 72 6e 28 46 41 49 4c 29 3b 0a 09 7d 0a 09 69 66 20 28 63 6d 70 64 61 74 75 6d 28 64 62 ┆eturn(FAIL); } if (cmpdatum(db┆ 0x04f200…09e600 2d 3e 63 75 72 72 65 6e 74 2e 64 70 74 72 2c 20 64 62 2d 3e 63 75 72 72 65 6e 74 2e 64 73 69 7a ┆->current.dptr, db->current.dsiz┆ 0x04f200…09e600 65 2c 20 69 74 65 6d 29 20 3d 3d 20 30 29 0a 09 7b 0a 09 20 20 20 20 46 52 45 45 28 64 62 29 3b ┆e, item) == 0) { FREE(db);┆ 0x04f200…09e600 0a 09 20 20 20 20 28 76 6f 69 64 29 20 64 65 6c 69 74 65 6d 28 64 62 2d 3e 70 61 67 62 75 66 2c ┆ (void) delitem(db->pagbuf,┆ 0x04f200…09e600 20 69 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 28 76 ┆ i); break; } } (v┆ 0x04f200…09e600 6f 69 64 29 20 73 65 74 75 70 5f 64 62 28 64 62 29 3b 0a 20 20 20 20 70 75 74 5f 70 61 67 65 28 ┆oid) setup_db(db); put_page(┆ 0x04f200…09e600 64 62 2c 20 64 62 2d 3e 62 6c 6b 6e 6f 2c 20 64 62 2d 3e 70 61 67 62 75 66 29 3b 0a 20 20 20 20 ┆db, db->blkno, db->pagbuf); ┆ 0x04f200…09e600 72 65 74 75 72 6e 28 53 55 43 43 45 45 44 29 3b 0a 7d 0a 0a 70 72 69 76 61 74 65 20 6c 6f 6e 67 ┆return(SUCCEED); } private long┆ 0x04f200…09e600 20 6e 65 78 74 62 75 63 6b 65 74 28 68 61 73 68 2c 20 64 62 29 0a 72 65 67 69 73 74 65 72 20 20 ┆ nextbucket(hash, db) register ┆ 0x04f200…09e600 20 20 64 61 74 61 62 61 73 65 20 2a 64 62 3b 0a 6c 6f 6e 67 20 20 20 20 68 61 73 68 3b 0a 7b 0a ┆ database *db; long hash; { ┆ 0x04f200…09e600 20 20 20 20 6c 6f 6e 67 20 20 20 20 62 69 74 3b 0a 0a 20 20 20 20 68 61 73 68 20 26 3d 20 64 62 ┆ long bit; hash &= db┆ 0x04f200…09e600 2d 3e 68 6d 61 73 6b 3b 0a 20 20 20 20 62 69 74 20 3d 20 64 62 2d 3e 68 6d 61 73 6b 20 2b 20 31 ┆->hmask; bit = db->hmask + 1┆ 0x04f200…09e600 3b 0a 20 20 20 20 66 6f 72 20 28 3b 3b 29 0a 20 20 20 20 7b 0a 09 62 69 74 20 3e 3e 3d 20 31 3b ┆; for (;;) { bit >>= 1;┆ 0x04f200…09e600 0a 09 69 66 20 28 62 69 74 20 3d 3d 20 30 29 0a 09 20 20 20 20 72 65 74 75 72 6e 28 30 29 3b 0a ┆ if (bit == 0) return(0); ┆ 0x04f200…09e600 09 69 66 20 28 28 68 61 73 68 20 26 20 62 69 74 29 20 3d 3d 20 30 29 0a 09 20 20 20 20 72 65 74 ┆ if ((hash & bit) == 0) ret┆ 0x04f200…09e600 75 72 6e 28 28 6c 6f 6e 67 29 28 68 61 73 68 20 7c 20 62 69 74 29 29 3b 0a 09 68 61 73 68 20 26 ┆urn((long)(hash | bit)); hash &┆ 0x04f200…09e600 3d 20 7e 62 69 74 3b 0a 20 20 20 20 7d 0a 7d 0a 0a 2f 2a 41 52 47 53 55 53 45 44 31 2a 2f 0a 69 ┆= ~bit; } } /*ARGSUSED1*/ i┆ 0x04f200…09e600 6e 74 20 64 62 6d 6e 65 78 74 28 64 62 2c 20 77 6c 6f 63 6b 29 0a 2f 2a 20 67 65 74 20 74 68 65 ┆nt dbmnext(db, wlock) /* get the┆ 0x04f200…09e600 20 6e 65 78 74 20 73 65 71 75 65 6e 74 69 61 6c 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 ┆ next sequential entry in the da┆ 0x04f200…09e600 74 61 62 61 73 65 20 2a 2f 0a 72 65 67 69 73 74 65 72 20 64 61 74 61 62 61 73 65 20 2a 64 62 3b ┆tabase */ register database *db;┆ 0x04f200…09e600 0a 62 6f 6f 6c 20 77 6c 6f 63 6b 3b 0a 7b 0a 20 20 20 20 72 65 67 69 73 74 65 72 20 69 6e 74 20 ┆ bool wlock; { register int ┆ 0x04f200…09e600 69 3b 0a 20 20 20 20 64 61 74 75 6d 09 69 74 65 6d 2c 20 62 69 74 65 6d 2c 20 66 69 72 73 74 68 ┆i; datum item, bitem, firsth┆ 0x04f200…09e600 61 73 68 28 29 3b 0a 20 20 20 20 6c 6f 6e 67 09 68 61 73 68 3b 0a 20 20 20 20 69 6e 74 09 09 66 ┆ash(); long hash; int f┆ 0x04f200…09e600 3b 0a 0a 20 20 20 20 2f 2a 20 69 66 20 77 65 27 72 65 20 72 65 77 6f 75 6e 64 2c 20 67 65 74 20 ┆; /* if we're rewound, get ┆ 0x04f200…09e600 74 68 65 20 66 69 72 73 74 20 65 6c 65 6d 65 6e 74 20 77 65 20 63 61 6e 20 61 63 63 65 73 73 20 ┆the first element we can access ┆ 0x04f200…09e600 2a 2f 0a 20 20 20 20 69 66 20 28 64 62 2d 3e 63 75 72 72 65 6e 74 2e 64 70 74 72 20 3d 3d 20 28 ┆*/ if (db->current.dptr == (┆ 0x04f200…09e600 63 68 61 72 20 2a 29 4e 55 4c 4c 29 0a 20 20 20 20 7b 0a 09 62 69 74 65 6d 20 3d 20 66 69 72 73 ┆char *)NULL) { bitem = firs┆ 0x04f200…09e600 74 68 61 73 68 28 30 4c 2c 20 64 62 2c 20 77 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 62 69 74 65 6d ┆thash(0L, db, wlock); if (bitem┆ 0x04f200…09e600 2e 64 70 74 72 20 3d 3d 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 0a 09 20 20 20 20 72 65 74 75 ┆.dptr == (char *)NULL) retu┆ 0x04f200…09e600 72 6e 28 46 41 49 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 20 20 20 20 2f 2a 20 6f ┆rn(FAIL); } else /* o┆ 0x04f200…09e600 74 68 65 72 77 69 73 65 2c 20 66 69 6e 64 20 74 68 65 20 6e 65 78 74 20 65 6c 65 6d 65 6e 74 20 ┆therwise, find the next element ┆ 0x04f200…09e600 61 66 74 65 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 6f 6e 65 20 2a 2f 0a 20 20 20 20 7b 0a 09 ┆after the current one */ { ┆ 0x04f200…09e600 68 61 73 68 20 3d 20 63 61 6c 63 68 61 73 68 28 64 62 2d 3e 63 75 72 72 65 6e 74 2e 64 70 74 72 ┆hash = calchash(db->current.dptr┆ 0x04f200…09e600 2c 20 64 62 2d 3e 63 75 72 72 65 6e 74 2e 64 73 69 7a 65 29 3b 0a 09 67 65 74 5f 70 61 67 65 28 ┆, db->current.dsize); get_page(┆ 0x04f200…09e600 68 61 73 68 2c 20 64 62 2c 20 77 6c 6f 63 6b 29 3b 09 09 2f 2a 20 67 6f 20 74 6f 20 74 68 65 20 ┆hash, db, wlock); /* go to the ┆ 0x04f200…09e600 63 6f 72 72 65 63 74 20 70 61 67 65 20 2a 2f 0a 09 66 6f 72 20 28 66 20 3d 20 69 20 3d 20 30 3b ┆correct page */ for (f = i = 0;┆ 0x04f200…09e600 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20 69 74 65 6d 20 3d 20 6d 61 6b 64 61 74 75 6d 28 64 62 ┆; i++) { item = makdatum(db┆ 0x04f200…09e600 2d 3e 70 61 67 62 75 66 2c 20 69 29 3b 0a 09 20 20 20 20 69 66 20 28 69 74 65 6d 2e 64 70 74 72 ┆->pagbuf, i); if (item.dptr┆ 0x04f200…09e600 20 3d 3d 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20 20 20 ┆ == (char *)NULL) break; ┆ 0x04f200…09e600 69 66 20 28 63 6d 70 64 61 74 75 6d 28 64 62 2d 3e 63 75 72 72 65 6e 74 2e 64 70 74 72 2c 20 64 ┆if (cmpdatum(db->current.dptr, d┆ 0x04f200…09e600 62 2d 3e 63 75 72 72 65 6e 74 2e 64 73 69 7a 65 2c 20 69 74 65 6d 29 20 3c 3d 20 30 29 0a 09 09 ┆b->current.dsize, item) <= 0) ┆ 0x04f200…09e600 63 6f 6e 74 69 6e 75 65 3b 0a 09 20 20 20 20 69 66 20 28 66 2b 2b 20 3d 3d 20 30 20 7c 7c 20 63 ┆continue; if (f++ == 0 || c┆ 0x04f200…09e600 6d 70 64 61 74 75 6d 28 62 69 74 65 6d 2e 64 70 74 72 2c 20 62 69 74 65 6d 2e 64 73 69 7a 65 2c ┆mpdatum(bitem.dptr, bitem.dsize,┆ 0x04f200…09e600 20 69 74 65 6d 29 20 3c 20 30 29 0a 09 09 62 69 74 65 6d 20 3d 20 69 74 65 6d 3b 0a 09 7d 0a 09 ┆ item) < 0) bitem = item; } ┆ 0x04f200…09e600 69 66 20 28 66 20 3d 3d 20 30 29 09 20 20 20 20 2f 2a 20 67 65 74 20 66 69 72 73 74 20 6b 65 79 ┆if (f == 0) /* get first key┆ 0x04f200…09e600 20 6f 6e 20 6e 65 78 74 20 70 61 67 65 20 6f 72 20 61 66 74 65 72 20 2a 2f 0a 09 7b 0a 09 20 20 ┆ on next page or after */ { ┆ 0x04f200…09e600 20 20 69 66 20 28 28 68 61 73 68 20 3d 20 6e 65 78 74 62 75 63 6b 65 74 28 68 61 73 68 2c 20 64 ┆ if ((hash = nextbucket(hash, d┆ 0x04f200…09e600 62 29 29 20 3d 3d 20 30 29 0a 09 09 72 65 74 75 72 6e 28 46 41 49 4c 29 3b 0a 09 20 20 20 20 62 ┆b)) == 0) return(FAIL); b┆ 0x04f200…09e600 69 74 65 6d 20 3d 20 66 69 72 73 74 68 61 73 68 28 68 61 73 68 2c 20 64 62 2c 20 77 6c 6f 63 6b ┆item = firsthash(hash, db, wlock┆ 0x04f200…09e600 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 46 52 45 45 28 64 62 29 3b 0a 20 20 20 20 64 62 ┆); } } FREE(db); db┆ 0x04f200…09e600 2d 3e 63 75 72 72 65 6e 74 20 3d 20 62 69 74 65 6d 3b 0a 20 20 20 20 72 65 74 75 72 6e 28 53 55 ┆->current = bitem; return(SU┆ 0x04f200…09e600 43 43 45 45 44 29 3b 0a 7d 0a 0a 69 6e 74 20 73 74 6f 72 65 28 6e 65 77 64 61 74 2c 20 64 62 29 ┆CCEED); } int store(newdat, db)┆ 0x04f200…09e600 0a 72 65 67 69 73 74 65 72 20 64 61 74 61 62 61 73 65 20 2a 64 62 3b 0a 64 61 74 75 6d 09 6e 65 ┆ register database *db; datum ne┆ 0x04f200…09e600 77 64 61 74 3b 0a 7b 0a 20 20 20 20 72 65 67 69 73 74 65 72 20 69 6e 74 20 69 3b 0a 20 20 20 20 ┆wdat; { register int i; ┆ 0x04f200…09e600 64 61 74 75 6d 09 69 74 65 6d 3b 0a 20 20 20 20 63 68 61 72 20 20 20 20 6f 76 66 62 75 66 5b 50 ┆datum item; char ovfbuf[P┆ 0x04f200…09e600 42 4c 4b 53 49 5a 5d 3b 0a 0a 20 20 20 20 69 66 20 28 73 65 74 75 70 5f 64 62 28 64 62 29 20 3c ┆BLKSIZ]; if (setup_db(db) <┆ 0x04f200…09e600 20 30 29 0a 09 72 65 74 75 72 6e 28 46 41 49 4c 29 3b 0a 20 20 20 20 69 66 20 28 64 62 2d 3e 64 ┆ 0) return(FAIL); if (db->d┆ 0x04f200…09e600 62 72 64 6f 6e 6c 79 29 0a 09 72 65 74 75 72 6e 28 46 41 49 4c 29 3b 0a 6c 6f 6f 70 3a 0a 20 20 ┆brdonly) return(FAIL); loop: ┆ 0x04f200…09e600 20 20 67 65 74 5f 70 61 67 65 28 63 61 6c 63 68 61 73 68 28 6e 65 77 64 61 74 2e 64 70 74 72 2c ┆ get_page(calchash(newdat.dptr,┆ 0x04f200…09e600 20 6e 65 77 64 61 74 2e 64 73 69 7a 65 29 2c 20 64 62 2c 20 54 52 55 45 29 3b 0a 20 20 20 20 66 ┆ newdat.dsize), db, TRUE); f┆ 0x04f200…09e600 6f 72 20 28 69 20 3d 20 30 3b 3b 20 69 2b 2b 29 0a 20 20 20 20 7b 0a 09 69 74 65 6d 20 3d 20 6d ┆or (i = 0;; i++) { item = m┆ 0x04f200…09e600 61 6b 64 61 74 75 6d 28 64 62 2d 3e 70 61 67 62 75 66 2c 20 69 29 3b 0a 09 69 66 20 28 69 74 65 ┆akdatum(db->pagbuf, i); if (ite┆ 0x04f200…09e600 6d 2e 64 70 74 72 20 3d 3d 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 0a 09 20 20 20 20 62 72 65 ┆m.dptr == (char *)NULL) bre┆ 0x04f200…09e600 61 6b 3b 0a 09 69 66 20 28 63 6d 70 64 61 74 75 6d 28 6e 65 77 64 61 74 2e 64 70 74 72 2c 20 6e ┆ak; if (cmpdatum(newdat.dptr, n┆ 0x04f200…09e600 65 77 64 61 74 2e 64 73 69 7a 65 2c 20 69 74 65 6d 29 20 3d 3d 20 30 29 0a 09 7b 0a 09 20 20 20 ┆ewdat.dsize, item) == 0) { ┆ 0x04f200…09e600 20 28 76 6f 69 64 29 20 64 65 6c 69 74 65 6d 28 64 62 2d 3e 70 61 67 62 75 66 2c 20 69 29 3b 0a ┆ (void) delitem(db->pagbuf, i); ┆ 0x04f200…09e600 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 20 3d 20 61 64 64 ┆ break; } } i = add┆ 0x04f200…09e600 69 74 65 6d 28 64 62 2d 3e 70 61 67 62 75 66 2c 20 6e 65 77 64 61 74 29 3b 0a 20 20 20 20 69 66 ┆item(db->pagbuf, newdat); if┆ 0x04f200…09e600 20 28 69 20 3c 20 30 29 0a 09 67 6f 74 6f 20 73 70 6c 69 74 3b 0a 20 20 20 20 70 75 74 5f 70 61 ┆ (i < 0) goto split; put_pa┆ 0x04f200…09e600 67 65 28 64 62 2c 20 64 62 2d 3e 62 6c 6b 6e 6f 2c 20 64 62 2d 3e 70 61 67 62 75 66 29 3b 0a 20 ┆ge(db, db->blkno, db->pagbuf); ┆ 0x04f200…09e600 20 20 20 72 65 74 75 72 6e 28 53 55 43 43 45 45 44 29 3b 0a 0a 73 70 6c 69 74 3a 0a 20 20 20 20 ┆ return(SUCCEED); split: ┆ 0x04f200…09e600 69 66 20 28 6e 65 77 64 61 74 2e 64 73 69 7a 65 20 2b 20 32 2a 73 69 7a 65 6f 66 28 73 6c 6f 6e ┆if (newdat.dsize + 2*sizeof(slon┆ 0x04f200…09e600 67 29 20 2b 20 32 2a 73 69 7a 65 6f 66 28 73 73 68 6f 72 74 29 20 3e 3d 20 50 42 4c 4b 53 49 5a ┆g) + 2*sizeof(sshort) >= PBLKSIZ┆ 0x04f200…09e600 29 0a 09 72 65 74 75 72 6e 28 46 41 49 4c 29 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 62 7a 65 72 ┆) return(FAIL); (void) bzer┆ 0x04f200…09e600 6f 28 6f 76 66 62 75 66 2c 20 50 42 4c 4b 53 49 5a 29 3b 0a 20 20 20 20 66 6f 72 20 28 69 20 3d ┆o(ovfbuf, PBLKSIZ); for (i =┆ 0x04f200…09e600 20 30 3b 3b 29 0a 20 20 20 20 7b 0a 09 69 74 65 6d 20 3d 20 6d 61 6b 64 61 74 75 6d 28 64 62 2d ┆ 0;;) { item = makdatum(db-┆ 0x04f200…09e600 3e 70 61 67 62 75 66 2c 20 69 29 3b 0a 09 69 66 20 28 69 74 65 6d 2e 64 70 74 72 20 3d 3d 20 28 ┆>pagbuf, i); if (item.dptr == (┆ 0x04f200…09e600 63 68 61 72 20 2a 29 4e 55 4c 4c 29 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 69 66 20 28 63 61 ┆char *)NULL) break; if (ca┆ 0x04f200…09e600 6c 63 68 61 73 68 28 69 74 65 6d 2e 64 70 74 72 2c 20 69 74 65 6d 2e 64 73 69 7a 65 29 20 26 28 ┆lchash(item.dptr, item.dsize) &(┆ 0x04f200…09e600 64 62 2d 3e 68 6d 61 73 6b 20 2b 20 31 29 29 0a 09 7b 0a 09 20 20 20 20 28 76 6f 69 64 29 20 61 ┆db->hmask + 1)) { (void) a┆ 0x04f200…09e600 64 64 69 74 65 6d 28 6f 76 66 62 75 66 2c 20 69 74 65 6d 29 3b 0a 09 20 20 20 20 28 76 6f 69 64 ┆dditem(ovfbuf, item); (void┆ 0x04f200…09e600 29 20 64 65 6c 69 74 65 6d 28 64 62 2d 3e 70 61 67 62 75 66 2c 20 69 29 3b 0a 09 20 20 20 20 63 ┆) delitem(db->pagbuf, i); c┆ 0x04f200…09e600 6f 6e 74 69 6e 75 65 3b 0a 09 7d 0a 09 69 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 75 74 5f ┆ontinue; } i++; } put_┆ 0x04f200…09e600 70 61 67 65 28 64 62 2c 20 64 62 2d 3e 62 6c 6b 6e 6f 2c 20 64 62 2d 3e 70 61 67 62 75 66 29 3b ┆page(db, db->blkno, db->pagbuf);┆ 0x04f200…09e600 0a 20 20 20 20 70 75 74 5f 70 61 67 65 28 64 62 2c 20 64 62 2d 3e 62 6c 6b 6e 6f 20 2b 20 64 62 ┆ put_page(db, db->blkno + db┆ 0x04f200…09e600 2d 3e 68 6d 61 73 6b 20 2b 20 31 4c 2c 20 6f 76 66 62 75 66 29 3b 0a 20 20 20 20 28 76 6f 69 64 ┆->hmask + 1L, ovfbuf); (void┆ 0x04f200…09e600 29 20 62 69 74 73 65 74 28 64 62 29 3b 0a 20 20 20 20 67 6f 74 6f 20 6c 6f 6f 70 3b 0a 7d 0a 0a ┆) bitset(db); goto loop; } ┆ 0x04f200…09e600 64 61 74 75 6d 20 66 69 72 73 74 68 61 73 68 28 68 61 73 68 2c 20 64 62 2c 20 77 6c 6f 63 6b 29 ┆datum firsthash(hash, db, wlock)┆ 0x04f200…09e600 0a 2f 2a 20 66 69 6e 64 20 74 68 65 20 66 69 72 73 74 20 69 74 65 6d 20 69 6e 20 6f 72 20 61 66 ┆ /* find the first item in or af┆ 0x04f200…09e600 74 65 72 20 74 68 65 20 62 75 63 6b 65 74 20 73 70 65 63 69 66 69 65 64 20 62 79 20 68 61 73 68 ┆ter the bucket specified by hash┆ 0x04f200…09e600 20 2a 2f 0a 6c 6f 6e 67 20 68 61 73 68 3b 0a 72 65 67 69 73 74 65 72 20 64 61 74 61 62 61 73 65 ┆ */ long hash; register database┆ 0x04f200…09e600 20 2a 64 62 3b 0a 62 6f 6f 6c 20 77 6c 6f 63 6b 3b 0a 7b 0a 20 20 20 20 72 65 67 69 73 74 65 72 ┆ *db; bool wlock; { register┆ 0x04f200…09e600 20 69 6e 74 20 69 3b 0a 20 20 20 20 64 61 74 75 6d 09 69 74 65 6d 2c 20 62 69 74 65 6d 3b 0a 0a ┆ int i; datum item, bitem; ┆ 0x04f200…09e600 20 20 20 20 64 6f 20 7b 0a 09 67 65 74 5f 70 61 67 65 28 68 61 73 68 2c 20 64 62 2c 20 77 6c 6f ┆ do { get_page(hash, db, wlo┆ 0x04f200…09e600 63 6b 29 3b 0a 09 62 69 74 65 6d 20 3d 20 6d 61 6b 64 61 74 75 6d 28 64 62 2d 3e 70 61 67 62 75 ┆ck); bitem = makdatum(db->pagbu┆ 0x04f200…09e600 66 2c 20 30 29 3b 0a 09 66 6f 72 20 28 69 20 3d 20 30 3b 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 ┆f, 0); for (i = 0;; i++) { ┆ 0x04f200…09e600 20 69 74 65 6d 20 3d 20 6d 61 6b 64 61 74 75 6d 28 64 62 2d 3e 70 61 67 62 75 66 2c 20 69 29 3b ┆ item = makdatum(db->pagbuf, i);┆ 0x04f200…09e600 0a 09 20 20 20 20 69 66 20 28 69 74 65 6d 2e 64 70 74 72 20 3d 3d 20 28 63 68 61 72 20 2a 29 4e ┆ if (item.dptr == (char *)N┆ 0x04f200…09e600 55 4c 4c 29 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20 20 20 69 66 20 28 63 6d 70 64 61 74 75 6d 28 ┆ULL) break; if (cmpdatum(┆ 0x04f200…09e600 62 69 74 65 6d 2e 64 70 74 72 2c 20 62 69 74 65 6d 2e 64 73 69 7a 65 2c 20 69 74 65 6d 29 20 3c ┆bitem.dptr, bitem.dsize, item) <┆ 0x04f200…09e600 20 30 29 0a 09 09 62 69 74 65 6d 20 3d 20 69 74 65 6d 3b 0a 09 7d 0a 09 69 66 20 28 62 69 74 65 ┆ 0) bitem = item; } if (bite┆ 0x04f200…09e600 6d 2e 64 70 74 72 20 21 3d 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 0a 09 20 20 20 20 72 65 74 ┆m.dptr != (char *)NULL) ret┆ 0x04f200…09e600 75 72 6e 28 62 69 74 65 6d 29 3b 0a 20 20 20 20 7d 20 77 68 69 6c 65 0a 09 28 68 61 73 68 20 3d ┆urn(bitem); } while (hash =┆ 0x04f200…09e600 20 6e 65 78 74 62 75 63 6b 65 74 28 68 61 73 68 2c 20 64 62 29 29 3b 0a 0a 20 20 20 20 72 65 74 ┆ nextbucket(hash, db)); ret┆ 0x04f200…09e600 75 72 6e 28 69 74 65 6d 29 3b 0a 7d 0a 0a 69 6e 74 20 64 62 6d 70 75 74 28 6b 65 79 2c 20 6b 65 ┆urn(item); } int dbmput(key, ke┆ 0x04f200…09e600 79 6c 65 6e 2c 20 63 6f 6e 74 65 6e 74 2c 20 63 6f 6e 74 65 6e 74 6c 65 6e 2c 20 64 62 29 0a 2f ┆ylen, content, contentlen, db) /┆ 0x04f200…09e600 2a 20 77 72 69 74 65 20 63 6f 6e 74 65 6e 74 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 2a 2f 0a 63 ┆* write content to an entry */ c┆ 0x04f200…09e600 68 61 72 09 20 20 20 20 2a 6b 65 79 3b 09 2f 2a 20 6b 65 79 20 74 6f 20 61 73 73 6f 63 69 61 74 ┆har *key; /* key to associat┆ 0x04f200…09e600 65 20 63 6f 6e 74 65 6e 74 20 77 69 74 68 20 2a 2f 0a 75 6e 73 69 67 6e 65 64 20 20 20 20 6b 65 ┆e content with */ unsigned ke┆ 0x04f200…09e600 79 6c 65 6e 3b 09 2f 2a 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 6b 65 79 20 74 6f 20 77 72 ┆ylen; /* length of the key to wr┆ 0x04f200…09e600 69 74 65 20 74 6f 20 2a 2f 0a 63 68 61 72 09 20 20 20 20 2a 63 6f 6e 74 65 6e 74 3b 09 2f 2a 20 ┆ite to */ char *content; /* ┆ 0x04f200…09e600 74 68 65 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 75 6e 73 69 67 6e 65 64 20 63 6f 6e 74 65 6e 74 6c ┆the content */ unsigned contentl┆ 0x04f200…09e600 65 6e 3b 09 2f 2a 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 ┆en; /* the length of the content┆ 0x04f200…09e600 20 2a 2f 0a 72 65 67 69 73 74 65 72 20 64 61 74 61 62 61 73 65 20 2a 64 62 3b 0a 7b 0a 20 20 20 ┆ */ register database *db; { ┆ 0x04f200…09e600 20 69 6e 74 09 20 20 20 20 66 6f 75 6e 64 69 74 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63 68 61 ┆ int foundit; static cha┆ 0x04f200…09e600 72 20 20 20 20 2a 6d 61 6c 6c 6f 63 5f 6b 6c 75 64 67 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 ┆r *malloc_kludge = NULL; ┆ 0x04f200…09e600 0a 20 20 20 20 69 66 20 28 6d 61 6c 6c 6f 63 5f 6b 6c 75 64 67 65 29 0a 09 20 20 20 20 66 72 65 ┆ if (malloc_kludge) fre┆ 0x04f200…09e600 65 28 6d 61 6c 6c 6f 63 5f 6b 6c 75 64 67 65 29 3b 0a 20 20 20 20 6d 61 6c 6c 6f 63 5f 6b 6c 75 ┆e(malloc_kludge); malloc_klu┆ 0x04f200…09e600 64 67 65 20 3d 20 73 61 76 65 73 74 72 28 6b 65 79 29 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 73 ┆dge = savestr(key); (void) s┆ 0x04f200…09e600 65 74 75 70 5f 64 62 28 64 62 29 3b 0a 20 20 20 20 66 6f 75 6e 64 69 74 20 3d 20 28 64 62 6d 73 ┆etup_db(db); foundit = (dbms┆ 0x04f200…09e600 65 65 6b 28 6b 65 79 2c 20 6b 65 79 6c 65 6e 2c 20 64 62 2c 20 54 52 55 45 29 20 3d 3d 20 53 55 ┆eek(key, keylen, db, TRUE) == SU┆ 0x04f200…09e600 43 43 45 45 44 29 3b 0a 23 69 66 64 65 66 20 4c 45 4e 47 54 48 4f 50 54 49 4d 09 2f 2a 20 74 68 ┆CCEED); #ifdef LENGTHOPTIM /* th┆ 0x04f200…09e600 69 73 20 73 68 6f 75 6c 64 20 77 6f 72 6b 2c 20 62 75 74 20 64 6f 65 73 6e 27 74 20 2a 2f 0a 20 ┆is should work, but doesn't */ ┆ 0x04f200…09e600 20 20 20 69 66 20 28 66 6f 75 6e 64 69 74 20 26 26 20 63 6f 6e 74 65 6e 74 6c 65 6e 20 3c 3d 20 ┆ if (foundit && contentlen <= ┆ 0x04f200…09e600 64 62 2d 3e 63 75 72 72 65 6e 74 2e 64 6c 65 6e 67 74 68 29 0a 20 20 20 20 7b 0a 09 28 76 6f 69 ┆db->current.dlength) { (voi┆ 0x04f200…09e600 64 29 20 6c 73 65 65 6b 28 64 62 2d 3e 64 61 74 66 2c 20 28 6f 66 66 5f 74 29 64 62 2d 3e 63 75 ┆d) lseek(db->datf, (off_t)db->cu┆ 0x04f200…09e600 72 72 65 6e 74 2e 64 61 64 64 72 65 73 73 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a 09 64 62 2d 3e ┆rrent.daddress, SEEK_SET); db->┆ 0x04f200…09e600 63 75 72 72 65 6e 74 2e 64 6c 65 6e 67 74 68 20 3d 20 63 6f 6e 74 65 6e 74 6c 65 6e 3b 0a 20 20 ┆current.dlength = contentlen; ┆ 0x04f200…09e600 20 20 7d 0a 20 20 20 20 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 4c 45 4e 47 54 48 4f 50 54 ┆ } else #endif /* LENGTHOPT┆ 0x04f200…09e600 49 4d 20 2a 2f 0a 20 20 20 20 7b 0a 09 69 66 20 28 66 6f 75 6e 64 69 74 29 0a 09 7b 0a 09 20 20 ┆IM */ { if (foundit) { ┆ 0x04f200…09e600 20 20 28 76 6f 69 64 29 20 64 62 6d 64 65 6c 65 74 65 28 64 62 29 3b 0a 09 20 20 20 20 28 76 6f ┆ (void) dbmdelete(db); (vo┆ 0x04f200…09e600 69 64 29 20 64 62 6d 73 65 65 6b 28 6b 65 79 2c 20 6b 65 79 6c 65 6e 2c 20 64 62 2c 20 54 52 55 ┆id) dbmseek(key, keylen, db, TRU┆ 0x04f200…09e600 45 29 3b 0a 09 7d 0a 09 64 62 2d 3e 63 75 72 72 65 6e 74 2e 64 70 74 72 20 3d 20 6d 61 6c 6c 6f ┆E); } db->current.dptr = mallo┆ 0x04f200…09e600 63 5f 6b 6c 75 64 67 65 3b 20 2f 2a 20 6b 65 79 20 2a 2f 0a 09 64 62 2d 3e 63 75 72 72 65 6e 74 ┆c_kludge; /* key */ db->current┆ 0x04f200…09e600 2e 64 73 69 7a 65 20 3d 20 6b 65 79 6c 65 6e 3b 0a 09 64 62 2d 3e 63 75 72 72 65 6e 74 2e 64 61 ┆.dsize = keylen; db->current.da┆ 0x04f200…09e600 64 64 72 65 73 73 20 3d 20 6c 73 65 65 6b 28 64 62 2d 3e 64 61 74 66 2c 20 28 6f 66 66 5f 74 29 ┆ddress = lseek(db->datf, (off_t)┆ 0x04f200…09e600 30 2c 20 53 45 45 4b 5f 45 4e 44 29 3b 0a 09 64 62 2d 3e 63 75 72 72 65 6e 74 2e 64 6c 65 6e 67 ┆0, SEEK_END); db->current.dleng┆ 0x04f200…09e600 74 68 20 3d 20 63 6f 6e 74 65 6e 74 6c 65 6e 3b 0a 09 64 62 2d 3e 66 72 65 65 70 74 72 20 3d 20 ┆th = contentlen; db->freeptr = ┆ 0x04f200…09e600 28 63 68 61 72 20 2a 29 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 6f 72 ┆(char *)NULL; } if (stor┆ 0x04f200…09e600 65 28 64 62 2d 3e 63 75 72 72 65 6e 74 2c 20 64 62 29 20 3c 20 30 29 0a 09 72 65 74 75 72 6e 28 ┆e(db->current, db) < 0) return(┆ 0x04f200…09e600 46 41 49 4c 29 3b 0a 23 69 66 64 65 66 20 4c 4f 43 4b 46 0a 20 20 20 20 28 76 6f 69 64 29 20 6c ┆FAIL); #ifdef LOCKF (void) l┆ 0x04f200…09e600 6f 63 6b 66 28 64 62 2d 3e 64 61 74 66 2c 20 46 5f 4c 4f 43 4b 2c 20 28 6c 6f 6e 67 29 63 6f 6e ┆ockf(db->datf, F_LOCK, (long)con┆ 0x04f200…09e600 74 65 6e 74 6c 65 6e 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 4c 4f 43 4b 46 20 2a 2f 0a 20 20 20 ┆tentlen); #endif /* LOCKF */ ┆ 0x04f200…09e600 20 28 76 6f 69 64 29 20 77 72 69 74 65 28 64 62 2d 3e 64 61 74 66 2c 20 63 6f 6e 74 65 6e 74 2c ┆ (void) write(db->datf, content,┆ 0x04f200…09e600 20 28 69 6f 6c 65 6e 5f 74 29 20 63 6f 6e 74 65 6e 74 6c 65 6e 29 3b 0a 23 69 66 64 65 66 20 4c ┆ (iolen_t) contentlen); #ifdef L┆ 0x04f200…09e600 4f 43 4b 46 0a 20 20 20 20 28 76 6f 69 64 29 20 6c 73 65 65 6b 28 64 62 2d 3e 64 61 74 66 2c 20 ┆OCKF (void) lseek(db->datf, ┆ 0x04f200…09e600 28 6f 66 66 5f 74 29 64 62 2d 3e 63 75 72 72 65 6e 74 2e 64 61 64 64 72 65 73 73 2c 20 53 45 45 ┆(off_t)db->current.daddress, SEE┆ 0x04f200…09e600 4b 5f 53 45 54 29 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 6c 6f 63 6b 66 28 64 62 2d 3e 64 61 74 ┆K_SET); (void) lockf(db->dat┆ 0x04f200…09e600 66 2c 20 46 5f 55 4c 4f 43 4b 2c 20 28 6c 6f 6e 67 29 63 6f 6e 74 65 6e 74 6c 65 6e 29 3b 0a 23 ┆f, F_ULOCK, (long)contentlen); #┆ 0x04f200…09e600 65 6e 64 69 66 20 2f 2a 20 4c 4f 43 4b 46 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 28 53 55 43 ┆endif /* LOCKF */ return(SUC┆ 0x04f200…09e600 43 45 45 44 29 3b 0a 7d 0a 0a 63 68 61 72 20 2a 64 62 6d 67 65 74 28 63 6f 6e 74 65 6e 74 6c 65 ┆CEED); } char *dbmget(contentle┆ 0x04f200…09e600 6e 2c 20 64 62 29 0a 75 6e 73 69 67 6e 65 64 09 20 20 20 20 2a 63 6f 6e 74 65 6e 74 6c 65 6e 3b ┆n, db) unsigned *contentlen;┆ 0x04f200…09e600 0a 72 65 67 69 73 74 65 72 20 64 61 74 61 62 61 73 65 20 20 20 2a 64 62 3b 0a 7b 0a 20 20 20 20 ┆ register database *db; { ┆ 0x04f200…09e600 63 68 61 72 20 20 20 20 2a 63 6f 6e 74 65 6e 74 3b 0a 0a 20 20 20 20 28 76 6f 69 64 29 20 73 65 ┆char *content; (void) se┆ 0x04f200…09e600 74 75 70 5f 64 62 28 64 62 29 3b 0a 20 20 20 20 69 66 20 28 28 63 6f 6e 74 65 6e 74 20 3d 20 6d ┆tup_db(db); if ((content = m┆ 0x04f200…09e600 61 6c 6c 6f 63 28 28 75 6e 73 69 67 6e 65 64 29 20 64 62 2d 3e 63 75 72 72 65 6e 74 2e 64 6c 65 ┆alloc((unsigned) db->current.dle┆ 0x04f200…09e600 6e 67 74 68 2b 31 29 29 20 3d 3d 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 0a 09 72 65 74 75 72 ┆ngth+1)) == (char *)NULL) retur┆ 0x04f200…09e600 6e 28 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 6f 6e 74 65 6e 74 ┆n((char *)NULL); if (content┆ 0x04f200…09e600 6c 65 6e 29 0a 09 2a 63 6f 6e 74 65 6e 74 6c 65 6e 20 3d 20 64 62 2d 3e 63 75 72 72 65 6e 74 2e ┆len) *contentlen = db->current.┆ 0x04f200…09e600 64 6c 65 6e 67 74 68 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 6c 73 65 65 6b 28 64 62 2d 3e 64 61 ┆dlength; (void) lseek(db->da┆ 0x04f200…09e600 74 66 2c 20 28 6f 66 66 5f 74 29 64 62 2d 3e 63 75 72 72 65 6e 74 2e 64 61 64 64 72 65 73 73 2c ┆tf, (off_t)db->current.daddress,┆ 0x04f200…09e600 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20 20 20 69 66 20 28 72 65 61 64 28 64 62 2d 3e 64 61 74 ┆ SEEK_SET); if (read(db->dat┆ 0x04f200…09e600 66 2c 20 63 6f 6e 74 65 6e 74 2c 0a 09 09 28 69 6f 6c 65 6e 5f 74 29 20 64 62 2d 3e 63 75 72 72 ┆f, content, (iolen_t) db->curr┆ 0x04f200…09e600 65 6e 74 2e 64 6c 65 6e 67 74 68 29 20 3d 3d 20 64 62 2d 3e 63 75 72 72 65 6e 74 2e 64 6c 65 6e ┆ent.dlength) == db->current.dlen┆ 0x04f200…09e600 67 74 68 29 0a 09 72 65 74 75 72 6e 28 64 62 2d 3e 66 72 65 65 70 74 72 20 3d 20 63 6f 6e 74 65 ┆gth) return(db->freeptr = conte┆ 0x04f200…09e600 6e 74 29 3b 0a 20 20 20 20 65 6c 73 65 0a 09 72 65 74 75 72 6e 28 28 63 68 61 72 20 2a 29 4e 55 ┆nt); else return((char *)NU┆ 0x04f200…09e600 4c 4c 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 4d 41 49 4e 0a 2f 2a 0a 20 2a 20 41 6e 20 65 78 65 ┆LL); } #ifdef MAIN /* * An exe┆ 0x04f200…09e600 72 63 69 73 65 72 20 66 6f 72 20 74 68 65 73 65 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 20 2a 2f 0a ┆rciser for these functions. */ ┆ 0x04f200…09e600 63 68 61 72 09 2a 50 72 6f 67 6e 61 6d 65 20 3d 20 22 65 64 62 6d 22 3b 0a 0a 6d 61 69 6e 28 29 ┆char *Progname = "edbm"; main()┆ 0x04f200…09e600 0a 7b 0a 20 20 20 20 63 68 61 72 20 20 20 20 63 6d 64 6c 69 6e 65 5b 42 55 46 53 49 5a 5d 2c 20 ┆ { char cmdline[BUFSIZ], ┆ 0x04f200…09e600 73 74 72 76 5b 42 55 46 53 49 5a 5d 2c 20 73 74 72 76 32 5b 42 55 46 53 49 5a 5d 2c 20 64 62 6e ┆strv[BUFSIZ], strv2[BUFSIZ], dbn┆ 0x04f200…09e600 61 6d 65 5b 42 55 46 53 49 5a 5d 3b 0a 20 20 20 20 64 61 74 61 62 61 73 65 20 2a 6d 79 64 62 3b ┆ame[BUFSIZ]; database *mydb;┆ 0x04f200…09e600 0a 0a 20 20 20 20 28 76 6f 69 64 29 20 70 72 69 6e 74 66 28 22 54 68 69 73 20 69 73 20 74 68 65 ┆ (void) printf("This is the┆ 0x04f200…09e600 20 65 64 62 6d 20 64 61 74 61 62 61 73 65 20 65 64 69 74 6f 72 2c 20 74 79 70 65 20 3f 20 66 6f ┆ edbm database editor, type ? fo┆ 0x04f200…09e600 72 20 68 65 6c 70 5c 6e 22 29 3b 0a 20 20 20 20 77 68 69 6c 65 20 28 66 70 75 74 73 28 22 2a 20 ┆r help\n"); while (fputs("* ┆ 0x04f200…09e600 22 2c 20 73 74 64 6f 75 74 29 20 21 3d 20 45 4f 46 20 26 26 20 67 65 74 73 28 63 6d 64 6c 69 6e ┆", stdout) != EOF && gets(cmdlin┆ 0x04f200…09e600 65 29 20 21 3d 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 0a 20 20 20 20 7b 0a 09 69 66 20 28 73 ┆e) != (char *)NULL) { if (s┆ 0x04f200…09e600 73 63 61 6e 66 28 63 6d 64 6c 69 6e 65 2c 20 22 6f 20 25 73 22 2c 20 64 62 6e 61 6d 65 29 20 3d ┆scanf(cmdline, "o %s", dbname) =┆ 0x04f200…09e600 3d 20 31 29 0a 09 7b 0a 09 20 20 20 20 28 76 6f 69 64 29 20 73 70 72 69 6e 74 66 28 73 74 72 76 ┆= 1) { (void) sprintf(strv┆ 0x04f200…09e600 32 2c 0a 09 09 09 22 74 6f 75 63 68 20 25 73 2e 64 61 74 3b 20 74 6f 75 63 68 20 25 73 2e 64 69 ┆2, "touch %s.dat; touch %s.di┆ 0x04f200…09e600 72 3b 20 74 6f 75 63 68 20 25 73 2e 70 61 67 22 2c 0a 09 09 09 64 62 6e 61 6d 65 2c 20 64 62 6e ┆r; touch %s.pag", dbname, dbn┆ 0x04f200…09e600 61 6d 65 2c 20 64 62 6e 61 6d 65 29 3b 0a 09 20 20 20 20 28 76 6f 69 64 29 20 73 79 73 74 65 6d ┆ame, dbname); (void) system┆ 0x04f200…09e600 28 73 74 72 76 32 29 3b 0a 09 20 20 20 20 69 66 20 28 28 6d 79 64 62 20 3d 20 64 62 6d 6f 70 65 ┆(strv2); if ((mydb = dbmope┆ 0x04f200…09e600 6e 28 64 62 6e 61 6d 65 29 29 20 3d 3d 20 28 64 61 74 61 62 61 73 65 20 2a 29 4e 55 4c 4c 29 0a ┆n(dbname)) == (database *)NULL) ┆ 0x04f200…09e600 09 09 28 76 6f 69 64 29 20 70 72 69 6e 74 66 28 22 4f 70 65 6e 20 66 61 69 6c 65 64 5c 6e 22 29 ┆ (void) printf("Open failed\n")┆ 0x04f200…09e600 3b 0a 09 7d 0a 09 65 6c 73 65 20 69 66 20 28 73 73 63 61 6e 66 28 63 6d 64 6c 69 6e 65 2c 20 22 ┆; } else if (sscanf(cmdline, "┆ 0x04f200…09e600 67 20 25 73 22 2c 20 73 74 72 76 29 20 3d 3d 20 31 29 0a 09 7b 0a 09 20 20 20 20 73 74 61 74 69 ┆g %s", strv) == 1) { stati┆ 0x04f200…09e600 63 20 63 68 61 72 09 20 20 20 20 2a 63 6f 6e 74 65 6e 74 3b 0a 09 20 20 20 20 75 6e 73 69 67 6e ┆c char *content; unsign┆ 0x04f200…09e600 65 64 20 69 6e 74 20 20 20 20 63 6c 65 6e 3b 0a 0a 09 20 20 20 20 69 66 20 28 64 62 6d 73 65 65 ┆ed int clen; if (dbmsee┆ 0x04f200…09e600 6b 28 73 74 72 76 2c 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 73 74 72 6c 65 6e 28 73 74 ┆k(strv, (unsigned int) strlen(st┆ 0x04f200…09e600 72 76 29 2c 0a 09 09 09 6d 79 64 62 2c 21 6d 79 64 62 2d 3e 64 62 72 64 6f 6e 6c 79 29 20 3d 3d ┆rv), mydb,!mydb->dbrdonly) ==┆ 0x04f200…09e600 20 46 41 49 4c 29 0a 09 09 28 76 6f 69 64 29 20 70 72 69 6e 74 66 28 22 25 73 3a 20 6e 6f 20 73 ┆ FAIL) (void) printf("%s: no s┆ 0x04f200…09e600 75 63 68 20 6b 65 79 5c 6e 22 2c 20 73 74 72 76 29 3b 0a 09 20 20 20 20 65 6c 73 65 0a 09 20 20 ┆uch key\n", strv); else ┆ 0x04f200…09e600 20 20 7b 0a 09 09 63 6f 6e 74 65 6e 74 20 3d 20 64 62 6d 67 65 74 28 26 63 6c 65 6e 2c 20 6d 79 ┆ { content = dbmget(&clen, my┆ 0x04f200…09e600 64 62 29 3b 0a 09 09 63 6f 6e 74 65 6e 74 5b 63 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 09 09 28 ┆db); content[clen] = '\0'; (┆ 0x04f200…09e600 76 6f 69 64 29 20 70 72 69 6e 74 66 28 22 25 73 3a 20 76 61 6c 75 65 20 69 73 20 25 73 5c 6e 22 ┆void) printf("%s: value is %s\n"┆ 0x04f200…09e600 2c 20 73 74 72 76 2c 20 63 6f 6e 74 65 6e 74 29 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 65 6c 73 ┆, strv, content); } } els┆ 0x04f200…09e600 65 20 69 66 20 28 63 6d 64 6c 69 6e 65 5b 30 5d 20 3d 3d 20 27 64 27 29 0a 09 20 20 20 20 28 76 ┆e if (cmdline[0] == 'd') (v┆ 0x04f200…09e600 6f 69 64 29 20 64 62 6d 64 65 6c 65 74 65 28 6d 79 64 62 29 3b 0a 09 65 6c 73 65 20 69 66 20 28 ┆oid) dbmdelete(mydb); else if (┆ 0x04f200…09e600 63 6d 64 6c 69 6e 65 5b 30 5d 20 3d 3d 20 27 72 27 29 0a 09 20 20 20 20 64 62 6d 72 65 77 69 6e ┆cmdline[0] == 'r') dbmrewin┆ 0x04f200…09e600 64 28 6d 79 64 62 29 3b 0a 09 65 6c 73 65 20 69 66 20 28 63 6d 64 6c 69 6e 65 5b 30 5d 20 3d 3d ┆d(mydb); else if (cmdline[0] ==┆ 0x04f200…09e600 20 27 6e 27 20 7c 7c 20 63 6d 64 6c 69 6e 65 5b 30 5d 20 3d 3d 20 27 5c 30 27 29 0a 09 7b 0a 09 ┆ 'n' || cmdline[0] == '\0') { ┆ 0x04f200…09e600 20 20 20 20 69 66 20 28 64 62 6d 6e 65 78 74 28 6d 79 64 62 2c 20 21 6d 79 64 62 2d 3e 64 62 72 ┆ if (dbmnext(mydb, !mydb->dbr┆ 0x04f200…09e600 64 6f 6e 6c 79 29 20 3d 3d 20 46 41 49 4c 29 0a 09 09 28 76 6f 69 64 29 20 66 70 72 69 6e 74 66 ┆donly) == FAIL) (void) fprintf┆ 0x04f200…09e600 28 73 74 64 65 72 72 2c 20 22 4e 6f 20 6d 6f 72 65 20 6b 65 79 73 5c 6e 22 29 3b 0a 09 20 20 20 ┆(stderr, "No more keys\n"); ┆ 0x04f200…09e600 20 65 6c 73 65 0a 09 09 28 76 6f 69 64 29 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 4e ┆ else (void) fprintf(stderr,"N┆ 0x04f200…09e600 65 78 74 20 6b 65 79 20 69 73 3a 20 25 73 5c 6e 22 2c 6d 79 64 62 2d 3e 63 75 72 72 65 6e 74 2e ┆ext key is: %s\n",mydb->current.┆ 0x04f200…09e600 64 70 74 72 29 3b 0a 09 7d 0a 23 69 66 64 65 66 20 4c 4f 43 4b 46 0a 09 65 6c 73 65 20 69 66 20 ┆dptr); } #ifdef LOCKF else if ┆ 0x04f200…09e600 28 63 6d 64 6c 69 6e 65 5b 30 5d 20 3d 3d 20 27 75 27 29 0a 09 20 20 20 20 64 62 6d 75 6e 6c 6f ┆(cmdline[0] == 'u') dbmunlo┆ 0x04f200…09e600 63 6b 28 6d 79 64 62 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 4c 4f 43 4b 46 20 2a 2f 0a 09 65 6c ┆ck(mydb); #endif /* LOCKF */ el┆ 0x04f200…09e600 73 65 20 69 66 20 28 73 73 63 61 6e 66 28 63 6d 64 6c 69 6e 65 2c 20 22 70 20 25 73 20 25 73 22 ┆se if (sscanf(cmdline, "p %s %s"┆ 0x04f200…09e600 2c 20 73 74 72 76 2c 20 73 74 72 76 32 29 20 3d 3d 20 32 29 0a 09 20 20 20 20 28 76 6f 69 64 29 ┆, strv, strv2) == 2) (void)┆ 0x04f200…09e600 20 64 62 6d 70 75 74 28 73 74 72 76 2c 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 73 74 72 ┆ dbmput(strv, (unsigned int) str┆ 0x04f200…09e600 6c 65 6e 28 73 74 72 76 29 2c 20 73 74 72 76 32 2c 0a 09 09 09 20 20 28 75 6e 73 69 67 6e 65 64 ┆len(strv), strv2, (unsigned┆ 0x04f200…09e600 20 69 6e 74 29 20 73 74 72 6c 65 6e 28 73 74 72 76 32 29 2c 20 6d 79 64 62 29 3b 0a 09 65 6c 73 ┆ int) strlen(strv2), mydb); els┆ 0x04f200…09e600 65 20 69 66 20 28 63 6d 64 6c 69 6e 65 5b 30 5d 20 3d 3d 20 27 78 27 29 0a 09 20 20 20 20 65 78 ┆e if (cmdline[0] == 'x') ex┆ 0x04f200…09e600 69 74 28 53 55 43 43 45 45 44 29 3b 0a 09 65 6c 73 65 20 69 66 20 28 63 6d 64 6c 69 6e 65 5b 30 ┆it(SUCCEED); else if (cmdline[0┆ 0x04f200…09e600 5d 20 3d 3d 20 27 71 27 29 0a 09 7b 0a 09 20 20 20 20 64 62 6d 63 6c 6f 73 65 28 6d 79 64 62 29 ┆] == 'q') { dbmclose(mydb)┆ 0x04f200…09e600 3b 0a 09 20 20 20 20 65 78 69 74 28 53 55 43 43 45 45 44 29 3b 0a 09 7d 0a 09 65 6c 73 65 20 69 ┆; exit(SUCCEED); } else i┆ 0x04f200…09e600 66 20 28 63 6d 64 6c 69 6e 65 5b 30 5d 20 3d 3d 20 27 77 27 29 0a 09 7b 0a 09 20 20 20 20 64 62 ┆f (cmdline[0] == 'w') { db┆ 0x04f200…09e600 6d 72 65 77 69 6e 64 28 6d 79 64 62 29 3b 0a 09 20 20 20 20 77 68 69 6c 65 20 28 64 62 6d 6e 65 ┆mrewind(mydb); while (dbmne┆ 0x04f200…09e600 78 74 28 6d 79 64 62 2c 20 21 6d 79 64 62 2d 3e 64 62 72 64 6f 6e 6c 79 29 20 21 3d 20 46 41 49 ┆xt(mydb, !mydb->dbrdonly) != FAI┆ 0x04f200…09e600 4c 29 0a 09 20 20 20 20 7b 0a 09 09 63 68 61 72 09 2a 63 6f 6e 74 65 6e 74 3b 0a 09 09 75 6e 73 ┆L) { char *content; uns┆ 0x04f200…09e600 69 67 6e 65 64 20 69 6e 74 20 63 6c 65 6e 3b 0a 0a 09 09 63 6f 6e 74 65 6e 74 20 3d 20 64 62 6d ┆igned int clen; content = dbm┆ 0x04f200…09e600 67 65 74 28 26 63 6c 65 6e 2c 20 6d 79 64 62 29 3b 0a 09 09 63 6f 6e 74 65 6e 74 5b 63 6c 65 6e ┆get(&clen, mydb); content[clen┆ 0x04f200…09e600 5d 20 3d 20 27 5c 30 27 3b 0a 09 09 28 76 6f 69 64 29 20 70 72 69 6e 74 66 28 22 25 73 3a 20 25 ┆] = '\0'; (void) printf("%s: %┆ 0x04f200…09e600 73 5c 6e 22 2c 20 6d 79 64 62 2d 3e 63 75 72 72 65 6e 74 2e 64 70 74 72 2c 20 63 6f 6e 74 65 6e ┆s\n", mydb->current.dptr, conten┆ 0x04f200…09e600 74 29 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 65 6c 73 65 20 69 66 20 28 63 6d 64 6c 69 6e 65 5b ┆t); } } else if (cmdline[┆ 0x04f200…09e600 30 5d 20 3d 3d 20 27 74 27 29 0a 09 20 20 20 20 64 62 6d 74 72 75 6e 63 28 6d 79 64 62 29 3b 0a ┆0] == 't') dbmtrunc(mydb); ┆ 0x04f200…09e600 09 65 6c 73 65 20 69 66 20 28 63 6d 64 6c 69 6e 65 5b 30 5d 20 3d 3d 20 27 21 27 29 0a 09 7b 0a ┆ else if (cmdline[0] == '!') { ┆ 0x04f200…09e600 09 20 20 20 20 28 76 6f 69 64 29 20 73 79 73 74 65 6d 28 63 6d 64 6c 69 6e 65 20 2b 20 31 29 3b ┆ (void) system(cmdline + 1);┆ 0x04f200…09e600 0a 09 20 20 20 20 28 76 6f 69 64 29 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b 09 2f 2a 20 ┆ (void) fflush(stdout); /* ┆ 0x04f200…09e600 56 37 20 73 79 73 74 65 6d 28 29 20 64 6f 65 73 6e 27 74 20 66 6c 75 73 68 20 73 74 64 6f 75 74 ┆V7 system() doesn't flush stdout┆ 0x04f200…09e600 20 2a 2f 0a 09 7d 0a 09 65 6c 73 65 20 69 66 20 28 63 6d 64 6c 69 6e 65 5b 30 5d 20 3d 3d 20 27 ┆ */ } else if (cmdline[0] == '┆ 0x04f200…09e600 3f 27 29 0a 09 7b 0a 09 20 20 20 20 28 76 6f 69 64 29 20 70 72 69 6e 74 66 28 22 6f 20 6e 61 6d ┆?') { (void) printf("o nam┆ 0x04f200…09e600 65 20 20 20 20 2d 2d 20 6f 70 65 6e 20 6e 61 6d 65 64 20 64 61 74 61 62 61 73 65 5c 6e 22 29 3b ┆e -- open named database\n");┆ 0x04f200…09e600 0a 09 20 20 20 20 28 76 6f 69 64 29 20 70 72 69 6e 74 66 28 22 67 20 6b 65 79 20 20 20 20 20 2d ┆ (void) printf("g key -┆ 0x04f200…09e600 2d 20 73 65 65 20 76 61 6c 75 65 20 6f 66 20 6b 65 79 20 3c 6b 65 79 3e 5c 6e 22 29 3b 0a 09 20 ┆- see value of key <key>\n"); ┆ 0x04f200…09e600 20 20 20 28 76 6f 69 64 29 20 70 72 69 6e 74 66 28 22 70 20 6b 65 79 20 76 61 6c 20 2d 2d 20 73 ┆ (void) printf("p key val -- s┆ 0x04f200…09e600 65 74 20 76 61 6c 75 65 20 6f 66 20 6b 65 79 20 3c 6b 65 79 3e 5c 6e 22 29 3b 0a 09 20 20 20 20 ┆et value of key <key>\n"); ┆ 0x04f200…09e600 28 76 6f 69 64 29 20 70 72 69 6e 74 66 28 22 64 20 20 20 20 20 20 20 20 20 2d 2d 20 64 65 6c 65 ┆(void) printf("d -- dele┆ 0x04f200…09e600 74 65 20 63 75 72 72 65 6e 74 20 64 61 74 75 6d 5c 6e 22 29 3b 0a 09 20 20 20 20 28 76 6f 69 64 ┆te current datum\n"); (void┆ 0x04f200…09e600 29 20 70 72 69 6e 74 66 28 22 72 20 20 20 20 20 20 20 20 20 2d 2d 20 72 65 77 69 6e 64 20 74 6f ┆) printf("r -- rewind to┆ 0x04f200…09e600 20 66 69 72 73 74 20 64 61 74 75 6d 5c 6e 22 29 3b 0a 09 20 20 20 20 28 76 6f 69 64 29 20 70 72 ┆ first datum\n"); (void) pr┆ 0x04f200…09e600 69 6e 74 66 28 22 6e 2c 5c 5c 6e 20 20 20 20 20 20 2d 2d 20 73 74 65 70 20 74 6f 20 6e 65 78 74 ┆intf("n,\\n -- step to next┆ 0x04f200…09e600 20 64 61 74 75 6d 5c 6e 22 29 3b 0a 23 69 66 64 65 66 20 4c 4f 43 4b 46 0a 09 20 20 20 20 28 76 ┆ datum\n"); #ifdef LOCKF (v┆ 0x04f200…09e600 6f 69 64 29 20 70 72 69 6e 74 66 28 22 75 20 20 20 20 20 20 20 20 20 2d 2d 20 75 6e 6c 6f 63 6b ┆oid) printf("u -- unlock┆ 0x04f200…09e600 20 63 75 72 72 65 6e 74 20 69 74 65 6d 5c 6e 22 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 4c 4f 43 ┆ current item\n"); #endif /* LOC┆ 0x04f200…09e600 4b 46 20 2a 2f 0a 09 20 20 20 20 28 76 6f 69 64 29 20 70 72 69 6e 74 66 28 22 77 20 20 20 20 20 ┆KF */ (void) printf("w ┆ 0x04f200…09e600 20 20 20 20 2d 2d 20 6c 69 73 74 20 61 6c 6c 20 6b 65 79 2d 63 6f 6e 74 65 6e 74 20 70 61 69 72 ┆ -- list all key-content pair┆ 0x04f200…09e600 73 5c 6e 22 29 3b 0a 09 20 20 20 20 28 76 6f 69 64 29 20 70 72 69 6e 74 66 28 22 74 20 20 20 20 ┆s\n"); (void) printf("t ┆ 0x04f200…09e600 20 20 20 20 20 2d 2d 20 74 72 75 6e 63 61 74 65 20 64 61 74 61 62 61 73 65 5c 6e 22 29 3b 0a 0a ┆ -- truncate database\n"); ┆ 0x04f200…09e600 09 20 20 20 20 28 76 6f 69 64 29 20 70 72 69 6e 74 66 28 22 78 20 20 20 20 20 20 20 20 20 2d 2d ┆ (void) printf("x --┆ 0x04f200…09e600 20 65 78 69 74 20 28 63 6c 6f 73 65 20 64 61 74 61 62 61 73 65 29 5c 6e 22 29 3b 0a 09 20 20 20 ┆ exit (close database)\n"); ┆ 0x04f200…09e600 20 28 76 6f 69 64 29 20 70 72 69 6e 74 66 28 22 71 20 20 20 20 20 20 20 20 20 2d 2d 20 71 75 69 ┆ (void) printf("q -- qui┆ 0x04f200…09e600 74 5c 6e 5c 6e 22 29 3b 0a 0a 09 20 20 20 20 28 76 6f 69 64 29 20 70 72 69 6e 74 66 28 22 21 20 ┆t\n\n"); (void) printf("! ┆ 0x04f200…09e600 63 6d 64 20 20 20 20 20 2d 2d 20 65 78 65 63 75 74 65 20 73 68 65 6c 6c 20 63 6f 6d 6d 61 6e 64 ┆cmd -- execute shell command┆ 0x04f200…09e600 5c 6e 22 29 3b 0a 09 20 20 20 20 28 76 6f 69 64 29 20 70 72 69 6e 74 66 28 22 3f 20 20 20 20 20 ┆\n"); (void) printf("? ┆ 0x04f200…09e600 20 20 20 20 2d 2d 20 70 72 69 6e 74 20 74 68 69 73 20 68 65 6c 70 20 6d 65 73 73 61 67 65 5c 6e ┆ -- print this help message\n┆ 0x04f200…09e600 22 29 3b 0a 09 7d 0a 09 65 6c 73 65 0a 09 20 20 20 20 28 76 6f 69 64 29 20 70 72 69 6e 74 66 28 ┆"); } else (void) printf(┆ 0x04f200…09e600 22 49 6c 6c 65 67 61 6c 20 63 6f 6d 6d 61 6e 64 20 2d 2d 20 74 79 70 65 20 3f 20 66 6f 72 20 68 ┆"Illegal command -- type ? for h┆ 0x04f200…09e600 65 6c 70 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4d 41 49 4e 20 ┆elp\n"); } } #endif /* MAIN ┆ 0x04f200…09e600 2a 2f 0a 0a 2f 2a 20 65 64 62 6d 2e 63 20 65 6e 64 73 20 68 65 72 65 20 2a 2f 0a 6e 6c 6f 63 6b ┆*/ /* edbm.c ends here */ nlock┆ 0x04f200…09e600 20 63 75 72 72 65 6e 74 20 69 74 65 6d 5c 6e 22 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 4c 4f 43 ┆ current item\n"); #endif /* LOC┆ 0x04f200…09e600 4b 46 20 2a 2f 0a 09 20 20 20 20 28 76 6f 69 64 29 20 70 72 69 6e 74 66 28 22 77 20 20 20 20 20 ┆KF */ (void) printf("w ┆ 0x04f200…09e600 20 20 20 20 2d 2d 20 6c 69 73 74 20 61 6c 6c 20 6b 65 79 2d 63 6f 6e 74 65 6e 74 20 70 61 69 72 ┆ -- list all key-content pair┆ 0x04f200…09e600 73 5c 6e 22 29 3b 0a 09 20 20 20 20 28 76 6f 69 64 29 20 70 72 69 6e 74 66 28 22 74 20 20 20 20 ┆s\n"); (void) printf("t ┆ 0x04f200…09e600 20 20 20 20 20 2d 2d 20 74 72 75 6e 63 61 74 65 20 64 61 74 61 62 61 73 65 5c 6e 22 29 3b 0a 0a ┆ -- truncate database\n"); ┆ 0x04f200…09e600 09 20 20 20 20 28 76 6f 69 64 29 20 70 72 69 6e 74 66 28 22 78 20 20 20 20 20 20 20 20 20 2d 2d ┆ (void) printf("x --┆ 0x04f200…09e600 20 65 78 69 74 20 28 63 6c 6f 73 65 20 64 61 74 61 62 61 73 65 29 5c 6e 22 29 3b 0a 09 20 20 20 ┆ exit (close database)\n"); ┆ 0x04f200…09e600 20 28 76 6f 69 64 29 20 70 72 69 6e 74 66 28 22 71 20 20 20 20 20 20 20 20 20 2d 2d 20 71 75 69 ┆ (void) printf("q -- qui┆ 0x04f200…09e600 74 5c 6e 5c 6e 22 29 3b 0a 0a 09 20 20 20 20 28 76 6f 69 64 29 20 70 72 69 6e 74 66 28 22 21 20 ┆t\n\n"); (void) printf("! ┆ 0x04f200…09e600 63 6d 64 20 20 20 20 20 2d 2d 20 65 78 65 63 75 74 65 20 73 68 65 6c 6c 20 63 6f 6d 6d 61 6e 64 ┆cmd -- execute shell command┆ 0x04f200…09e600 5c 6e 22 29 3b 0a 09 20 20 20 20 28 76 6f 69 64 29 20 70 72 69 6e 74 66 28 22 3f 20 20 20 20 20 ┆\n"); (void) printf("? ┆ 0x04f200…09e600 20 20 20 20 2d 2d 20 70 72 69 6e 74 20 74 68 69 73 20 68 65 6c 70 20 6d 65 73 73 61 67 65 5c 6e ┆ -- print this help message\n┆ 0x04f200…09e600 22 29 3b 0a 09 7d 0a 09 65 6c 73 65 0a 09 20 20 20 20 28 76 6f 69 64 29 20 70 72 69 6e 74 66 28 ┆"); } else (void) printf(┆ 0x04f200…09e600 22 49 6c 6c 65 67 61 6c 20 63 6f 6d 6d 61 6e 64 20 2d 2d 20 74 79 70 65 20 3f 20 66 6f 72 20 68 ┆"Illegal command -- type ? for h┆ 0x04f200…09e600 65 6c 70 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4d 41 49 4e 20 ┆elp\n"); } } #endif /* MAIN ┆ 0x04f200…09e600 2a 2f 0a 0a 2f 2a 20 65 64 62 6d 2e 63 20 65 6e 64 73 72 63 2f 44 2e 70 6f 72 74 2f 65 64 62 6d ┆*/ /* edbm.c endsrc/D.port/edbm┆ 0x04f200…09e600 2e 68 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆.h ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆ ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 20 20 20 34 34 34 20 00 20 20 20 ┆ 444 ┆ 0x04f200…09e600 31 34 35 20 00 20 20 20 20 20 31 20 00 20 20 20 20 20 20 20 32 34 35 32 20 20 34 34 35 36 31 35 ┆145 1 2452 445615┆ 0x04f200…09e600 34 30 35 32 20 20 20 37 31 30 33 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆4052 7103 ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆ ┆ […0x9…] 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 2f 2a 20 65 64 62 6d 2e 68 20 2d 2d 20 69 6e ┆ /* edbm.h -- in┆ 0x04f200…09e600 74 65 72 66 61 63 65 20 74 6f 20 67 65 6e 65 72 69 63 20 64 61 74 61 62 61 73 65 20 6d 61 6e 61 ┆terface to generic database mana┆ 0x04f200…09e600 67 65 6d 65 6e 74 20 72 6f 75 74 69 6e 65 73 20 2a 2f 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75 ┆gement routines */ typedef stru┆ 0x04f200…09e600 63 74 0a 7b 0a 20 20 20 20 63 68 61 72 09 2a 64 70 74 72 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 ┆ct { char *dptr; unsigne┆ 0x04f200…09e600 64 09 64 73 69 7a 65 3b 0a 20 20 20 20 6c 6f 6e 67 09 64 61 64 64 72 65 73 73 2c 20 64 6c 65 6e ┆d dsize; long daddress, dlen┆ 0x04f200…09e600 67 74 68 3b 0a 7d 0a 64 61 74 75 6d 3b 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 0a 7b 0a ┆gth; } datum; typedef struct { ┆ 0x04f200…09e600 20 20 20 20 69 6e 74 09 20 20 20 20 64 69 72 66 3b 09 2f 2a 20 66 69 6c 65 20 64 65 73 63 72 69 ┆ int dirf; /* file descri┆ 0x04f200…09e600 70 74 6f 72 20 6f 66 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 ┆ptor of the directory file */ ┆ 0x04f200…09e600 20 20 69 6e 74 20 20 20 20 20 70 61 67 66 3b 09 2f 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 ┆ int pagf; /* file descript┆ 0x04f200…09e600 6f 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 20 ┆or of the page file */ int ┆ 0x04f200…09e600 20 20 20 64 61 74 66 3b 09 2f 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f 66 20 74 ┆ datf; /* file descriptor of t┆ 0x04f200…09e600 68 65 20 64 61 74 61 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 20 20 20 2a 64 62 6e ┆he data file */ char *dbn┆ 0x04f200…09e600 6d 3b 09 2f 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 63 ┆m; /* the database name */ c┆ 0x04f200…09e600 68 61 72 20 20 20 20 2a 64 69 72 6e 6d 3b 09 2f 2a 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 ┆har *dirnm; /* the directory ┆ 0x04f200…09e600 66 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 20 20 20 2a 64 61 74 6e 6d 3b ┆file name */ char *datnm;┆ 0x04f200…09e600 09 2f 2a 20 74 68 65 20 64 61 74 61 20 66 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 63 68 ┆ /* the data file name */ ch┆ 0x04f200…09e600 61 72 20 20 20 20 2a 70 61 67 6e 6d 3b 09 2f 2a 20 74 68 65 20 70 61 67 65 20 66 69 6c 65 20 6e ┆ar *pagnm; /* the page file n┆ 0x04f200…09e600 61 6d 65 20 2a 2f 0a 20 20 20 20 69 6e 74 09 20 20 20 20 64 62 72 64 6f 6e 6c 79 3b 09 2f 2a 20 ┆ame */ int dbrdonly; /* ┆ 0x04f200…09e600 54 52 55 45 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 74 6f 20 62 65 20 72 65 ┆TRUE if the database is to be re┆ 0x04f200…09e600 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 0a 20 20 20 20 64 61 74 75 6d 20 20 20 63 75 72 72 65 6e 74 3b ┆ad-only */ datum current;┆ 0x04f200…09e600 09 2f 2a 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79 2d 73 65 6c 65 63 74 65 64 20 64 61 74 75 6d ┆ /* the currently-selected datum┆ 0x04f200…09e600 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 20 20 20 2a 66 72 65 65 70 74 72 3b 09 2f 2a 20 63 6f 6e ┆ */ char *freeptr; /* con┆ 0x04f200…09e600 74 65 6e 74 20 6f 66 20 74 68 65 20 64 61 74 75 6d 20 28 73 6f 20 77 65 20 63 61 6e 20 66 72 65 ┆tent of the datum (so we can fre┆ 0x04f200…09e600 65 20 69 74 20 6c 61 74 65 72 29 20 2a 2f 0a 0a 20 20 20 20 6c 6f 6e 67 20 20 20 20 62 69 74 6e ┆e it later) */ long bitn┆ 0x04f200…09e600 6f 3b 0a 20 20 20 20 6c 6f 6e 67 20 20 20 20 6d 61 78 62 6e 6f 3b 0a 20 20 20 20 6c 6f 6e 67 20 ┆o; long maxbno; long ┆ 0x04f200…09e600 20 20 20 62 6c 6b 6e 6f 3b 0a 20 20 20 20 6c 6f 6e 67 20 20 20 20 68 6d 61 73 6b 3b 0a 0a 20 20 ┆ blkno; long hmask; ┆ 0x04f200…09e600 20 20 6c 6f 6e 67 20 20 20 20 6f 6c 64 70 61 67 62 3b 0a 20 20 20 20 6c 6f 6e 67 20 20 20 20 6f ┆ long oldpagb; long o┆ 0x04f200…09e600 6c 64 64 69 72 62 3b 0a 23 64 65 66 69 6e 65 09 50 42 4c 4b 53 49 5a 09 34 30 39 36 09 09 2f 2a ┆lddirb; #define PBLKSIZ 4096 /*┆ 0x04f200…09e600 20 70 61 67 65 20 62 6c 6f 63 6b 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 20 20 20 ┆ page block size */ char ┆ 0x04f200…09e600 70 61 67 62 75 66 5b 50 42 4c 4b 53 49 5a 5d 3b 0a 23 64 65 66 69 6e 65 09 44 42 4c 4b 53 49 5a ┆pagbuf[PBLKSIZ]; #define DBLKSIZ┆ 0x04f200…09e600 09 34 30 39 36 09 09 2f 2a 20 64 69 72 65 63 74 6f 72 79 20 62 6c 6f 63 6b 20 73 69 7a 65 20 2a ┆ 4096 /* directory block size *┆ 0x04f200…09e600 2f 0a 20 20 20 20 63 68 61 72 20 20 20 20 64 69 72 62 75 66 5b 44 42 4c 4b 53 49 5a 5d 3b 0a 7d ┆/ char dirbuf[DBLKSIZ]; }┆ 0x04f200…09e600 0a 64 61 74 61 62 61 73 65 3b 0a 0a 65 78 74 65 72 6e 20 76 6f 69 64 20 64 62 6d 74 72 75 6e 63 ┆ database; extern void dbmtrunc┆ 0x04f200…09e600 28 29 3b 0a 65 78 74 65 72 6e 20 64 61 74 61 62 61 73 65 20 2a 64 62 6d 6f 70 65 6e 28 29 3b 0a ┆(); extern database *dbmopen(); ┆ 0x04f200…09e600 65 78 74 65 72 6e 20 69 6e 74 20 64 62 6d 73 65 65 6b 28 29 3b 0a 65 78 74 65 72 6e 20 69 6e 74 ┆extern int dbmseek(); extern int┆ 0x04f200…09e600 20 64 62 6d 64 65 6c 65 74 65 28 29 3b 0a 65 78 74 65 72 6e 20 76 6f 69 64 20 64 62 6d 72 65 77 ┆ dbmdelete(); extern void dbmrew┆ 0x04f200…09e600 69 6e 64 28 29 3b 0a 65 78 74 65 72 6e 20 69 6e 74 20 64 62 6d 6e 65 78 74 28 29 3b 0a 65 78 74 ┆ind(); extern int dbmnext(); ext┆ 0x04f200…09e600 65 72 6e 20 69 6e 74 20 64 62 6d 70 75 74 28 29 3b 0a 65 78 74 65 72 6e 20 63 68 61 72 20 2a 64 ┆ern int dbmput(); extern char *d┆ 0x04f200…09e600 62 6d 67 65 74 28 29 3b 0a 65 78 74 65 72 6e 20 76 6f 69 64 20 64 62 6d 75 6e 6c 6f 63 6b 28 29 ┆bmget(); extern void dbmunlock()┆ 0x04f200…09e600 3b 0a 65 78 74 65 72 6e 20 76 6f 69 64 20 64 62 6d 63 6c 6f 73 65 28 29 3b 0a 0a 23 64 65 66 69 ┆; extern void dbmclose(); #defi┆ 0x04f200…09e600 6e 65 20 64 62 6d 6b 65 79 28 64 62 29 09 28 28 64 62 29 2d 3e 63 75 72 72 65 6e 74 2e 64 70 74 ┆ne dbmkey(db) ((db)->current.dpt┆ 0x04f200…09e600 72 29 0a 0a 2f 2a 20 65 64 62 6d 2e 68 20 65 6e 64 73 20 68 65 72 65 20 2a 2f 0a 3b 0a 0a 20 20 ┆r) /* edbm.h ends here */ ; ┆ 0x04f200…09e600 20 20 6c 6f 6e 67 20 20 20 20 6f 6c 64 70 61 67 62 3b 0a 20 20 20 20 6c 6f 6e 67 20 20 20 20 6f ┆ long oldpagb; long o┆ 0x04f200…09e600 6c 64 64 69 72 62 3b 0a 23 64 65 66 69 6e 65 09 50 42 4c 4b 53 49 5a 09 34 30 39 36 09 09 2f 2a ┆lddirb; #define PBLKSIZ 4096 /*┆ 0x04f200…09e600 20 70 61 67 65 20 62 6c 6f 63 6b 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 20 20 20 ┆ page block size */ char ┆ 0x04f200…09e600 70 61 67 62 75 66 5b 50 42 4c 4b 53 49 5a 5d 3b 0a 23 64 65 66 69 6e 65 09 44 42 4c 4b 53 49 5a ┆pagbuf[PBLKSIZ]; #define DBLKSIZ┆ 0x04f200…09e600 09 34 30 39 36 09 09 2f 2a 20 64 69 72 65 63 74 6f 72 79 20 62 6c 6f 63 6b 20 73 69 7a 65 20 2a ┆ 4096 /* directory block size *┆ 0x04f200…09e600 2f 0a 20 20 20 20 63 68 61 72 20 20 20 20 64 69 72 62 75 66 5b 44 42 4c 4b 53 49 5a 5d 3b 0a 7d ┆/ char dirbuf[DBLKSIZ]; }┆ 0x04f200…09e600 0a 64 61 74 61 62 61 73 65 3b 0a 0a 65 78 74 65 72 73 72 63 2f 44 2e 70 6f 72 74 2f 65 6e 76 69 ┆ database; extersrc/D.port/envi┆ 0x04f200…09e600 72 6f 6e 2e 63 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆ron.c ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆ ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 20 20 20 34 34 34 20 00 20 20 20 ┆ 444 ┆ 0x04f200…09e600 31 34 35 20 00 20 20 20 20 20 31 20 00 20 20 20 20 20 20 20 37 36 34 36 20 20 34 34 35 36 31 35 ┆145 1 7646 445615┆ 0x04f200…09e600 34 30 35 33 20 20 20 37 36 36 32 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆4053 7662 ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆ ┆ […0x9…] 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆ /**************┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆********************************┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a ┆******************************* ┆ 0x04f200…09e600 0a 4e 41 4d 45 0a 20 20 20 65 6e 76 69 72 6f 6e 2e 63 20 2d 2d 20 67 65 6e 65 72 61 6c 20 65 6e ┆ NAME environ.c -- general en┆ 0x04f200…09e600 76 69 72 6f 6e 6d 65 6e 74 20 6d 61 6e 69 70 75 6c 61 74 69 6f 6e 0a 0a 53 59 4e 4f 50 53 49 53 ┆vironment manipulation SYNOPSIS┆ 0x04f200…09e600 0a 20 20 20 20 62 6f 6f 6c 20 73 65 74 65 6e 76 28 76 61 72 2c 20 76 61 6c 29 09 2d 2d 20 73 65 ┆ bool setenv(var, val) -- se┆ 0x04f200…09e600 74 20 61 20 76 61 72 69 61 62 6c 65 20 69 6e 20 74 68 65 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 0a ┆t a variable in the environment ┆ 0x04f200…09e600 20 20 20 20 63 68 61 72 20 2a 76 61 72 2c 20 76 61 6c 3b 0a 0a 20 20 20 20 62 6f 6f 6c 20 64 65 ┆ char *var, val; bool de┆ 0x04f200…09e600 6c 65 6e 76 28 76 61 72 29 09 09 2d 2d 20 64 65 6c 65 74 65 20 61 20 76 61 72 69 61 62 6c 65 0a ┆lenv(var) -- delete a variable ┆ 0x04f200…09e600 20 20 20 20 63 68 61 72 20 2a 76 61 72 2c 0a 0a 44 45 53 43 52 49 50 54 49 4f 4e 0a 20 20 20 20 ┆ char *var, DESCRIPTION ┆ 0x04f200…09e600 54 68 65 73 65 20 66 75 6e 63 74 69 6f 6e 73 20 6d 6f 64 69 66 79 20 74 68 65 20 65 6e 76 69 72 ┆These functions modify the envir┆ 0x04f200…09e600 6f 6e 6d 65 6e 74 20 73 65 65 6e 20 62 79 20 70 72 6f 67 72 61 6d 73 20 65 78 65 63 75 74 69 6e ┆onment seen by programs executin┆ 0x04f200…09e600 67 20 61 74 20 61 6e 64 0a 75 6e 64 65 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 68 65 6c 6c ┆g at and under the current shell┆ 0x04f200…09e600 2e 20 54 68 65 79 20 62 6f 74 68 20 72 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 76 ┆. They both return TRUE if the v┆ 0x04f200…09e600 61 72 69 61 62 6c 65 20 62 65 69 6e 67 0a 6d 61 6e 69 70 75 6c 61 74 65 64 20 77 61 73 20 64 65 ┆ariable being manipulated was de┆ 0x04f200…09e600 66 69 6e 65 64 20 62 65 66 6f 72 65 20 74 68 65 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 2c 20 46 ┆fined before the modification, F┆ 0x04f200…09e600 41 4c 53 45 20 6f 74 68 65 72 77 69 73 65 2e 0a 0a 4e 4f 54 45 0a 20 20 20 54 68 65 73 65 20 66 ┆ALSE otherwise. NOTE These f┆ 0x04f200…09e600 75 6e 63 74 69 6f 6e 73 20 75 73 65 20 6d 61 6c 6c 6f 63 28 33 29 2e 20 54 68 65 20 73 70 61 63 ┆unctions use malloc(3). The spac┆ 0x04f200…09e600 65 20 75 73 65 64 20 62 79 20 6f 6c 64 20 76 61 72 69 61 62 6c 65 20 64 65 66 69 6e 69 74 69 6f ┆e used by old variable definitio┆ 0x04f200…09e600 6e 73 0a 69 73 20 6e 6f 74 20 72 65 63 6c 61 69 6d 65 64 20 77 68 65 6e 20 61 20 6e 65 77 20 6f ┆ns is not reclaimed when a new o┆ 0x04f200…09e600 6e 65 20 69 73 20 77 72 69 74 74 65 6e 20 6f 72 20 61 20 64 65 6c 65 74 65 20 69 73 20 70 65 72 ┆ne is written or a delete is per┆ 0x04f200…09e600 66 6f 72 6d 65 64 2e 0a 0a 53 45 45 20 41 4c 53 4f 0a 20 20 20 67 65 74 65 6e 76 28 33 29 09 09 ┆formed. SEE ALSO getenv(3) ┆ 0x04f200…09e600 2d 2d 20 67 65 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61 6e 20 65 6e 76 69 72 6f 6e 6d 65 ┆-- get the value of an environme┆ 0x04f200…09e600 6e 74 20 76 61 72 69 61 62 6c 65 0a 0a 52 45 56 49 53 45 44 20 42 59 0a 20 20 20 45 72 69 63 20 ┆nt variable REVISED BY Eric ┆ 0x04f200…09e600 53 2e 20 52 61 79 6d 6f 6e 64 0a 66 72 6f 6d 20 6f 72 69 67 69 6e 61 6c 20 63 6f 64 65 20 70 6f ┆S. Raymond from original code po┆ 0x04f200…09e600 73 74 65 64 20 62 79 20 52 6f 6e 20 4e 61 74 61 6c 69 65 2e 0a 20 20 20 54 68 69 73 20 73 6f 66 ┆sted by Ron Natalie. This sof┆ 0x04f200…09e600 74 77 61 72 65 20 69 73 20 43 6f 70 79 72 69 67 68 74 20 28 43 29 20 31 39 38 39 20 62 79 20 45 ┆tware is Copyright (C) 1989 by E┆ 0x04f200…09e600 72 69 63 20 53 2e 20 52 61 79 6d 6f 6e 64 20 66 6f 72 20 74 68 65 20 73 6f 6c 65 20 70 75 72 70 ┆ric S. Raymond for the sole purp┆ 0x04f200…09e600 6f 73 65 0a 6f 66 20 70 72 6f 74 65 63 74 69 6e 67 20 66 72 65 65 20 72 65 64 69 73 74 72 69 62 ┆ose of protecting free redistrib┆ 0x04f200…09e600 75 74 69 6f 6e 3b 20 73 65 65 20 74 68 65 20 4c 49 43 45 4e 53 45 20 66 69 6c 65 20 66 6f 72 20 ┆ution; see the LICENSE file for ┆ 0x04f200…09e600 64 65 74 61 69 6c 73 2e 0a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆details. **********************┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆********************************┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 20 4c 49 4e 54 ┆***********************/ /* LINT┆ 0x04f200…09e600 4c 49 42 52 41 52 59 20 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 6c 69 62 70 6f 72 74 2e 68 22 0a ┆LIBRARY */ #include "libport.h" ┆ 0x04f200…09e600 0a 65 78 74 65 72 6e 20 63 68 61 72 20 2a 2a 65 6e 76 69 72 6f 6e 3b 09 09 20 20 20 20 2f 2a 20 ┆ extern char **environ; /* ┆ 0x04f200…09e600 20 50 6f 69 6e 74 65 72 20 74 6f 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 2c 20 73 65 74 20 62 79 20 ┆ Pointer to environment, set by ┆ 0x04f200…09e600 63 72 74 30 0a 09 09 09 09 20 20 20 20 20 2a 20 20 75 73 65 64 20 62 79 20 65 78 65 63 76 2c 20 ┆crt0 * used by execv, ┆ 0x04f200…09e600 65 78 65 63 6c 0a 09 09 09 09 20 20 20 20 20 2a 2f 0a 73 74 61 74 69 63 20 62 6f 6f 6c 20 5f 73 ┆execl */ static bool _s┆ 0x04f200…09e600 65 74 5f 65 6e 76 20 3d 20 46 41 4c 53 45 3b 09 20 20 20 20 2f 2a 20 20 57 68 65 6e 20 46 41 4c ┆et_env = FALSE; /* When FAL┆ 0x04f200…09e600 53 45 2c 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65 20 65 6e 76 69 72 6f 6e 0a 09 ┆SE, indicates that the environ ┆ 0x04f200…09e600 09 09 09 20 20 20 20 20 2a 20 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 ┆ * points to the origina┆ 0x04f200…09e600 6c 20 73 74 61 63 6b 20 72 65 73 69 64 65 6e 74 0a 09 09 09 09 20 20 20 20 20 2a 20 20 65 6e 76 ┆l stack resident * env┆ 0x04f200…09e600 69 72 6f 6e 6d 65 6e 74 2e 20 20 57 65 20 73 65 74 20 69 74 20 74 6f 20 54 52 55 45 20 73 6f 20 ┆ironment. We set it to TRUE so ┆ 0x04f200…09e600 74 68 61 74 0a 09 09 09 09 20 20 20 20 20 2a 20 20 77 65 20 63 61 6e 20 66 72 65 65 20 6d 65 6d ┆that * we can free mem┆ 0x04f200…09e600 6f 72 79 20 77 65 20 6d 61 6c 6c 6f 63 27 64 20 6f 6e 0a 09 09 09 09 20 20 20 20 20 2a 20 20 73 ┆ory we malloc'd on * s┆ 0x04f200…09e600 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 73 65 74 65 6e 76 2e 0a 09 09 09 09 20 ┆ubsequent calls to setenv. ┆ 0x04f200…09e600 20 20 20 20 2a 2f 0a 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 2a 66 69 6e 64 65 6e 76 28 76 61 ┆ */ static char **findenv(va┆ 0x04f200…09e600 72 29 0a 2f 2a 20 73 65 61 72 63 68 20 74 68 65 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 66 6f 72 ┆r) /* search the environment for┆ 0x04f200…09e600 20 74 68 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f 66 20 61 20 67 69 76 65 6e 20 76 61 72 69 61 ┆ the definition of a given varia┆ 0x04f200…09e600 62 6c 65 20 2a 2f 0a 63 68 61 72 09 2a 76 61 72 3b 0a 7b 0a 20 20 20 20 72 65 67 69 73 74 65 72 ┆ble */ char *var; { register┆ 0x04f200…09e600 20 63 68 61 72 09 2a 2a 65 3b 0a 20 20 20 20 69 6e 74 09 09 09 6c 65 6e 20 3d 20 73 74 72 6c 65 ┆ char **e; int len = strle┆ 0x04f200…09e600 6e 28 76 61 72 29 3b 0a 0a 20 20 20 20 66 6f 72 20 28 65 20 3d 20 65 6e 76 69 72 6f 6e 3b 20 2a ┆n(var); for (e = environ; *┆ 0x04f200…09e600 65 3b 20 65 2b 2b 29 0a 20 20 20 20 7b 0a 09 69 66 20 28 73 74 72 6e 63 6d 70 28 76 61 72 2c 20 ┆e; e++) { if (strncmp(var, ┆ 0x04f200…09e600 2a 65 2c 20 6c 65 6e 29 20 3d 3d 20 30 29 0a 09 20 20 20 20 72 65 74 75 72 6e 28 65 29 3b 0a 20 ┆*e, len) == 0) return(e); ┆ 0x04f200…09e600 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 28 28 63 68 61 72 20 2a 2a 29 30 29 3b 0a 7d 0a 0a ┆ } return((char **)0); } ┆ 0x04f200…09e600 2f 2a 0a 20 2a 20 20 73 65 74 65 6e 76 20 2d 20 61 64 64 20 61 6e 20 65 6c 65 6d 65 6e 74 20 74 ┆/* * setenv - add an element t┆ 0x04f200…09e600 6f 20 74 68 65 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 0a 20 2a 0a 20 2a 20 20 76 61 72 20 69 73 20 ┆o the environment * * var is ┆ 0x04f200…09e600 61 64 64 65 64 20 74 6f 20 74 68 65 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 2e 20 20 49 74 20 73 68 ┆added to the environment. It sh┆ 0x04f200…09e600 6f 75 6c 64 20 62 65 20 61 20 73 74 72 69 6e 67 20 6f 66 0a 20 2a 20 20 74 68 65 20 66 6f 72 6d ┆ould be a string of * the form┆ 0x04f200…09e600 20 22 4e 41 4d 45 3d 76 61 6c 75 65 22 2e 20 20 4e 6f 74 65 2c 20 74 68 61 74 20 74 68 65 20 61 ┆ "NAME=value". Note, that the a┆ 0x04f200…09e600 63 74 75 61 6c 20 73 74 72 69 6e 67 20 69 73 20 6e 6f 74 0a 20 2a 20 20 63 6f 70 69 65 64 2c 20 ┆ctual string is not * copied, ┆ 0x04f200…09e600 62 75 74 20 61 20 70 6f 69 6e 74 65 72 20 69 73 20 75 73 65 64 2c 20 73 6f 20 62 65 20 63 61 72 ┆but a pointer is used, so be car┆ 0x04f200…09e600 65 66 75 6c 20 6e 6f 74 20 74 6f 20 6f 76 65 72 77 72 69 74 65 0a 20 2a 20 20 69 74 20 62 65 66 ┆eful not to overwrite * it bef┆ 0x04f200…09e600 6f 72 65 20 74 68 65 20 65 78 65 63 2e 20 20 41 6c 73 6f 2c 20 74 68 69 73 20 64 6f 65 73 20 6e ┆ore the exec. Also, this does n┆ 0x04f200…09e600 6f 74 20 63 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 0a 20 2a 20 20 6f 6e 65 20 64 6f ┆ot check to make sure * one do┆ 0x04f200…09e600 65 73 6e 27 74 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 2c 20 73 6f 20 64 65 6c 65 6e 76 20 66 ┆esn't already exist, so delenv f┆ 0x04f200…09e600 69 72 73 74 20 69 66 20 79 6f 75 27 72 65 20 6e 6f 74 20 73 75 72 65 2e 0a 20 2a 2f 0a 62 6f 6f ┆irst if you're not sure. */ boo┆ 0x04f200…09e600 6c 20 73 65 74 65 6e 76 28 76 61 72 2c 20 76 61 6c 29 0a 63 68 61 72 09 2a 76 61 72 2c 20 2a 76 ┆l setenv(var, val) char *var, *v┆ 0x04f200…09e600 61 6c 3b 0a 7b 0a 20 20 20 20 63 68 61 72 09 2a 2a 65 2c 20 2a 2a 6e 3b 0a 20 20 20 20 69 6e 74 ┆al; { char **e, **n; int┆ 0x04f200…09e600 09 09 63 6f 75 6e 74 3b 0a 20 20 20 20 63 68 61 72 09 2a 2a 6e 65 77 3b 0a 0a 20 20 20 20 69 66 ┆ count; char **new; if┆ 0x04f200…09e600 20 28 28 65 20 3d 20 66 69 6e 64 65 6e 76 28 76 61 72 29 29 20 21 3d 20 28 63 68 61 72 20 2a 2a ┆ ((e = findenv(var)) != (char **┆ 0x04f200…09e600 29 30 29 0a 20 20 20 20 7b 0a 09 2f 2a 0a 09 20 2a 20 54 68 65 20 76 61 72 69 61 62 6c 65 20 69 ┆)0) { /* * The variable i┆ 0x04f200…09e600 73 20 61 6c 72 65 61 64 79 20 64 65 66 69 6e 65 64 2e 20 4e 6f 20 6e 65 65 64 20 74 6f 20 63 6f ┆s already defined. No need to co┆ 0x04f200…09e600 70 79 20 6f 76 65 72 20 74 68 65 0a 09 20 2a 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 2c 20 77 65 27 ┆py over the * environment, we'┆ 0x04f200…09e600 6c 6c 20 6a 75 73 74 20 6f 76 65 72 77 72 69 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72 20 74 6f ┆ll just overwrite the pointer to┆ 0x04f200…09e600 20 74 68 65 20 64 65 66 69 6e 69 74 69 6f 6e 2e 0a 09 20 2a 2f 0a 09 2a 65 20 3d 20 6d 61 6c 6c ┆ the definition. */ *e = mall┆ 0x04f200…09e600 6f 63 28 28 75 6e 73 69 67 6e 65 64 29 20 28 73 74 72 6c 65 6e 28 76 61 72 29 20 2b 20 73 74 72 ┆oc((unsigned) (strlen(var) + str┆ 0x04f200…09e600 6c 65 6e 28 76 61 6c 29 20 2b 20 32 2a 73 69 7a 65 6f 66 28 63 68 61 72 29 29 29 3b 0a 09 28 76 ┆len(val) + 2*sizeof(char))); (v┆ 0x04f200…09e600 6f 69 64 29 20 73 70 72 69 6e 74 66 28 2a 65 2c 20 22 25 73 3d 25 73 22 2c 20 76 61 72 2c 20 76 ┆oid) sprintf(*e, "%s=%s", var, v┆ 0x04f200…09e600 61 6c 29 3b 0a 09 72 65 74 75 72 6e 28 54 52 55 45 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c ┆al); return(TRUE); } el┆ 0x04f200…09e600 73 65 0a 20 20 20 20 7b 0a 09 2f 2a 0a 09 20 2a 20 20 57 65 20 6d 75 73 74 20 61 64 64 20 61 20 ┆se { /* * We must add a ┆ 0x04f200…09e600 6e 65 77 20 76 61 72 69 61 62 6c 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 74 6f 20 74 68 65 20 65 ┆new variable definition to the e┆ 0x04f200…09e600 6e 76 69 72 6f 6e 6d 65 6e 74 2e 0a 20 20 20 20 20 20 20 20 20 2a 20 20 43 6f 75 6e 74 20 74 68 ┆nvironment. * Count th┆ 0x04f200…09e600 65 20 6e 75 6d 62 65 72 20 6f 66 20 69 74 65 6d 73 20 69 6e 20 74 68 65 20 65 6e 76 69 72 6f 6e ┆e number of items in the environ┆ 0x04f200…09e600 6d 65 6e 74 20 61 6e 64 20 6d 61 6c 6c 6f 63 0a 09 20 2a 20 20 72 6f 6f 6d 20 66 6f 72 20 61 6c ┆ment and malloc * room for al┆ 0x04f200…09e600 6c 20 74 68 6f 73 65 20 70 6c 75 73 20 74 68 65 20 6f 6e 65 20 77 65 20 61 72 65 20 61 64 64 69 ┆l those plus the one we are addi┆ 0x04f200…09e600 6e 67 2e 0a 09 20 2a 2f 0a 09 66 6f 72 20 28 65 20 3d 20 65 6e 76 69 72 6f 6e 2c 20 63 6f 75 6e ┆ng. */ for (e = environ, coun┆ 0x04f200…09e600 74 20 3d 20 30 3b 20 2a 65 3b 20 65 2b 2b 29 0a 09 20 20 20 20 63 6f 75 6e 74 2b 2b 3b 0a 23 69 ┆t = 0; *e; e++) count++; #i┆ 0x04f200…09e600 66 6e 64 65 66 20 6c 69 6e 74 0a 09 6e 65 77 20 3d 20 28 63 68 61 72 20 2a 2a 29 6d 61 6c 6c 6f ┆fndef lint new = (char **)mallo┆ 0x04f200…09e600 63 28 28 75 6e 73 69 67 6e 65 64 29 20 28 28 63 6f 75 6e 74 2b 32 29 2a 73 69 7a 65 6f 66 20 28 ┆c((unsigned) ((count+2)*sizeof (┆ 0x04f200…09e600 63 68 61 72 20 2a 29 29 29 3b 0a 23 65 6c 73 65 0a 09 6e 65 77 20 3d 20 28 63 68 61 72 20 2a 2a ┆char *))); #else new = (char **┆ 0x04f200…09e600 29 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 6c 69 6e 74 20 2a 2f 0a 0a 09 2f 2a 20 63 6f ┆)NULL; #endif /* lint */ /* co┆ 0x04f200…09e600 70 79 20 6f 76 65 72 20 74 68 65 20 70 6f 69 6e 74 65 72 73 20 66 72 6f 6d 20 74 68 65 20 6f 6c ┆py over the pointers from the ol┆ 0x04f200…09e600 64 20 74 6f 20 74 68 65 20 6e 65 77 20 2a 2f 0a 09 66 6f 72 20 28 65 20 3d 20 65 6e 76 69 72 6f ┆d to the new */ for (e = enviro┆ 0x04f200…09e600 6e 2c 20 6e 20 3d 20 6e 65 77 3b 20 63 6f 75 6e 74 3b 20 63 6f 75 6e 74 2d 2d 29 0a 09 20 20 20 ┆n, n = new; count; count--) ┆ 0x04f200…09e600 20 2a 6e 2b 2b 20 3d 20 2a 65 2b 2b 3b 0a 0a 09 2f 2a 20 6e 6f 77 20 61 64 64 20 74 68 65 20 6e ┆ *n++ = *e++; /* now add the n┆ 0x04f200…09e600 65 77 20 6f 6e 65 20 2a 2f 0a 09 2a 6e 20 3d 20 6d 61 6c 6c 6f 63 28 73 74 72 6c 65 6e 28 76 61 ┆ew one */ *n = malloc(strlen(va┆ 0x04f200…09e600 72 29 20 2b 20 73 74 72 6c 65 6e 28 76 61 6c 29 20 2b 20 32 2a 73 69 7a 65 6f 66 28 63 68 61 72 ┆r) + strlen(val) + 2*sizeof(char┆ 0x04f200…09e600 29 29 3b 0a 09 28 76 6f 69 64 29 20 73 70 72 69 6e 74 66 28 2a 6e 2b 2b 2c 20 22 25 73 3d 25 73 ┆)); (void) sprintf(*n++, "%s=%s┆ 0x04f200…09e600 22 2c 20 76 61 72 2c 20 76 61 6c 29 3b 0a 09 2a 6e 20 3d 20 28 63 68 61 72 20 2a 29 30 3b 0a 0a ┆", var, val); *n = (char *)0; ┆ 0x04f200…09e600 09 2f 2a 0a 09 20 2a 20 20 49 66 20 77 65 20 68 61 64 20 61 6c 6c 6f 63 61 74 65 64 20 74 68 69 ┆ /* * If we had allocated thi┆ 0x04f200…09e600 73 20 65 6e 76 69 72 6f 6e 20 66 72 6f 6d 20 61 20 70 72 65 76 69 6f 75 73 20 63 61 6c 6c 2c 0a ┆s environ from a previous call, ┆ 0x04f200…09e600 09 20 2a 20 20 66 72 65 65 20 69 74 20 6e 6f 77 2e 0a 09 20 2a 2f 0a 09 69 66 20 28 5f 73 65 74 ┆ * free it now. */ if (_set┆ 0x04f200…09e600 5f 65 6e 76 29 0a 09 20 20 20 20 28 76 6f 69 64 29 20 66 72 65 65 28 28 63 68 61 72 20 2a 29 65 ┆_env) (void) free((char *)e┆ 0x04f200…09e600 6e 76 69 72 6f 6e 29 3b 0a 09 65 6c 73 65 0a 09 20 20 20 20 5f 73 65 74 5f 65 6e 76 20 3d 20 54 ┆nviron); else _set_env = T┆ 0x04f200…09e600 52 55 45 3b 0a 09 65 6e 76 69 72 6f 6e 20 3d 20 6e 65 77 3b 0a 09 72 65 74 75 72 6e 28 46 41 4c ┆RUE; environ = new; return(FAL┆ 0x04f200…09e600 53 45 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0a 2f 2a 0a 20 2a 20 20 64 65 6c 65 6e 76 20 2d 20 64 65 ┆SE); } } /* * delenv - de┆ 0x04f200…09e600 6c 65 74 65 20 61 6e 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65 2e 0a 20 2a ┆lete an environment variable. *┆ 0x04f200…09e600 0a 20 2a 20 20 56 61 72 20 73 68 6f 75 6c 64 20 62 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 ┆ * Var should be the name of a┆ 0x04f200…09e600 6e 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65 20 73 75 63 68 20 61 73 20 22 ┆n environment variable such as "┆ 0x04f200…09e600 50 41 54 48 22 0a 20 2a 20 20 4e 6f 74 65 2c 20 74 68 61 74 20 74 68 65 20 73 70 61 63 65 20 69 ┆PATH" * Note, that the space i┆ 0x04f200…09e600 73 20 6e 6f 74 20 72 65 63 6c 61 69 6d 65 64 2c 20 62 75 74 20 74 68 69 73 20 64 6f 65 73 6e 27 ┆s not reclaimed, but this doesn'┆ 0x04f200…09e600 74 20 68 61 70 70 65 6e 20 61 6c 6c 0a 20 2a 20 20 74 68 61 74 20 6d 75 63 68 2e 0a 20 2a 2f 0a ┆t happen all * that much. */ ┆ 0x04f200…09e600 62 6f 6f 6c 20 64 65 6c 65 6e 76 28 76 61 72 29 0a 63 68 61 72 09 2a 76 61 72 3b 0a 7b 0a 20 20 ┆bool delenv(var) char *var; { ┆ 0x04f200…09e600 20 20 63 68 61 72 09 2a 2a 65 3b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 20 43 68 65 63 6b ┆ char **e; /* * Check┆ 0x04f200…09e600 20 74 68 61 74 20 74 68 65 20 67 69 76 65 6e 20 76 61 72 69 61 62 6c 65 20 69 73 20 61 63 74 75 ┆ that the given variable is actu┆ 0x04f200…09e600 61 6c 6c 79 20 64 65 66 69 6e 65 64 3b 20 69 66 20 73 6f 2c 0a 20 20 20 20 20 2a 20 20 6d 6f 76 ┆ally defined; if so, * mov┆ 0x04f200…09e600 65 20 65 76 65 72 79 74 68 69 6e 67 20 61 66 74 65 72 20 69 74 2c 20 69 6e 63 6c 75 64 69 6e 67 ┆e everything after it, including┆ 0x04f200…09e600 20 74 68 65 20 6e 75 6c 6c 20 74 65 72 6d 69 6e 61 74 6f 72 0a 20 20 20 20 20 2a 20 20 64 6f 77 ┆ the null terminator * dow┆ 0x04f200…09e600 6e 20 6f 6e 65 2c 20 6f 62 6c 69 74 65 72 61 74 69 6e 67 20 74 68 65 20 64 65 6c 65 74 65 64 20 ┆n one, obliterating the deleted ┆ 0x04f200…09e600 70 6f 69 6e 74 65 72 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 20 28 28 65 20 3d 20 66 69 ┆pointer. */ if ((e = fi┆ 0x04f200…09e600 6e 64 65 6e 76 28 76 61 72 29 29 20 3d 3d 20 28 63 68 61 72 20 2a 2a 29 30 29 0a 09 72 65 74 75 ┆ndenv(var)) == (char **)0) retu┆ 0x04f200…09e600 72 6e 28 46 41 4c 53 45 29 3b 0a 20 20 20 20 65 6c 73 65 0a 20 20 20 20 7b 0a 09 77 68 69 6c 65 ┆rn(FALSE); else { while┆ 0x04f200…09e600 28 2a 65 29 0a 09 7b 0a 09 20 20 20 20 2a 65 20 3d 20 65 5b 31 5d 3b 0a 09 20 20 20 20 65 2b 2b ┆(*e) { *e = e[1]; e++┆ 0x04f200…09e600 3b 0a 09 7d 0a 09 72 65 74 75 72 6e 28 54 52 55 45 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0a 2f 2a 20 ┆; } return(TRUE); } } /* ┆ 0x04f200…09e600 65 6e 76 69 72 6f 6e 2e 63 20 65 6e 64 73 20 68 65 72 65 20 2a 2f 0a 73 75 63 68 20 61 73 20 22 ┆environ.c ends here */ such as "┆ 0x04f200…09e600 50 41 54 48 22 0a 20 2a 20 20 4e 6f 74 65 2c 20 74 68 61 74 20 74 68 65 20 73 70 61 63 65 20 69 ┆PATH" * Note, that the space i┆ 0x04f200…09e600 73 20 6e 6f 74 20 72 65 63 6c 61 69 6d 65 64 2c 20 62 75 74 20 74 68 69 73 20 64 6f 65 73 6e 27 ┆s not reclaimed, but this doesn'┆ 0x04f200…09e600 74 20 68 61 70 70 65 6e 20 61 6c 6c 0a 20 2a 20 20 73 72 63 2f 44 2e 70 6f 72 74 2f 65 72 72 6d ┆t happen all * src/D.port/errm┆ 0x04f200…09e600 73 67 2e 63 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆sg.c ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆ ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 20 20 20 34 34 34 20 00 20 20 20 ┆ 444 ┆ 0x04f200…09e600 31 34 35 20 00 20 20 20 20 20 31 20 00 20 20 20 20 20 20 20 20 36 31 32 20 20 34 34 35 36 31 35 ┆145 1 612 445615┆ 0x04f200…09e600 34 30 35 30 20 20 20 37 34 34 30 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆4050 7440 ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆ ┆ […0x9…] 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 2f 2a 20 65 72 72 6d 73 67 2e 63 20 2d 2d 20 ┆ /* errmsg.c -- ┆ 0x04f200…09e600 72 65 74 75 72 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 73 74 72 69 6e 67 20 63 6f 72 72 ┆return error message string corr┆ 0x04f200…09e600 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 61 6e 20 65 72 72 6e 6f 20 76 61 6c 75 65 20 2a 2f 0a 2f ┆esponding to an errno value */ /┆ 0x04f200…09e600 2a 20 4c 49 4e 54 4c 49 42 52 41 52 59 20 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 6c 69 62 70 6f ┆* LINTLIBRARY */ #include "libpo┆ 0x04f200…09e600 72 74 2e 68 22 0a 0a 63 68 61 72 20 2a 65 72 72 6d 73 67 28 63 6f 64 65 29 0a 69 6e 74 20 63 6f ┆rt.h" char *errmsg(code) int co┆ 0x04f200…09e600 64 65 3b 0a 7b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 79 73 5f 6e 65 72 72 3b 0a 20 ┆de; { extern int sys_nerr; ┆ 0x04f200…09e600 20 20 20 65 78 74 65 72 6e 20 63 68 61 72 20 2a 73 79 73 5f 65 72 72 6c 69 73 74 5b 5d 3b 0a 20 ┆ extern char *sys_errlist[]; ┆ 0x04f200…09e600 20 20 20 73 74 61 74 69 63 20 63 68 61 72 20 65 62 75 66 5b 36 2b 35 2b 31 5d 3b 0a 0a 20 20 20 ┆ static char ebuf[6+5+1]; ┆ 0x04f200…09e600 20 69 66 20 28 63 6f 64 65 20 3e 20 73 79 73 5f 6e 65 72 72 29 0a 20 20 20 20 7b 0a 09 28 76 6f ┆ if (code > sys_nerr) { (vo┆ 0x04f200…09e600 69 64 29 20 73 70 72 69 6e 74 66 28 65 62 75 66 2c 20 22 45 72 72 6f 72 20 25 64 22 2c 20 63 6f ┆id) sprintf(ebuf, "Error %d", co┆ 0x04f200…09e600 64 65 29 3b 0a 09 72 65 74 75 72 6e 28 65 62 75 66 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c ┆de); return(ebuf); } el┆ 0x04f200…09e600 73 65 0a 09 72 65 74 75 72 6e 28 73 79 73 5f 65 72 72 6c 69 73 74 5b 63 6f 64 65 5d 29 3b 0a 7d ┆se return(sys_errlist[code]); }┆ 0x04f200…09e600 0a 0a 2f 2a 20 65 72 72 6d 73 67 2e 63 20 65 6e 64 73 20 68 65 72 65 20 2a 2f 0a 0a 0a 2f 2a 20 ┆ /* errmsg.c ends here */ /* ┆ 0x04f200…09e600 65 6e 76 69 72 6f 6e 2e 63 20 65 6e 64 73 20 68 65 72 65 20 2a 2f 0a 73 75 63 68 20 61 73 20 22 ┆environ.c ends here */ such as "┆ 0x04f200…09e600 50 41 54 48 22 0a 20 2a 20 20 4e 6f 74 65 2c 20 74 68 61 74 20 74 68 65 20 73 70 61 63 65 20 69 ┆PATH" * Note, that the space i┆ 0x04f200…09e600 73 20 6e 6f 74 20 72 65 63 6c 61 69 6d 65 64 2c 20 62 75 74 20 74 68 69 73 20 64 6f 65 73 6e 27 ┆s not reclaimed, but this doesn'┆ 0x04f200…09e600 74 20 68 61 70 70 65 6e 20 61 6c 6c 0a 20 2a 20 20 73 72 63 2f 44 2e 70 6f 72 74 2f 66 63 6f 70 ┆t happen all * src/D.port/fcop┆ 0x04f200…09e600 79 2e 63 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆y.c ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆ ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 20 20 20 34 34 34 20 00 20 20 20 ┆ 444 ┆ 0x04f200…09e600 31 34 35 20 00 20 20 20 20 20 31 20 00 20 20 20 20 20 20 20 31 32 34 37 20 20 34 34 35 36 31 35 ┆145 1 1247 445615┆ 0x04f200…09e600 34 30 35 33 20 20 20 37 33 31 31 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆4053 7311 ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆ ┆ […0x9…] 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 2f 2a 20 66 63 6f 70 79 2e 63 20 2d 2d 20 70 ┆ /* fcopy.c -- p┆ 0x04f200…09e600 65 72 66 6f 72 6d 20 66 61 73 74 20 28 75 6e 62 75 66 66 65 72 65 64 29 20 66 69 6c 65 2d 74 6f ┆erform fast (unbuffered) file-to┆ 0x04f200…09e600 2d 66 69 6c 65 20 63 6f 70 79 20 2a 2f 0a 2f 2a 20 4c 49 4e 54 4c 49 42 52 41 52 59 20 2a 2f 0a ┆-file copy */ /* LINTLIBRARY */ ┆ 0x04f200…09e600 23 69 6e 63 6c 75 64 65 20 22 6c 69 62 70 6f 72 74 2e 68 22 0a 0a 65 78 74 65 72 6e 20 69 6e 74 ┆#include "libport.h" extern int┆ 0x04f200…09e600 20 65 72 72 6e 6f 3b 0a 0a 69 6e 74 20 66 63 6f 70 79 28 66 6e 2c 20 6e 65 77 6e 61 6d 65 29 0a ┆ errno; int fcopy(fn, newname) ┆ 0x04f200…09e600 63 68 61 72 20 2a 66 6e 2c 20 2a 6e 65 77 6e 61 6d 65 3b 0a 7b 0a 20 20 20 20 69 6e 74 20 66 31 ┆char *fn, *newname; { int f1┆ 0x04f200…09e600 2c 20 66 32 2c 20 72 3b 0a 20 20 20 20 63 68 61 72 20 62 75 66 5b 42 55 46 53 49 5a 5d 3b 0a 0a ┆, f2, r; char buf[BUFSIZ]; ┆ 0x04f200…09e600 20 20 20 20 69 66 20 28 28 66 31 20 3d 20 6f 70 65 6e 28 66 6e 2c 20 30 29 29 20 3c 20 30 29 0a ┆ if ((f1 = open(fn, 0)) < 0) ┆ 0x04f200…09e600 09 72 65 74 75 72 6e 28 46 41 49 4c 29 3b 0a 0a 20 20 20 20 69 66 20 28 28 66 32 20 3d 20 6f 70 ┆ return(FAIL); if ((f2 = op┆ 0x04f200…09e600 65 6e 28 6e 65 77 6e 61 6d 65 2c 20 31 29 29 20 3c 20 30 29 0a 20 20 20 20 7b 0a 09 69 66 20 28 ┆en(newname, 1)) < 0) { if (┆ 0x04f200…09e600 65 72 72 6e 6f 20 3d 3d 20 45 4e 4f 45 4e 54 29 0a 09 7b 0a 09 20 20 20 20 69 66 20 28 28 66 32 ┆errno == ENOENT) { if ((f2┆ 0x04f200…09e600 20 3d 20 63 72 65 61 74 28 6e 65 77 6e 61 6d 65 2c 30 36 34 34 29 29 20 3c 20 30 29 20 0a 09 20 ┆ = creat(newname,0644)) < 0) ┆ 0x04f200…09e600 20 20 20 7b 0a 09 09 28 76 6f 69 64 29 20 63 6c 6f 73 65 28 66 31 29 3b 0a 09 09 72 65 74 75 72 ┆ { (void) close(f1); retur┆ 0x04f200…09e600 6e 28 46 41 49 4c 29 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 65 6c 73 65 0a 09 7b 0a 09 20 20 20 ┆n(FAIL); } } else { ┆ 0x04f200…09e600 20 28 76 6f 69 64 29 20 63 6c 6f 73 65 28 66 31 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 28 46 ┆ (void) close(f1); return(F┆ 0x04f200…09e600 41 49 4c 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 77 68 69 6c 65 28 28 72 20 3d 20 72 ┆AIL); } } while((r = r┆ 0x04f200…09e600 65 61 64 28 66 31 2c 20 62 75 66 2c 20 28 69 6f 6c 65 6e 5f 74 29 20 42 55 46 53 49 5a 29 29 20 ┆ead(f1, buf, (iolen_t) BUFSIZ)) ┆ 0x04f200…09e600 3e 20 30 29 0a 09 28 76 6f 69 64 29 20 77 72 69 74 65 28 66 32 2c 20 62 75 66 2c 20 28 69 6f 6c ┆> 0) (void) write(f2, buf, (iol┆ 0x04f200…09e600 65 6e 5f 74 29 20 72 29 3b 0a 0a 20 20 20 20 28 76 6f 69 64 29 20 63 6c 6f 73 65 28 66 31 29 3b ┆en_t) r); (void) close(f1);┆ 0x04f200…09e600 0a 20 20 20 20 28 76 6f 69 64 29 20 63 6c 6f 73 65 28 66 32 29 3b 0a 20 20 20 20 72 65 74 75 72 ┆ (void) close(f2); retur┆ 0x04f200…09e600 6e 20 28 72 20 3d 3d 20 30 29 20 3f 20 53 55 43 43 45 45 44 20 3a 20 46 41 49 4c 3b 0a 7d 0a 0a ┆n (r == 0) ? SUCCEED : FAIL; } ┆ 0x04f200…09e600 2f 2a 20 66 63 6f 70 79 2e 63 20 65 6e 64 73 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66 31 ┆/* fcopy.c ends here */ int f1┆ 0x04f200…09e600 2c 20 66 32 2c 20 72 3b 0a 20 20 20 20 63 68 61 72 20 62 75 66 5b 42 55 46 53 49 5a 5d 3b 0a 0a ┆, f2, r; char buf[BUFSIZ]; ┆ 0x04f200…09e600 20 20 20 20 69 66 20 28 28 66 31 20 3d 20 6f 70 65 6e 28 66 6e 2c 20 30 29 29 20 3c 20 30 29 0a ┆ if ((f1 = open(fn, 0)) < 0) ┆ 0x04f200…09e600 09 72 65 74 75 72 6e 28 46 41 49 4c 29 3b 0a 0a 20 20 20 20 69 66 20 28 28 66 32 20 3d 20 6f 70 ┆ return(FAIL); if ((f2 = op┆ 0x04f200…09e600 65 6e 28 6e 65 77 6e 61 6d 65 2c 20 31 29 29 20 3c 20 30 29 0a 20 20 20 20 7b 0a 09 69 66 20 28 ┆en(newname, 1)) < 0) { if (┆ 0x04f200…09e600 65 72 72 6e 6f 20 3d 3d 20 45 4e 4f 45 4e 54 29 0a 09 7b 0a 09 20 20 20 20 69 66 20 28 28 66 32 ┆errno == ENOENT) { if ((f2┆ 0x04f200…09e600 20 3d 20 63 72 65 61 74 28 6e 65 77 6e 61 6d 65 2c 30 36 34 34 29 29 20 3c 20 30 29 20 0a 09 20 ┆ = creat(newname,0644)) < 0) ┆ 0x04f200…09e600 20 20 20 7b 0a 09 09 28 76 6f 69 64 29 20 63 6c 6f 73 65 28 66 31 29 3b 0a 09 09 72 65 74 75 72 ┆ { (void) close(f1); retur┆ 0x04f200…09e600 6e 28 46 41 49 4c 29 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 65 6c 73 65 0a 09 7b 0a 09 20 20 20 ┆n(FAIL); } } else { ┆ 0x04f200…09e600 20 28 76 6f 69 64 29 20 63 6c 6f 73 65 28 66 31 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 28 46 ┆ (void) close(f1); return(F┆ 0x04f200…09e600 41 49 4c 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 77 68 69 6c 65 28 28 72 20 3d 20 72 ┆AIL); } } while((r = r┆ 0x04f200…09e600 65 61 64 28 66 31 2c 20 62 75 66 2c 20 28 69 6f 6c 73 72 63 2f 44 2e 70 6f 72 74 2f 66 69 6c 65 ┆ead(f1, buf, (iolsrc/D.port/file┆ 0x04f200…09e600 73 74 61 74 2e 63 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆stat.c ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆ ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 20 20 20 34 34 34 20 00 20 20 20 ┆ 444 ┆ 0x04f200…09e600 31 34 35 20 00 20 20 20 20 20 31 20 00 20 20 20 20 20 20 20 31 37 33 36 20 20 34 34 35 36 31 35 ┆145 1 1736 445615┆ 0x04f200…09e600 34 30 35 33 20 20 31 30 30 30 37 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆4053 10007 ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆ ┆ […0x9…] 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 2f 2a 20 66 69 6c 65 73 74 61 74 2e 63 20 2d ┆ /* filestat.c -┆ 0x04f200…09e600 2d 20 66 69 6c 65 20 20 73 74 61 74 75 73 20 71 75 65 72 79 69 6e 67 20 66 75 6e 63 74 69 6f 6e ┆- file status querying function┆ 0x04f200…09e600 73 20 2a 2f 0a 2f 2a 4c 49 4e 54 4c 49 42 52 41 52 59 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 6c ┆s */ /*LINTLIBRARY*/ #include "l┆ 0x04f200…09e600 69 62 70 6f 72 74 2e 68 22 0a 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 73 74 61 74 20 66 69 ┆ibport.h" static struct stat fi┆ 0x04f200…09e600 6c 64 61 74 3b 0a 0a 62 6f 6f 6c 20 65 78 69 73 74 73 28 66 6e 29 0a 2f 2a 20 64 6f 65 73 20 74 ┆ldat; bool exists(fn) /* does t┆ 0x04f200…09e600 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20 65 78 69 73 74 3f 20 2a 2f 0a 63 68 61 72 20 2a 66 6e ┆he given file exist? */ char *fn┆ 0x04f200…09e600 3b 0a 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 28 73 74 61 74 28 66 6e 2c 20 26 66 69 6c 64 61 74 ┆; { return(stat(fn, &fildat┆ 0x04f200…09e600 29 20 3d 3d 20 53 55 43 43 45 45 44 29 3b 0a 7d 0a 0a 62 6f 6f 6c 20 69 73 64 69 72 28 66 6e 29 ┆) == SUCCEED); } bool isdir(fn)┆ 0x04f200…09e600 0a 2f 2a 20 69 73 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20 61 20 64 69 72 65 63 74 6f 72 ┆ /* is the given file a director┆ 0x04f200…09e600 79 3f 20 2a 2f 0a 63 68 61 72 20 2a 66 6e 3b 0a 7b 0a 20 20 20 20 69 66 20 28 73 74 61 74 28 66 ┆y? */ char *fn; { if (stat(f┆ 0x04f200…09e600 6e 2c 20 26 66 69 6c 64 61 74 29 20 3d 3d 20 46 41 49 4c 29 0a 09 72 65 74 75 72 6e 28 46 41 4c ┆n, &fildat) == FAIL) return(FAL┆ 0x04f200…09e600 53 45 29 3b 0a 20 20 20 20 65 6c 73 65 0a 09 72 65 74 75 72 6e 28 28 66 69 6c 64 61 74 2e 73 74 ┆SE); else return((fildat.st┆ 0x04f200…09e600 5f 6d 6f 64 65 20 26 20 53 5f 49 46 4d 54 29 20 3d 3d 20 53 5f 49 46 44 49 52 29 3b 0a 7d 0a 0a ┆_mode & S_IFMT) == S_IFDIR); } ┆ 0x04f200…09e600 6f 66 66 5f 74 20 66 69 6c 65 73 69 7a 65 28 66 6e 29 0a 2f 2a 20 72 65 74 75 72 6e 20 74 68 65 ┆off_t filesize(fn) /* return the┆ 0x04f200…09e600 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 63 68 61 72 20 2a 66 6e 3b 0a 7b ┆ size of the file */ char *fn; {┆ 0x04f200…09e600 0a 20 20 20 20 69 66 20 28 73 74 61 74 28 66 6e 2c 20 26 66 69 6c 64 61 74 29 20 3d 3d 20 46 41 ┆ if (stat(fn, &fildat) == FA┆ 0x04f200…09e600 49 4c 29 0a 09 72 65 74 75 72 6e 28 28 6f 66 66 5f 74 29 46 41 49 4c 29 3b 0a 20 20 20 20 65 6c ┆IL) return((off_t)FAIL); el┆ 0x04f200…09e600 73 65 0a 09 72 65 74 75 72 6e 28 66 69 6c 64 61 74 2e 73 74 5f 73 69 7a 65 29 3b 0a 7d 0a 0a 74 ┆se return(fildat.st_size); } t┆ 0x04f200…09e600 69 6d 65 5f 74 20 6d 6f 64 74 69 6d 65 28 66 6e 29 0a 2f 2a 20 72 65 74 75 72 6e 20 74 68 65 20 ┆ime_t modtime(fn) /* return the ┆ 0x04f200…09e600 6c 61 73 74 2d 6d 6f 64 69 66 69 65 64 2d 74 69 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 2a ┆last-modified-time of the file *┆ 0x04f200…09e600 2f 0a 63 68 61 72 20 2a 66 6e 3b 0a 7b 0a 20 20 20 20 69 66 20 28 73 74 61 74 28 66 6e 2c 20 26 ┆/ char *fn; { if (stat(fn, &┆ 0x04f200…09e600 66 69 6c 64 61 74 29 20 3d 3d 20 46 41 49 4c 29 0a 09 72 65 74 75 72 6e 28 28 74 69 6d 65 5f 74 ┆fildat) == FAIL) return((time_t┆ 0x04f200…09e600 29 46 41 49 4c 29 3b 0a 20 20 20 20 65 6c 73 65 0a 09 72 65 74 75 72 6e 28 66 69 6c 64 61 74 2e ┆)FAIL); else return(fildat.┆ 0x04f200…09e600 73 74 5f 6d 74 69 6d 65 29 3b 0a 7d 0a 0a 76 6f 69 64 20 73 65 74 6d 6f 64 74 69 6d 65 28 66 6e ┆st_mtime); } void setmodtime(fn┆ 0x04f200…09e600 2c 20 61 64 61 74 65 29 0a 2f 2a 20 73 65 74 20 74 68 65 20 6c 61 73 74 2d 6d 6f 64 69 66 69 65 ┆, adate) /* set the last-modifie┆ 0x04f200…09e600 64 2d 74 69 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 63 68 61 72 20 2a 66 6e 3b 0a ┆d-time of the file */ char *fn; ┆ 0x04f200…09e600 74 69 6d 65 5f 74 20 61 64 61 74 65 3b 0a 7b 0a 20 20 20 20 73 74 72 75 63 74 20 7b 74 69 6d 65 ┆time_t adate; { struct {time┆ 0x04f200…09e600 5f 74 20 61 63 74 69 6d 65 3b 20 74 69 6d 65 5f 74 20 6d 6f 64 74 69 6d 65 3b 7d 20 75 74 69 6d ┆_t actime; time_t modtime;} utim┆ 0x04f200…09e600 65 73 3b 0a 0a 20 20 20 20 75 74 69 6d 65 73 2e 61 63 74 69 6d 65 20 3d 20 75 74 69 6d 65 73 2e ┆es; utimes.actime = utimes.┆ 0x04f200…09e600 6d 6f 64 74 69 6d 65 20 3d 20 61 64 61 74 65 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 75 74 69 6d ┆modtime = adate; (void) utim┆ 0x04f200…09e600 65 28 66 6e 2c 20 26 75 74 69 6d 65 73 29 3b 0a 7d 0a 0a 2f 2a 20 66 69 6c 65 73 74 61 74 2e 63 ┆e(fn, &utimes); } /* filestat.c┆ 0x04f200…09e600 20 65 6e 64 73 20 68 65 72 65 20 2a 2f 0a 0a 6e 2c 20 26 66 69 6c 64 61 74 29 20 3d 3d 20 46 41 ┆ ends here */ n, &fildat) == FA┆ 0x04f200…09e600 49 4c 29 0a 09 72 65 74 75 72 6e 28 28 6f 66 66 5f 73 72 63 2f 44 2e 70 6f 72 74 2f 66 75 6c 6c ┆IL) return((off_src/D.port/full┆ 0x04f200…09e600 6e 61 6d 65 2e 63 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆name.c ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆ ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 20 20 20 34 34 34 20 00 20 20 20 ┆ 444 ┆ 0x04f200…09e600 31 34 35 20 00 20 20 20 20 20 31 20 00 20 20 20 20 20 20 31 30 36 31 30 20 20 34 34 35 36 31 35 ┆145 1 10610 445615┆ 0x04f200…09e600 34 30 35 33 20 20 31 30 30 30 36 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆4053 10006 ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆ ┆ […0x9…] 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆ /**************┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆********************************┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a ┆******************************* ┆ 0x04f200…09e600 0a 4e 41 4d 45 0a 20 20 20 66 75 6c 6c 6e 61 6d 65 2e 63 20 2d 20 72 65 74 75 72 6e 20 75 73 65 ┆ NAME fullname.c - return use┆ 0x04f200…09e600 72 27 73 20 66 75 6c 6c 20 6e 61 6d 65 0a 0a 53 59 4e 4f 50 53 49 53 0a 20 20 20 63 68 61 72 20 ┆r's full name SYNOPSIS char ┆ 0x04f200…09e600 2a 66 75 6c 6c 6e 61 6d 65 28 75 73 65 72 69 64 29 09 2d 2d 20 72 65 74 75 72 6e 20 75 73 65 72 ┆*fullname(userid) -- return user┆ 0x04f200…09e600 27 73 20 6e 61 6d 65 2d 61 6d 6f 6e 67 2d 68 75 6d 61 6e 73 0a 20 20 20 63 68 61 72 20 2a 75 73 ┆'s name-among-humans char *us┆ 0x04f200…09e600 65 72 69 64 3b 0a 0a 44 45 53 43 52 49 50 54 49 4f 4e 0a 20 20 20 54 68 69 73 20 66 69 6c 65 20 ┆erid; DESCRIPTION This file ┆ 0x04f200…09e600 69 73 20 6d 61 64 65 20 73 65 70 61 72 61 74 65 20 73 6f 20 74 68 61 74 20 64 69 66 66 65 72 65 ┆is made separate so that differe┆ 0x04f200…09e600 6e 74 20 6c 6f 63 61 6c 0a 63 6f 6e 76 65 6e 74 69 6f 6e 73 20 63 61 6e 20 62 65 20 61 70 70 6c ┆nt local conventions can be appl┆ 0x04f200…09e600 69 65 64 2e 20 20 54 68 65 20 73 74 6f 63 6b 20 76 65 72 73 69 6f 6e 20 75 6e 64 65 72 73 74 61 ┆ied. The stock version understa┆ 0x04f200…09e600 6e 64 73 20 74 77 6f 0a 63 6f 6e 76 65 6e 74 69 6f 6e 73 3a 0a 0a 28 61 29 20 42 65 72 6b 65 6c ┆nds two conventions: (a) Berkel┆ 0x04f200…09e600 65 79 20 66 69 6e 67 65 72 3a 20 74 68 65 20 67 65 63 6f 73 20 66 69 65 6c 64 20 69 6e 20 2f 65 ┆ey finger: the gecos field in /e┆ 0x04f200…09e600 74 63 2f 70 61 73 73 77 64 20 62 65 67 69 6e 73 20 77 69 74 68 0a 20 20 20 20 74 68 65 20 66 75 ┆tc/passwd begins with the fu┆ 0x04f200…09e600 6c 6c 20 6e 61 6d 65 2c 20 74 65 72 6d 69 6e 61 74 65 64 20 77 69 74 68 20 63 6f 6d 6d 61 2c 20 ┆ll name, terminated with comma, ┆ 0x04f200…09e600 73 65 6d 69 63 6f 6c 6f 6e 2c 20 6f 72 20 65 6e 64 20 6f 66 0a 20 20 20 20 66 69 65 6c 64 2e 20 ┆semicolon, or end of field. ┆ 0x04f200…09e600 20 26 20 65 78 70 61 6e 64 73 20 74 6f 20 74 68 65 20 6c 6f 67 69 6e 20 6e 61 6d 65 2e 0a 28 62 ┆ & expands to the login name. (b┆ 0x04f200…09e600 29 20 42 54 4c 20 52 4a 45 3a 20 74 68 65 20 67 65 63 6f 73 20 66 69 65 6c 64 20 6c 6f 6f 6b 73 ┆) BTL RJE: the gecos field looks┆ 0x04f200…09e600 20 6c 69 6b 65 0a 20 20 20 20 20 20 20 3a 20 6a 75 6e 6b 20 2d 20 66 75 6c 6c 20 6e 61 6d 65 20 ┆ like : junk - full name ┆ 0x04f200…09e600 28 20 6a 75 6e 6b 20 3a 0a 20 20 20 20 77 68 65 72 65 20 74 68 65 20 22 6a 75 6e 6b 20 2d 22 20 ┆( junk : where the "junk -" ┆ 0x04f200…09e600 69 73 20 6f 70 74 69 6f 6e 61 6c 2e 0a 0a 49 66 20 79 6f 75 20 68 61 76 65 20 61 20 64 69 66 66 ┆is optional. If you have a diff┆ 0x04f200…09e600 65 72 65 6e 74 20 6c 6f 63 61 6c 20 63 6f 6e 76 65 6e 74 69 6f 6e 2c 20 6d 6f 64 69 66 79 20 74 ┆erent local convention, modify t┆ 0x04f200…09e600 68 69 73 20 66 69 6c 65 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 0a 46 49 4c 45 53 0a 20 20 20 ┆his file accordingly. FILES ┆ 0x04f200…09e600 24 48 4f 4d 45 2f 2e 6e 61 6d 65 09 2d 2d 20 73 74 6f 72 65 73 20 61 6e 73 77 65 72 20 74 6f 20 ┆$HOME/.name -- stores answer to ┆ 0x04f200…09e600 66 75 6c 6c 6e 61 6d 65 20 71 75 65 72 79 20 28 6e 6f 6e 2d 47 43 4f 53 20 73 79 73 74 65 6d 73 ┆fullname query (non-GCOS systems┆ 0x04f200…09e600 20 6f 6e 6c 79 29 2e 0a 0a 41 55 54 48 4f 52 0a 20 20 20 45 72 69 63 20 53 2e 20 52 61 79 6d 6f ┆ only). AUTHOR Eric S. Raymo┆ 0x04f200…09e600 6e 64 20 28 65 6e 68 61 6e 63 65 64 20 66 72 6f 6d 20 61 6e 6f 6e 79 6d 6f 75 73 20 63 6f 64 65 ┆nd (enhanced from anonymous code┆ 0x04f200…09e600 20 69 6e 20 6e 65 77 73 20 32 2e 31 30 2e 33 29 0a 20 20 20 54 68 69 73 20 73 6f 66 74 77 61 72 ┆ in news 2.10.3) This softwar┆ 0x04f200…09e600 65 20 69 73 20 43 6f 70 79 72 69 67 68 74 20 28 43 29 20 31 39 38 39 20 62 79 20 45 72 69 63 20 ┆e is Copyright (C) 1989 by Eric ┆ 0x04f200…09e600 53 2e 20 52 61 79 6d 6f 6e 64 20 66 6f 72 20 74 68 65 20 73 6f 6c 65 20 70 75 72 70 6f 73 65 0a ┆S. Raymond for the sole purpose ┆ 0x04f200…09e600 6f 66 20 70 72 6f 74 65 63 74 69 6e 67 20 66 72 65 65 20 72 65 64 69 73 74 72 69 62 75 74 69 6f ┆of protecting free redistributio┆ 0x04f200…09e600 6e 3b 20 73 65 65 20 74 68 65 20 4c 49 43 45 4e 53 45 20 66 69 6c 65 20 66 6f 72 20 64 65 74 61 ┆n; see the LICENSE file for deta┆ 0x04f200…09e600 69 6c 73 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆ils. ***************************┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆********************************┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 20 4c 49 4e 54 4c 49 42 52 ┆*******************/ /* LINTLIBR┆ 0x04f200…09e600 41 52 59 20 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 6c 69 62 70 6f 72 74 2e 68 22 0a 0a 23 64 65 ┆ARY */ #include "libport.h" #de┆ 0x04f200…09e600 66 69 6e 65 20 4c 55 4e 41 4d 45 09 36 34 20 20 2f 2a 20 6d 61 78 69 6d 75 6d 20 6c 65 6e 67 74 ┆fine LUNAME 64 /* maximum lengt┆ 0x04f200…09e600 68 20 6f 66 20 75 73 65 72 20 66 75 6c 6c 20 6e 61 6d 65 20 2a 2f 0a 0a 23 69 66 64 65 66 20 47 ┆h of user full name */ #ifdef G┆ 0x04f200…09e600 43 4f 53 0a 2f 2a 0a 2a 2a 20 20 42 55 49 4c 44 46 4e 41 4d 45 20 2d 2d 20 62 75 69 6c 64 20 66 ┆COS /* ** BUILDFNAME -- build f┆ 0x04f200…09e600 75 6c 6c 20 6e 61 6d 65 20 66 72 6f 6d 20 52 4a 45 2d 73 74 79 6c 65 20 67 65 63 6f 73 20 66 69 ┆ull name from RJE-style gecos fi┆ 0x04f200…09e600 65 6c 64 2e 0a 2a 2a 09 28 72 6f 75 74 69 6e 65 20 6c 69 66 74 65 64 20 66 72 6f 6d 20 73 65 6e ┆eld. ** (routine lifted from sen┆ 0x04f200…09e600 64 6d 61 69 6c 29 0a 2a 2a 0a 2a 2a 09 50 61 72 61 6d 65 74 65 72 73 3a 0a 2a 2a 09 09 70 20 2d ┆dmail) ** ** Parameters: ** p -┆ 0x04f200…09e600 2d 20 6e 61 6d 65 20 74 6f 20 62 75 69 6c 64 2e 0a 2a 2a 09 09 6c 6f 67 69 6e 20 2d 2d 20 74 68 ┆- name to build. ** login -- th┆ 0x04f200…09e600 65 20 6c 6f 67 69 6e 20 6e 61 6d 65 20 6f 66 20 74 68 69 73 20 75 73 65 72 20 28 66 6f 72 20 26 ┆e login name of this user (for &┆ 0x04f200…09e600 29 2e 0a 2a 2a 09 09 62 75 66 20 2d 2d 20 70 6c 61 63 65 20 74 6f 20 70 75 74 20 74 68 65 20 72 ┆). ** buf -- place to put the r┆ 0x04f200…09e600 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 09 52 65 74 75 72 6e 73 3a 0a 2a 2a 09 09 6e 6f 6e 65 2e 0a ┆esult. ** ** Returns: ** none. ┆ 0x04f200…09e600 2a 2a 0a 2a 2a 09 53 69 64 65 20 45 66 66 65 63 74 73 3a 0a 2a 2a 09 09 6e 6f 6e 65 2e 0a 2a 2f ┆** ** Side Effects: ** none. */┆ 0x04f200…09e600 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 75 69 6c 64 66 6e 61 6d 65 28 70 2c 20 6c 6f 67 69 ┆ static void buildfname(p, logi┆ 0x04f200…09e600 6e 2c 20 62 75 66 29 0a 72 65 67 69 73 74 65 72 20 63 68 61 72 20 2a 70 3b 0a 63 68 61 72 20 2a ┆n, buf) register char *p; char *┆ 0x04f200…09e600 6c 6f 67 69 6e 3b 0a 63 68 61 72 20 2a 62 75 66 3b 0a 7b 0a 20 20 20 20 72 65 67 69 73 74 65 72 ┆login; char *buf; { register┆ 0x04f200…09e600 20 63 68 61 72 20 2a 62 70 20 3d 20 62 75 66 3b 0a 0a 20 20 20 20 69 66 20 28 2a 70 20 3d 3d 20 ┆ char *bp = buf; if (*p == ┆ 0x04f200…09e600 27 2a 27 29 0a 09 70 2b 2b 3b 0a 20 20 20 20 77 68 69 6c 65 20 28 2a 70 20 21 3d 20 27 5c 30 27 ┆'*') p++; while (*p != '\0'┆ 0x04f200…09e600 20 26 26 20 2a 70 20 21 3d 20 27 2c 27 20 26 26 20 2a 70 20 21 3d 20 27 3b 27 20 26 26 20 2a 70 ┆ && *p != ',' && *p != ';' && *p┆ 0x04f200…09e600 20 21 3d 20 27 3a 27 20 26 26 20 2a 70 20 21 3d 20 27 28 27 29 0a 20 20 20 20 7b 0a 09 69 66 20 ┆ != ':' && *p != '(') { if ┆ 0x04f200…09e600 28 2a 70 20 3d 3d 20 27 2d 27 29 0a 09 7b 0a 09 20 20 20 20 62 70 20 3d 20 62 75 66 3b 0a 09 20 ┆(*p == '-') { bp = buf; ┆ 0x04f200…09e600 20 20 20 70 2b 2b 3b 0a 09 7d 0a 09 65 6c 73 65 20 69 66 20 28 2a 70 20 3d 3d 20 27 26 27 29 0a ┆ p++; } else if (*p == '&') ┆ 0x04f200…09e600 09 7b 0a 09 20 20 20 20 28 76 6f 69 64 29 20 73 74 72 63 70 79 28 62 70 2c 20 6c 6f 67 69 6e 29 ┆ { (void) strcpy(bp, login)┆ 0x04f200…09e600 3b 0a 09 20 20 20 20 69 66 20 28 28 62 70 20 3d 3d 20 62 75 66 20 7c 7c 20 21 69 73 61 6c 70 68 ┆; if ((bp == buf || !isalph┆ 0x04f200…09e600 61 28 62 70 5b 2d 31 5d 29 29 20 26 26 20 69 73 6c 6f 77 65 72 28 2a 62 70 29 29 0a 09 09 2a 62 ┆a(bp[-1])) && islower(*bp)) *b┆ 0x04f200…09e600 70 20 3d 20 74 6f 75 70 70 65 72 28 2a 62 70 29 3b 0a 09 20 20 20 20 77 68 69 6c 65 20 28 2a 62 ┆p = toupper(*bp); while (*b┆ 0x04f200…09e600 70 20 21 3d 20 27 5c 30 27 29 0a 09 09 62 70 2b 2b 3b 0a 09 20 20 20 20 70 2b 2b 3b 0a 09 7d 0a ┆p != '\0') bp++; p++; } ┆ 0x04f200…09e600 09 65 6c 73 65 0a 09 20 20 20 20 2a 62 70 2b 2b 20 3d 20 2a 70 2b 2b 3b 0a 20 20 20 20 7d 0a 20 ┆ else *bp++ = *p++; } ┆ 0x04f200…09e600 20 20 20 77 68 69 6c 65 20 28 62 70 20 3e 20 62 75 66 20 26 26 20 62 70 5b 2d 31 5d 20 3d 3d 20 ┆ while (bp > buf && bp[-1] == ┆ 0x04f200…09e600 27 20 27 29 0a 09 2d 2d 62 70 3b 0a 20 20 20 20 2a 62 70 20 3d 20 27 5c 30 27 3b 0a 7d 0a 0a 63 ┆' ') --bp; *bp = '\0'; } c┆ 0x04f200…09e600 68 61 72 20 2a 66 75 6c 6c 6e 61 6d 65 28 75 6e 29 0a 2f 2a 0a 20 2a 20 46 69 67 75 72 65 20 6f ┆har *fullname(un) /* * Figure o┆ 0x04f200…09e600 75 74 20 77 68 6f 20 69 73 20 73 65 6e 64 69 6e 67 20 74 68 65 20 6d 65 73 73 61 67 65 20 61 6e ┆ut who is sending the message an┆ 0x04f200…09e600 64 20 73 69 67 6e 20 69 74 2e 0a 20 2a 20 57 65 20 61 74 74 65 6d 70 74 20 74 6f 20 6c 6f 6f 6b ┆d sign it. * We attempt to look┆ 0x04f200…09e600 20 75 70 20 74 68 65 20 75 73 65 72 20 69 6e 20 74 68 65 20 67 65 63 6f 73 20 66 69 65 6c 64 20 ┆ up the user in the gecos field ┆ 0x04f200…09e600 6f 66 20 2f 65 74 63 2f 70 61 73 73 77 64 2e 0a 20 2a 2f 0a 63 68 61 72 20 2a 75 6e 3b 0a 7b 0a ┆of /etc/passwd. */ char *un; { ┆ 0x04f200…09e600 20 20 20 20 73 74 61 74 69 63 20 63 68 61 72 20 69 6e 62 75 66 5b 4c 55 4e 41 4d 45 5d 3b 0a 20 ┆ static char inbuf[LUNAME]; ┆ 0x04f200…09e600 20 20 20 73 74 72 75 63 74 20 70 61 73 73 77 64 20 2a 70 77 3b 0a 20 20 20 20 63 68 61 72 20 2a ┆ struct passwd *pw; char *┆ 0x04f200…09e600 66 75 6c 6c 65 6e 76 20 3d 20 67 65 74 65 6e 76 28 22 4e 41 4d 45 22 29 3b 0a 0a 20 20 20 20 69 ┆fullenv = getenv("NAME"); i┆ 0x04f200…09e600 66 20 28 66 75 6c 6c 65 6e 76 20 21 3d 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 0a 09 72 65 74 ┆f (fullenv != (char *)NULL) ret┆ 0x04f200…09e600 75 72 6e 28 66 75 6c 6c 65 6e 76 29 3b 0a 20 20 20 20 65 6c 73 65 20 69 66 20 28 28 70 77 20 3d ┆urn(fullenv); else if ((pw =┆ 0x04f200…09e600 20 67 65 74 70 77 6e 61 6d 28 75 6e 29 29 20 3d 3d 20 28 73 74 72 75 63 74 20 70 61 73 73 77 64 ┆ getpwnam(un)) == (struct passwd┆ 0x04f200…09e600 20 2a 29 4e 55 4c 4c 29 0a 09 72 65 74 75 72 6e 28 75 6e 29 3b 0a 20 20 20 20 62 75 69 6c 64 66 ┆ *)NULL) return(un); buildf┆ 0x04f200…09e600 6e 61 6d 65 28 70 77 2d 3e 70 77 5f 67 65 63 6f 73 2c 20 75 6e 2c 20 69 6e 62 75 66 29 3b 0a 20 ┆name(pw->pw_gecos, un, inbuf); ┆ 0x04f200…09e600 20 20 20 69 66 20 28 69 6e 62 75 66 5b 30 5d 20 3d 3d 20 30 29 0a 09 72 65 74 75 72 6e 28 75 6e ┆ if (inbuf[0] == 0) return(un┆ 0x04f200…09e600 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 28 69 6e 62 75 66 29 3b 0a 7d 0a 0a 23 65 6c 73 65 09 2f ┆); return(inbuf); } #else /┆ 0x04f200…09e600 2a 20 21 47 43 4f 53 20 2a 2f 0a 0a 2f 2a 0a 20 2a 20 41 6c 74 65 72 6e 61 74 69 76 65 20 76 65 ┆* !GCOS */ /* * Alternative ve┆ 0x04f200…09e600 72 73 69 6f 6e 20 6f 66 20 66 75 6c 6c 6e 61 6d 65 20 77 68 69 63 68 20 61 73 6b 73 20 74 68 65 ┆rsion of fullname which asks the┆ 0x04f200…09e600 20 75 73 65 72 20 66 6f 72 20 68 69 73 20 66 75 6c 6c 20 6e 61 6d 65 2e 0a 20 2a 20 54 68 69 73 ┆ user for his full name. * This┆ 0x04f200…09e600 20 69 73 20 6d 61 69 6e 6c 79 20 73 75 69 74 61 62 6c 65 20 66 6f 72 20 73 79 73 74 65 6d 73 20 ┆ is mainly suitable for systems ┆ 0x04f200…09e600 74 68 61 74 20 64 6f 6e 27 74 20 68 61 76 65 20 61 20 66 75 6c 6c 20 6e 61 6d 65 0a 20 2a 20 64 ┆that don't have a full name * d┆ 0x04f200…09e600 61 74 61 62 61 73 65 20 73 6f 6d 65 77 68 65 72 65 2e 20 20 49 74 20 70 75 74 73 20 74 68 65 20 ┆atabase somewhere. It puts the ┆ 0x04f200…09e600 61 6e 73 77 65 72 20 69 6e 20 24 48 4f 4d 45 2f 2e 6e 61 6d 65 0a 20 2a 2f 0a 63 68 61 72 20 2a ┆answer in $HOME/.name */ char *┆ 0x04f200…09e600 0a 66 75 6c 6c 6e 61 6d 65 28 75 6e 29 0a 63 68 61 72 20 2a 75 6e 3b 0a 7b 0a 20 20 20 20 73 74 ┆ fullname(un) char *un; { st┆ 0x04f200…09e600 61 74 69 63 20 63 68 61 72 20 69 6e 62 75 66 5b 4c 55 4e 41 4d 45 5d 3b 0a 20 20 20 20 63 68 61 ┆atic char inbuf[LUNAME]; cha┆ 0x04f200…09e600 72 20 66 62 75 66 5b 4c 55 4e 41 4d 45 5d 2c 20 2a 70 2c 20 2a 68 6f 6d 65 3b 0a 20 20 20 20 46 ┆r fbuf[LUNAME], *p, *home; F┆ 0x04f200…09e600 49 4c 45 20 2a 66 64 3b 0a 20 20 20 20 69 6e 74 20 70 69 64 3b 0a 0a 20 20 20 20 2f 2a 20 69 66 ┆ILE *fd; int pid; /* if┆ 0x04f200…09e600 20 77 65 27 76 65 20 61 6c 72 65 61 64 79 20 63 61 6c 6c 65 64 20 74 68 69 73 20 6f 6e 63 65 2c ┆ we've already called this once,┆ 0x04f200…09e600 20 75 73 65 20 74 68 65 20 73 74 6f 72 65 64 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 20 20 69 66 ┆ use the stored result */ if┆ 0x04f200…09e600 20 28 69 6e 62 75 66 5b 30 5d 29 0a 09 72 65 74 75 72 6e 28 69 6e 62 75 66 29 3b 0a 0a 20 20 20 ┆ (inbuf[0]) return(inbuf); ┆ 0x04f200…09e600 20 2f 2a 20 74 72 79 20 74 6f 20 6d 69 6e 65 20 69 74 20 6f 75 74 20 6f 66 20 74 68 65 20 65 6e ┆ /* try to mine it out of the en┆ 0x04f200…09e600 76 69 72 6f 6e 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 28 70 20 3d 20 67 65 74 65 6e 76 ┆vironment */ if ((p = getenv┆ 0x04f200…09e600 28 22 4e 41 4d 45 22 29 29 20 21 3d 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 0a 09 72 65 74 75 ┆("NAME")) != (char *)NULL) retu┆ 0x04f200…09e600 72 6e 28 70 29 3b 0a 0a 20 20 20 20 2f 2a 20 6f 74 68 65 72 77 69 73 65 20 69 66 20 24 48 4f 4d ┆rn(p); /* otherwise if $HOM┆ 0x04f200…09e600 45 2f 2e 6e 61 6d 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 2c 20 72 65 61 64 20 69 74 20 ┆E/.name already exists, read it ┆ 0x04f200…09e600 6f 75 74 20 6f 66 20 74 68 61 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 28 68 6f 6d 65 20 3d 20 67 ┆out of that */ if ((home = g┆ 0x04f200…09e600 65 74 65 6e 76 28 22 48 4f 4d 45 22 29 29 20 21 3d 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 0a ┆etenv("HOME")) != (char *)NULL) ┆ 0x04f200…09e600 20 20 20 20 7b 0a 09 28 76 6f 69 64 29 20 73 70 72 69 6e 74 66 28 66 62 75 66 2c 20 22 25 73 2f ┆ { (void) sprintf(fbuf, "%s/┆ 0x04f200…09e600 25 73 22 2c 20 68 6f 6d 65 2c 20 22 2e 6e 61 6d 65 22 29 3b 0a 09 69 66 20 28 66 70 20 3d 20 66 ┆%s", home, ".name"); if (fp = f┆ 0x04f200…09e600 6f 70 65 6e 28 66 62 75 66 2c 20 22 72 22 29 29 0a 09 7b 0a 09 20 20 20 20 69 66 20 28 66 67 65 ┆open(fbuf, "r")) { if (fge┆ 0x04f200…09e600 74 73 28 69 6e 62 75 66 2c 20 4c 55 4e 41 4d 45 2c 20 66 70 29 20 21 3d 20 28 63 68 61 72 20 2a ┆ts(inbuf, LUNAME, fp) != (char *┆ 0x04f200…09e600 29 4e 55 4c 4c 29 0a 09 20 20 20 20 7b 0a 09 09 69 66 20 28 70 20 3d 20 73 74 72 63 68 72 28 69 ┆)NULL) { if (p = strchr(i┆ 0x04f200…09e600 6e 62 75 66 2c 20 27 5c 6e 27 29 29 0a 09 09 20 20 20 20 2a 70 20 3d 20 30 3b 0a 09 09 72 65 74 ┆nbuf, '\n')) *p = 0; ret┆ 0x04f200…09e600 75 72 6e 28 69 6e 62 75 66 29 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 ┆urn(inbuf); } } } ┆ 0x04f200…09e600 20 2f 2a 20 69 66 20 63 61 6c 6c 69 6e 67 20 70 72 6f 67 72 61 6d 20 69 73 20 6e 6f 6e 2d 69 6e ┆ /* if calling program is non-in┆ 0x04f200…09e600 74 65 72 61 63 74 69 76 65 2c 20 70 75 6e 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 21 69 73 61 74 ┆teractive, punt */ if (!isat┆ 0x04f200…09e600 74 79 28 32 29 29 0a 09 72 65 74 75 72 6e 28 75 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 6f 74 68 65 ┆ty(2)) return(un); /* othe┆ 0x04f200…09e600 72 77 69 73 65 2c 20 61 73 6b 20 66 6f 72 20 6e 61 6d 65 20 61 6e 64 20 77 72 69 74 65 20 69 74 ┆rwise, ask for name and write it┆ 0x04f200…09e600 20 74 6f 20 24 48 4f 4d 45 2f 2e 6e 61 6d 65 0a 20 20 20 20 28 76 6f 69 64 29 20 70 72 69 6e 74 ┆ to $HOME/.name (void) print┆ 0x04f200…09e600 66 28 22 57 68 61 74 20 69 73 20 79 6f 75 72 20 66 75 6c 6c 20 6e 61 6d 65 3f 20 22 29 3b 0a 20 ┆f("What is your full name? "); ┆ 0x04f200…09e600 20 20 20 28 76 6f 69 64 29 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b 0a 20 20 20 20 28 76 ┆ (void) fflush(stdout); (v┆ 0x04f200…09e600 6f 69 64 29 20 72 65 61 64 28 32 2c 20 69 6e 62 75 66 2c 20 28 69 6f 6c 65 6e 5f 74 29 20 73 69 ┆oid) read(2, inbuf, (iolen_t) si┆ 0x04f200…09e600 7a 65 6f 66 28 69 6e 62 75 66 29 29 3b 0a 20 20 20 20 69 66 20 28 69 6e 62 75 66 5b 30 5d 20 3d ┆zeof(inbuf)); if (inbuf[0] =┆ 0x04f200…09e600 3d 20 30 29 0a 09 72 65 74 75 72 6e 28 75 6e 29 3b 0a 20 20 20 20 69 66 20 28 70 20 3d 20 73 74 ┆= 0) return(un); if (p = st┆ 0x04f200…09e600 72 63 68 72 28 69 6e 62 75 66 2c 20 27 5c 6e 27 29 29 0a 09 2a 70 20 3d 20 30 3b 0a 20 20 20 20 ┆rchr(inbuf, '\n')) *p = 0; ┆ 0x04f200…09e600 69 66 20 28 28 70 20 3d 20 67 65 74 65 6e 76 28 22 48 4f 4d 45 22 29 29 20 3d 3d 20 28 63 68 61 ┆if ((p = getenv("HOME")) == (cha┆ 0x04f200…09e600 72 20 2a 29 4e 55 4c 4c 29 0a 20 20 20 20 7b 0a 09 28 76 6f 69 64 29 20 66 70 72 69 6e 74 66 28 ┆r *)NULL) { (void) fprintf(┆ 0x04f200…09e600 73 74 64 65 72 72 2c 0a 09 22 66 75 6c 6c 6e 61 6d 65 3a 20 6e 6f 20 48 4f 4d 45 20 65 6e 76 69 ┆stderr, "fullname: no HOME envi┆ 0x04f200…09e600 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65 20 2d 20 2e 6e 61 6d 65 20 6e 6f 74 20 77 72 69 ┆ronment variable - .name not wri┆ 0x04f200…09e600 74 74 65 6e 5c 6e 22 29 3b 0a 09 72 65 74 75 72 6e 28 69 6e 62 75 66 29 3b 0a 20 20 20 20 7d 0a ┆tten\n"); return(inbuf); } ┆ 0x04f200…09e600 20 20 20 20 28 76 6f 69 64 29 20 73 70 72 69 6e 74 66 28 66 62 75 66 2c 20 22 25 73 2f 25 73 22 ┆ (void) sprintf(fbuf, "%s/%s"┆ 0x04f200…09e600 2c 20 70 2c 20 22 2e 6e 61 6d 65 22 29 3b 0a 20 20 20 20 69 66 20 28 28 70 69 64 20 3d 20 76 66 ┆, p, ".name"); if ((pid = vf┆ 0x04f200…09e600 6f 72 6b 28 29 29 20 3c 20 30 29 0a 20 20 20 20 7b 0a 09 70 65 72 72 6f 72 28 22 66 75 6c 6c 6e ┆ork()) < 0) { perror("fulln┆ 0x04f200…09e600 61 6d 65 22 29 3b 0a 09 72 65 74 75 72 6e 20 69 6e 62 75 66 3b 0a 20 20 20 20 7d 0a 20 20 20 20 ┆ame"); return inbuf; } ┆ 0x04f200…09e600 65 6c 73 65 20 69 66 20 28 70 69 64 20 21 3d 20 30 29 09 2f 2a 20 70 61 72 65 6e 74 20 73 69 64 ┆else if (pid != 0) /* parent sid┆ 0x04f200…09e600 65 20 2a 2f 0a 09 77 68 69 6c 65 20 28 77 61 69 74 28 28 77 61 69 74 5f 74 20 2a 29 4e 55 4c 4c ┆e */ while (wait((wait_t *)NULL┆ 0x04f200…09e600 29 20 21 3d 20 70 69 64 29 0a 09 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 65 6c 73 ┆) != pid) continue; els┆ 0x04f200…09e600 65 09 09 2f 2a 20 63 68 69 6c 64 20 73 69 64 65 20 2a 2f 0a 20 20 20 20 7b 0a 09 28 76 6f 69 64 ┆e /* child side */ { (void┆ 0x04f200…09e600 29 20 73 65 74 75 69 64 28 67 65 74 75 69 64 28 29 29 3b 09 2f 2a 20 62 65 63 6f 6d 65 20 74 68 ┆) setuid(getuid()); /* become th┆ 0x04f200…09e600 65 20 75 73 65 72 20 2a 2f 0a 09 69 66 20 28 28 66 64 20 3d 20 66 6f 70 65 6e 28 66 62 75 66 2c ┆e user */ if ((fd = fopen(fbuf,┆ 0x04f200…09e600 20 22 77 22 29 29 20 3d 3d 20 28 46 49 4c 45 20 2a 29 4e 55 4c 4c 29 0a 09 20 20 20 20 28 76 6f ┆ "w")) == (FILE *)NULL) (vo┆ 0x04f200…09e600 69 64 29 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 66 75 6c 6c 6e 61 6d 65 3a 20 63 ┆id) fprintf(stderr, "fullname: c┆ 0x04f200…09e600 61 6e 27 74 20 63 72 65 61 74 65 20 25 73 5c 6e 22 2c 20 66 62 75 66 29 3b 0a 09 65 6c 73 65 0a ┆an't create %s\n", fbuf); else ┆ 0x04f200…09e600 09 7b 0a 09 20 20 20 20 28 76 6f 69 64 29 20 66 70 72 69 6e 74 66 28 66 64 2c 20 22 25 73 5c 6e ┆ { (void) fprintf(fd, "%s\n┆ 0x04f200…09e600 22 2c 20 69 6e 62 75 66 29 3b 0a 09 20 20 20 20 28 76 6f 69 64 29 20 66 63 6c 6f 73 65 28 66 64 ┆", inbuf); (void) fclose(fd┆ 0x04f200…09e600 29 3b 0a 09 7d 0a 09 65 78 69 74 28 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e ┆); } exit(0); } return┆ 0x04f200…09e600 28 69 6e 62 75 66 29 3b 0a 7d 0a 23 65 6e 64 69 66 09 2f 2a 20 47 43 4f 53 20 2a 2f 0a 0a 2f 2a ┆(inbuf); } #endif /* GCOS */ /*┆ 0x04f200…09e600 20 66 75 6c 6c 6e 61 6d 65 2e 63 20 65 6e 64 73 20 68 65 72 65 20 2a 2f 0a 69 64 20 3d 20 76 66 ┆ fullname.c ends here */ id = vf┆ 0x04f200…09e600 6f 72 6b 28 29 29 20 3c 20 30 29 0a 20 20 20 20 7b 0a 09 70 65 72 72 6f 72 28 22 66 75 6c 6c 6e ┆ork()) < 0) { perror("fulln┆ 0x04f200…09e600 61 6d 65 22 29 3b 0a 09 72 65 74 75 72 6e 20 69 6e 62 75 66 3b 0a 20 20 20 20 7d 0a 20 20 20 20 ┆ame"); return inbuf; } ┆ 0x04f200…09e600 65 6c 73 65 20 69 66 20 28 70 69 64 20 21 3d 20 30 29 09 2f 2a 20 70 61 72 65 6e 74 20 73 69 64 ┆else if (pid != 0) /* parent sid┆ 0x04f200…09e600 65 20 2a 2f 0a 09 77 68 69 6c 65 20 28 77 61 69 74 73 72 63 2f 44 2e 70 6f 72 74 2f 66 77 61 69 ┆e */ while (waitsrc/D.port/fwai┆ 0x04f200…09e600 74 2e 63 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆t.c ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆ ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 20 20 20 34 34 34 20 00 20 20 20 ┆ 444 ┆ 0x04f200…09e600 31 34 35 20 00 20 20 20 20 20 31 20 00 20 20 20 20 20 20 20 31 33 31 34 20 20 34 34 35 36 31 35 ┆145 1 1314 445615┆ 0x04f200…09e600 34 30 35 33 20 20 20 37 32 37 36 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆4053 7276 ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆ ┆ […0x9…] 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 2f 2a 20 66 77 61 69 74 2e 63 20 2d 2d 20 73 ┆ /* fwait.c -- s┆ 0x04f200…09e600 65 63 75 72 65 20 77 61 69 74 20 6f 6e 20 70 72 6f 63 65 73 73 20 74 65 72 6d 69 6e 61 74 69 6f ┆ecure wait on process terminatio┆ 0x04f200…09e600 6e 20 2a 2f 0a 2f 2a 20 4c 49 4e 54 4c 49 42 52 41 52 59 20 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 ┆n */ /* LINTLIBRARY */ #include ┆ 0x04f200…09e600 22 73 79 73 74 65 6d 2e 68 22 0a 0a 69 6e 74 20 66 77 61 69 74 28 70 69 64 29 0a 2f 2a 20 77 61 ┆"system.h" int fwait(pid) /* wa┆ 0x04f200…09e600 69 74 20 6f 6e 20 61 20 63 68 69 6c 64 20 70 72 6f 63 65 73 73 2c 20 73 68 69 65 6c 64 69 6e 67 ┆it on a child process, shielding┆ 0x04f200…09e600 20 69 74 20 66 72 6f 6d 20 53 49 47 49 4e 54 2f 53 49 47 48 55 50 2f 53 49 47 41 4c 52 4d 20 2a ┆ it from SIGINT/SIGHUP/SIGALRM *┆ 0x04f200…09e600 2f 0a 72 65 67 69 73 74 65 72 20 69 6e 74 20 70 69 64 3b 0a 7b 0a 20 20 20 20 72 65 67 69 73 74 ┆/ register int pid; { regist┆ 0x04f200…09e600 65 72 20 69 6e 74 20 77 3b 0a 20 20 20 20 77 61 69 74 5f 74 20 73 74 61 74 75 73 3b 0a 20 20 20 ┆er int w; wait_t status; ┆ 0x04f200…09e600 20 63 61 74 63 68 5f 74 20 28 2a 6f 6e 61 6c 72 6d 29 28 29 2c 20 28 2a 6f 6e 69 6e 74 29 28 29 ┆ catch_t (*onalrm)(), (*onint)()┆ 0x04f200…09e600 2c 20 28 2a 6f 6e 68 75 70 29 28 29 3b 0a 0a 20 20 20 20 6f 6e 61 6c 72 6d 20 3d 20 73 69 67 6e ┆, (*onhup)(); onalrm = sign┆ 0x04f200…09e600 61 6c 28 53 49 47 41 4c 52 4d 2c 20 53 49 47 43 41 53 54 28 53 49 47 5f 49 47 4e 29 29 3b 0a 20 ┆al(SIGALRM, SIGCAST(SIG_IGN)); ┆ 0x04f200…09e600 20 20 20 6f 6e 69 6e 74 20 3d 20 73 69 67 6e 61 6c 28 53 49 47 49 4e 54 2c 20 53 49 47 43 41 53 ┆ onint = signal(SIGINT, SIGCAS┆ 0x04f200…09e600 54 28 53 49 47 5f 49 47 4e 29 29 3b 0a 20 20 20 20 6f 6e 68 75 70 20 3d 20 73 69 67 6e 61 6c 28 ┆T(SIG_IGN)); onhup = signal(┆ 0x04f200…09e600 53 49 47 48 55 50 2c 20 53 49 47 43 41 53 54 28 53 49 47 5f 49 47 4e 29 29 3b 0a 0a 20 20 20 20 ┆SIGHUP, SIGCAST(SIG_IGN)); ┆ 0x04f200…09e600 77 68 69 6c 65 20 28 28 77 20 3d 20 77 61 69 74 28 26 73 74 61 74 75 73 29 29 20 21 3d 20 70 69 ┆while ((w = wait(&status)) != pi┆ 0x04f200…09e600 64 20 26 26 20 77 20 21 3d 20 2d 31 29 0a 09 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 20 ┆d && w != -1) continue; if ┆ 0x04f200…09e600 28 77 20 3d 3d 20 2d 31 29 0a 09 73 74 61 74 75 73 2e 77 5f 73 74 61 74 75 73 20 3d 20 2d 31 3b ┆(w == -1) status.w_status = -1;┆ 0x04f200…09e600 0a 0a 20 20 20 20 28 76 6f 69 64 29 20 73 69 67 6e 61 6c 28 53 49 47 48 55 50 2c 20 53 49 47 43 ┆ (void) signal(SIGHUP, SIGC┆ 0x04f200…09e600 41 53 54 28 6f 6e 68 75 70 29 29 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 73 69 67 6e 61 6c 28 53 ┆AST(onhup)); (void) signal(S┆ 0x04f200…09e600 49 47 49 4e 54 2c 20 53 49 47 43 41 53 54 28 6f 6e 69 6e 74 29 29 3b 0a 20 20 20 20 28 76 6f 69 ┆IGINT, SIGCAST(onint)); (voi┆ 0x04f200…09e600 64 29 20 73 69 67 6e 61 6c 28 53 49 47 41 4c 52 4d 2c 20 53 49 47 43 41 53 54 28 6f 6e 61 6c 72 ┆d) signal(SIGALRM, SIGCAST(onalr┆ 0x04f200…09e600 6d 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 28 73 74 61 74 75 73 2e 77 5f 73 74 61 74 75 73 29 ┆m)); return(status.w_status)┆ 0x04f200…09e600 3b 0a 7d 0a 0a 2f 2a 20 66 77 61 69 74 2e 63 20 65 6e 64 73 20 68 65 72 65 20 2a 2f 0a 69 73 74 ┆; } /* fwait.c ends here */ ist┆ 0x04f200…09e600 65 72 20 69 6e 74 20 77 3b 0a 20 20 20 20 77 61 69 74 5f 74 20 73 74 61 74 75 73 3b 0a 20 20 20 ┆er int w; wait_t status; ┆ 0x04f200…09e600 20 63 61 74 63 68 5f 74 20 28 2a 6f 6e 61 6c 72 6d 29 28 29 2c 20 28 2a 6f 6e 69 6e 74 29 28 29 ┆ catch_t (*onalrm)(), (*onint)()┆ 0x04f200…09e600 2c 20 28 2a 6f 6e 68 75 70 29 28 29 3b 0a 0a 20 20 20 20 6f 6e 61 6c 72 6d 20 3d 20 73 69 67 6e ┆, (*onhup)(); onalrm = sign┆ 0x04f200…09e600 61 6c 28 53 49 47 41 4c 52 4d 2c 20 53 49 47 43 41 53 54 28 53 49 47 5f 49 47 4e 29 29 3b 0a 20 ┆al(SIGALRM, SIGCAST(SIG_IGN)); ┆ 0x04f200…09e600 20 20 20 6f 6e 69 6e 74 20 3d 20 73 69 67 6e 61 6c 28 53 49 47 49 4e 54 2c 20 53 49 47 43 41 53 ┆ onint = signal(SIGINT, SIGCAS┆ 0x04f200…09e600 54 28 53 49 47 5f 49 47 4e 29 29 3b 0a 20 20 20 20 6f 6e 68 75 70 20 3d 20 73 69 67 6e 61 6c 28 ┆T(SIG_IGN)); onhup = signal(┆ 0x04f200…09e600 53 49 47 48 55 50 2c 20 53 49 47 43 41 53 54 28 53 49 47 5f 49 47 4e 29 29 3b 0a 0a 20 20 20 20 ┆SIGHUP, SIGCAST(SIG_IGN)); ┆ 0x04f200…09e600 77 68 69 6c 65 20 28 28 77 20 3d 20 77 61 69 74 28 26 73 74 61 74 75 73 29 29 20 21 3d 20 70 69 ┆while ((w = wait(&status)) != pi┆ 0x04f200…09e600 64 20 26 26 20 77 20 21 3d 20 2d 31 29 0a 09 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 20 ┆d && w != -1) continue; if ┆ 0x04f200…09e600 28 77 20 3d 3d 20 2d 31 29 0a 09 73 74 61 74 75 73 73 72 63 2f 44 2e 70 6f 72 74 2f 67 65 74 64 ┆(w == -1) statussrc/D.port/getd┆ 0x04f200…09e600 61 74 65 2e 79 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆ate.y ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆ ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 20 20 20 34 34 34 20 00 20 20 20 ┆ 444 ┆ 0x04f200…09e600 31 34 35 20 00 20 20 20 20 20 31 20 00 20 20 20 20 20 20 33 32 36 37 37 20 20 34 34 35 36 31 35 ┆145 1 32677 445615┆ 0x04f200…09e600 34 30 35 35 20 20 20 37 36 37 31 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆4055 7671 ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆ ┆ […0x9…] 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 25 74 6f 6b 65 6e 20 49 44 20 4d 4f 4e 54 48 ┆ %token ID MONTH┆ 0x04f200…09e600 20 44 41 59 20 4d 45 52 49 44 49 41 4e 20 4e 55 4d 42 45 52 20 55 4e 49 54 20 4d 55 4e 49 54 20 ┆ DAY MERIDIAN NUMBER UNIT MUNIT ┆ 0x04f200…09e600 53 55 4e 49 54 20 5a 4f 4e 45 20 44 41 59 5a 4f 4e 45 20 41 47 4f 0a 25 7b 0a 09 2f 2a 20 09 53 ┆SUNIT ZONE DAYZONE AGO %{ /* S┆ 0x04f200…09e600 74 65 76 65 6e 20 4d 2e 20 42 65 6c 6c 6f 76 69 6e 20 28 75 6e 63 21 73 6d 62 29 09 09 09 2a 2f ┆teven M. Bellovin (unc!smb) */┆ 0x04f200…09e600 0a 09 2f 2a 09 44 65 70 74 2e 20 6f 66 20 43 6f 6d 70 75 74 65 72 20 53 63 69 65 6e 63 65 09 09 ┆ /* Dept. of Computer Science ┆ 0x04f200…09e600 09 2a 2f 0a 09 2f 2a 09 55 6e 69 76 65 72 73 69 74 79 20 6f 66 20 4e 6f 72 74 68 20 43 61 72 6f ┆ */ /* University of North Caro┆ 0x04f200…09e600 6c 69 6e 61 20 61 74 20 43 68 61 70 65 6c 20 48 69 6c 6c 09 2a 2f 0a 09 2f 2a 09 51 75 69 63 6b ┆lina at Chapel Hill */ /* Quick┆ 0x04f200…09e600 64 61 74 65 20 65 6e 74 72 79 20 70 6f 69 6e 74 20 61 64 64 65 64 20 62 79 20 45 72 69 63 20 52 ┆date entry point added by Eric R┆ 0x04f200…09e600 61 79 6d 6f 6e 64 09 2a 2f 0a 0a 23 69 6e 63 6c 75 64 65 20 22 73 79 73 74 65 6d 2e 68 22 0a 23 ┆aymond */ #include "system.h" #┆ 0x04f200…09e600 69 6e 63 6c 75 64 65 20 3c 63 74 79 70 65 2e 68 3e 0a 0a 23 64 65 66 69 6e 65 20 55 4e 4b 4e 4f ┆include <ctype.h> #define UNKNO┆ 0x04f200…09e600 57 4e 09 2d 31 0a 23 69 66 6e 64 65 66 20 4e 55 4c 4c 0a 23 64 65 66 69 6e 65 09 4e 55 4c 4c 09 ┆WN -1 #ifndef NULL #define NULL ┆ 0x04f200…09e600 30 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 64 61 79 73 65 63 20 28 32 34 4c 2a 36 30 4c ┆0 #endif #define daysec (24L*60L┆ 0x04f200…09e600 2a 36 30 4c 29 0a 23 64 65 66 69 6e 65 20 41 4d 20 31 0a 23 64 65 66 69 6e 65 20 50 4d 20 32 0a ┆*60L) #define AM 1 #define PM 2 ┆ 0x04f200…09e600 23 64 65 66 69 6e 65 20 44 41 59 4c 49 47 48 54 20 31 0a 23 64 65 66 69 6e 65 20 53 54 41 4e 44 ┆#define DAYLIGHT 1 #define STAND┆ 0x04f200…09e600 41 52 44 20 32 0a 23 64 65 66 69 6e 65 20 4d 41 59 42 45 20 20 20 20 33 0a 0a 73 74 61 74 69 63 ┆ARD 2 #define MAYBE 3 static┆ 0x04f200…09e600 20 69 6e 74 20 74 69 6d 65 66 6c 61 67 2c 20 7a 6f 6e 65 66 6c 61 67 2c 20 64 61 74 65 66 6c 61 ┆ int timeflag, zoneflag, datefla┆ 0x04f200…09e600 67 2c 20 64 61 79 66 6c 61 67 2c 20 72 65 6c 66 6c 61 67 3b 0a 73 74 61 74 69 63 20 74 69 6d 65 ┆g, dayflag, relflag; static time┆ 0x04f200…09e600 5f 74 20 72 65 6c 73 65 63 2c 20 72 65 6c 6d 6f 6e 74 68 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 ┆_t relsec, relmonth; static int ┆ 0x04f200…09e600 68 68 2c 20 6d 6d 2c 20 73 73 2c 20 6d 65 72 69 64 2c 20 73 64 61 79 6c 69 67 68 74 3b 0a 73 74 ┆hh, mm, ss, merid, sdaylight; st┆ 0x04f200…09e600 61 74 69 63 20 69 6e 74 20 64 61 79 6f 72 64 2c 20 64 61 79 72 65 71 3b 0a 73 74 61 74 69 63 20 ┆atic int dayord, dayreq; static ┆ 0x04f200…09e600 69 6e 74 20 6d 6f 6e 74 68 2c 20 64 61 79 2c 20 79 65 61 72 3b 0a 73 74 61 74 69 63 20 69 6e 74 ┆int month, day, year; static int┆ 0x04f200…09e600 20 6f 75 72 7a 6f 6e 65 3b 0a 25 7d 0a 0a 25 25 0a 74 69 6d 65 64 61 74 65 3a 20 09 09 2f 2a 20 ┆ ourzone; %} %% timedate: /* ┆ 0x04f200…09e600 65 6d 70 74 79 20 2a 2f 0a 09 7c 20 74 69 6d 65 64 61 74 65 20 69 74 65 6d 3b 0a 0a 69 74 65 6d ┆empty */ | timedate item; item┆ 0x04f200…09e600 3a 09 74 73 70 65 63 20 3d 0a 09 09 7b 74 69 6d 65 66 6c 61 67 2b 2b 3b 7d 0a 09 7c 20 7a 6f 6e ┆: tspec = {timeflag++;} | zon┆ 0x04f200…09e600 65 20 3d 0a 09 09 7b 7a 6f 6e 65 66 6c 61 67 2b 2b 3b 7d 0a 09 7c 20 64 74 73 70 65 63 20 3d 0a ┆e = {zoneflag++;} | dtspec = ┆ 0x04f200…09e600 09 09 7b 64 61 74 65 66 6c 61 67 2b 2b 3b 7d 0a 09 7c 20 64 79 73 70 65 63 20 3d 0a 09 09 7b 64 ┆ {dateflag++;} | dyspec = {d┆ 0x04f200…09e600 61 79 66 6c 61 67 2b 2b 3b 7d 0a 09 7c 20 72 73 70 65 63 20 3d 0a 09 09 7b 72 65 6c 66 6c 61 67 ┆ayflag++;} | rspec = {relflag┆ 0x04f200…09e600 2b 2b 3b 7d 0a 09 7c 20 6e 73 70 65 63 3b 0a 0a 6e 73 70 65 63 3a 09 4e 55 4d 42 45 52 20 3d 0a ┆++;} | nspec; nspec: NUMBER = ┆ 0x04f200…09e600 09 09 7b 0a 09 09 20 20 20 20 69 66 20 28 74 69 6d 65 66 6c 61 67 20 26 26 20 64 61 74 65 66 6c ┆ { if (timeflag && datefl┆ 0x04f200…09e600 61 67 20 26 26 20 21 72 65 6c 66 6c 61 67 29 0a 09 09 09 79 65 61 72 20 3d 20 24 31 3b 0a 09 09 ┆ag && !relflag) year = $1; ┆ 0x04f200…09e600 20 20 20 20 65 6c 73 65 0a 09 09 20 20 20 20 7b 0a 09 09 09 74 69 6d 65 66 6c 61 67 2b 2b 3b 0a ┆ else { timeflag++; ┆ 0x04f200…09e600 09 09 09 68 68 20 3d 20 24 31 2f 31 30 30 3b 0a 09 09 09 6d 6d 20 3d 20 24 31 25 31 30 30 3b 0a ┆ hh = $1/100; mm = $1%100; ┆ 0x04f200…09e600 09 09 09 73 73 20 3d 20 30 3b 0a 09 09 09 6d 65 72 69 64 20 3d 20 32 34 3b 0a 09 09 20 20 20 20 ┆ ss = 0; merid = 24; ┆ 0x04f200…09e600 7d 0a 09 09 7d 3b 0a 0a 74 73 70 65 63 3a 09 4e 55 4d 42 45 52 20 4d 45 52 49 44 49 41 4e 20 3d ┆} }; tspec: NUMBER MERIDIAN =┆ 0x04f200…09e600 0a 09 09 7b 68 68 20 3d 20 24 31 3b 20 6d 6d 20 3d 20 30 3b 20 73 73 20 3d 20 30 3b 20 6d 65 72 ┆ {hh = $1; mm = 0; ss = 0; mer┆ 0x04f200…09e600 69 64 20 3d 20 24 32 3b 7d 0a 09 7c 20 4e 55 4d 42 45 52 20 27 3a 27 20 4e 55 4d 42 45 52 20 3d ┆id = $2;} | NUMBER ':' NUMBER =┆ 0x04f200…09e600 0a 09 09 7b 68 68 20 3d 20 24 31 3b 20 6d 6d 20 3d 20 24 33 3b 20 6d 65 72 69 64 20 3d 20 32 34 ┆ {hh = $1; mm = $3; merid = 24┆ 0x04f200…09e600 3b 7d 0a 09 7c 20 4e 55 4d 42 45 52 20 27 3a 27 20 4e 55 4d 42 45 52 20 4d 45 52 49 44 49 41 4e ┆;} | NUMBER ':' NUMBER MERIDIAN┆ 0x04f200…09e600 20 3d 0a 09 09 7b 68 68 20 3d 20 24 31 3b 20 6d 6d 20 3d 20 24 33 3b 20 6d 65 72 69 64 20 3d 20 ┆ = {hh = $1; mm = $3; merid = ┆ 0x04f200…09e600 24 34 3b 7d 0a 20 20 09 7c 20 4e 55 4d 42 45 52 20 27 3a 27 20 4e 55 4d 42 45 52 20 4e 55 4d 42 ┆$4;} | NUMBER ':' NUMBER NUMB┆ 0x04f200…09e600 45 52 20 3d 0a 20 20 09 09 7b 68 68 20 3d 20 24 31 3b 20 6d 6d 20 3d 20 24 33 3b 20 6d 65 72 69 ┆ER = {hh = $1; mm = $3; meri┆ 0x04f200…09e600 64 20 3d 20 32 34 3b 0a 20 09 09 73 64 61 79 6c 69 67 68 74 20 3d 20 53 54 41 4e 44 41 52 44 3b ┆d = 24; sdaylight = STANDARD;┆ 0x04f200…09e600 20 6f 75 72 7a 6f 6e 65 20 3d 20 2d 28 24 34 25 31 30 30 20 2b 20 36 30 2a 28 24 34 2f 31 30 30 ┆ ourzone = -($4%100 + 60*($4/100┆ 0x04f200…09e600 29 29 3b 7d 0a 09 7c 20 4e 55 4d 42 45 52 20 27 3a 27 20 4e 55 4d 42 45 52 20 27 3a 27 20 4e 55 ┆));} | NUMBER ':' NUMBER ':' NU┆ 0x04f200…09e600 4d 42 45 52 20 3d 0a 09 09 7b 68 68 20 3d 20 24 31 3b 20 6d 6d 20 3d 20 24 33 3b 20 73 73 20 3d ┆MBER = {hh = $1; mm = $3; ss =┆ 0x04f200…09e600 20 24 35 3b 20 6d 65 72 69 64 20 3d 20 32 34 3b 7d 0a 09 7c 20 4e 55 4d 42 45 52 20 27 3a 27 20 ┆ $5; merid = 24;} | NUMBER ':' ┆ 0x04f200…09e600 4e 55 4d 42 45 52 20 27 3a 27 20 4e 55 4d 42 45 52 20 4d 45 52 49 44 49 41 4e 20 3d 0a 09 09 7b ┆NUMBER ':' NUMBER MERIDIAN = {┆ 0x04f200…09e600 68 68 20 3d 20 24 31 3b 20 6d 6d 20 3d 20 24 33 3b 20 73 73 20 3d 20 24 35 3b 20 6d 65 72 69 64 ┆hh = $1; mm = $3; ss = $5; merid┆ 0x04f200…09e600 20 3d 20 24 36 3b 7d 0a 20 20 09 7c 20 4e 55 4d 42 45 52 20 27 3a 27 20 4e 55 4d 42 45 52 20 27 ┆ = $6;} | NUMBER ':' NUMBER '┆ 0x04f200…09e600 3a 27 20 4e 55 4d 42 45 52 20 4e 55 4d 42 45 52 20 3d 0a 20 20 09 09 7b 0a 09 09 20 20 20 20 68 ┆:' NUMBER NUMBER = { h┆ 0x04f200…09e600 68 20 3d 20 24 31 3b 20 6d 6d 20 3d 20 24 33 3b 20 73 73 20 3d 20 24 35 3b 20 6d 65 72 69 64 20 ┆h = $1; mm = $3; ss = $5; merid ┆ 0x04f200…09e600 3d 20 32 34 3b 0a 09 09 20 20 20 20 73 64 61 79 6c 69 67 68 74 20 3d 20 53 54 41 4e 44 41 52 44 ┆= 24; sdaylight = STANDARD┆ 0x04f200…09e600 3b 20 6f 75 72 7a 6f 6e 65 20 3d 20 24 36 25 31 30 30 20 2b 20 36 30 2a 24 36 2f 31 30 30 3b 0a ┆; ourzone = $6%100 + 60*$6/100; ┆ 0x04f200…09e600 09 09 7d 0a 09 3b 0a 0a 7a 6f 6e 65 3a 09 5a 4f 4e 45 20 3d 0a 09 09 7b 6f 75 72 7a 6f 6e 65 20 ┆ } ; zone: ZONE = {ourzone ┆ 0x04f200…09e600 3d 20 24 31 3b 20 73 64 61 79 6c 69 67 68 74 20 3d 20 53 54 41 4e 44 41 52 44 3b 7d 0a 09 7c 20 ┆= $1; sdaylight = STANDARD;} | ┆ 0x04f200…09e600 44 41 59 5a 4f 4e 45 20 3d 0a 09 09 7b 6f 75 72 7a 6f 6e 65 20 3d 20 24 31 3b 20 73 64 61 79 6c ┆DAYZONE = {ourzone = $1; sdayl┆ 0x04f200…09e600 69 67 68 74 20 3d 20 44 41 59 4c 49 47 48 54 3b 7d 3b 0a 0a 64 79 73 70 65 63 3a 09 44 41 59 20 ┆ight = DAYLIGHT;}; dyspec: DAY ┆ 0x04f200…09e600 3d 0a 09 09 7b 64 61 79 6f 72 64 20 3d 20 31 3b 20 64 61 79 72 65 71 20 3d 20 24 31 3b 7d 0a 09 ┆= {dayord = 1; dayreq = $1;} ┆ 0x04f200…09e600 7c 20 44 41 59 20 27 2c 27 20 3d 0a 09 09 7b 64 61 79 6f 72 64 20 3d 20 31 3b 20 64 61 79 72 65 ┆| DAY ',' = {dayord = 1; dayre┆ 0x04f200…09e600 71 20 3d 20 24 31 3b 7d 0a 09 7c 20 4e 55 4d 42 45 52 20 44 41 59 20 3d 0a 09 09 7b 64 61 79 6f ┆q = $1;} | NUMBER DAY = {dayo┆ 0x04f200…09e600 72 64 20 3d 20 24 31 3b 20 64 61 79 72 65 71 20 3d 20 24 32 3b 7d 3b 0a 0a 64 74 73 70 65 63 3a ┆rd = $1; dayreq = $2;}; dtspec:┆ 0x04f200…09e600 09 4e 55 4d 42 45 52 20 27 2f 27 20 4e 55 4d 42 45 52 20 3d 0a 09 09 7b 6d 6f 6e 74 68 20 3d 20 ┆ NUMBER '/' NUMBER = {month = ┆ 0x04f200…09e600 24 31 3b 20 64 61 79 20 3d 20 24 33 3b 7d 0a 09 7c 20 4e 55 4d 42 45 52 20 27 2f 27 20 4e 55 4d ┆$1; day = $3;} | NUMBER '/' NUM┆ 0x04f200…09e600 42 45 52 20 27 2f 27 20 4e 55 4d 42 45 52 20 3d 0a 09 09 7b 6d 6f 6e 74 68 20 3d 20 24 31 3b 20 ┆BER '/' NUMBER = {month = $1; ┆ 0x04f200…09e600 64 61 79 20 3d 20 24 33 3b 20 79 65 61 72 20 3d 20 24 35 3b 7d 0a 09 7c 20 4d 4f 4e 54 48 20 4e ┆day = $3; year = $5;} | MONTH N┆ 0x04f200…09e600 55 4d 42 45 52 20 3d 0a 09 09 7b 6d 6f 6e 74 68 20 3d 20 24 31 3b 20 64 61 79 20 3d 20 24 32 3b ┆UMBER = {month = $1; day = $2;┆ 0x04f200…09e600 7d 0a 09 7c 20 4d 4f 4e 54 48 20 4e 55 4d 42 45 52 20 27 2c 27 20 4e 55 4d 42 45 52 20 3d 0a 09 ┆} | MONTH NUMBER ',' NUMBER = ┆ 0x04f200…09e600 09 7b 6d 6f 6e 74 68 20 3d 20 24 31 3b 20 64 61 79 20 3d 20 24 32 3b 20 79 65 61 72 20 3d 20 24 ┆ {month = $1; day = $2; year = $┆ 0x04f200…09e600 34 3b 7d 0a 09 7c 20 4e 55 4d 42 45 52 20 4d 4f 4e 54 48 20 3d 0a 09 09 7b 6d 6f 6e 74 68 20 3d ┆4;} | NUMBER MONTH = {month =┆ 0x04f200…09e600 20 24 32 3b 20 64 61 79 20 3d 20 24 31 3b 7d 0a 09 7c 20 4e 55 4d 42 45 52 20 4d 4f 4e 54 48 20 ┆ $2; day = $1;} | NUMBER MONTH ┆ 0x04f200…09e600 4e 55 4d 42 45 52 20 3d 0a 09 09 7b 6d 6f 6e 74 68 20 3d 20 24 32 3b 20 64 61 79 20 3d 20 24 31 ┆NUMBER = {month = $2; day = $1┆ 0x04f200…09e600 3b 20 79 65 61 72 20 3d 20 24 33 3b 7d 3b 0a 0a 0a 72 73 70 65 63 3a 09 4e 55 4d 42 45 52 20 55 ┆; year = $3;}; rspec: NUMBER U┆ 0x04f200…09e600 4e 49 54 20 3d 0a 09 09 7b 72 65 6c 73 65 63 20 2b 3d 20 20 36 30 4c 20 2a 20 24 31 20 2a 20 24 ┆NIT = {relsec += 60L * $1 * $┆ 0x04f200…09e600 32 3b 7d 0a 09 7c 20 4e 55 4d 42 45 52 20 4d 55 4e 49 54 20 3d 0a 09 09 7b 72 65 6c 6d 6f 6e 74 ┆2;} | NUMBER MUNIT = {relmont┆ 0x04f200…09e600 68 20 2b 3d 20 24 31 20 2a 20 24 32 3b 7d 0a 09 7c 20 4e 55 4d 42 45 52 20 53 55 4e 49 54 20 3d ┆h += $1 * $2;} | NUMBER SUNIT =┆ 0x04f200…09e600 0a 09 09 7b 72 65 6c 73 65 63 20 2b 3d 20 24 31 3b 7d 0a 09 7c 20 55 4e 49 54 20 3d 0a 09 09 7b ┆ {relsec += $1;} | UNIT = {┆ 0x04f200…09e600 72 65 6c 73 65 63 20 2b 3d 20 20 36 30 4c 20 2a 20 24 31 3b 7d 0a 09 7c 20 4d 55 4e 49 54 20 3d ┆relsec += 60L * $1;} | MUNIT =┆ 0x04f200…09e600 0a 09 09 7b 72 65 6c 6d 6f 6e 74 68 20 2b 3d 20 24 31 3b 7d 0a 09 7c 20 53 55 4e 49 54 20 3d 0a ┆ {relmonth += $1;} | SUNIT = ┆ 0x04f200…09e600 09 09 7b 72 65 6c 73 65 63 2b 2b 3b 7d 0a 09 7c 20 72 73 70 65 63 20 41 47 4f 20 3d 0a 09 09 7b ┆ {relsec++;} | rspec AGO = {┆ 0x04f200…09e600 72 65 6c 73 65 63 20 3d 20 2d 72 65 6c 73 65 63 3b 20 72 65 6c 6d 6f 6e 74 68 20 3d 20 2d 72 65 ┆relsec = -relsec; relmonth = -re┆ 0x04f200…09e600 6c 6d 6f 6e 74 68 3b 7d 3b 0a 25 25 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 64 61 79 73 5b 31 ┆lmonth;}; %% static int mdays[1┆ 0x04f200…09e600 32 5d 20 3d 0a 09 7b 33 31 2c 20 30 2c 20 33 31 2c 20 20 33 30 2c 20 33 31 2c 20 33 30 2c 20 20 ┆2] = {31, 0, 31, 30, 31, 30, ┆ 0x04f200…09e600 33 31 2c 20 33 31 2c 20 33 30 2c 20 20 33 31 2c 20 33 30 2c 20 33 31 7d 3b 0a 23 64 65 66 69 6e ┆31, 31, 30, 31, 30, 31}; #defin┆ 0x04f200…09e600 65 20 65 70 6f 63 68 20 31 39 37 30 0a 0a 73 74 61 74 69 63 20 74 69 6d 65 5f 74 20 64 61 74 65 ┆e epoch 1970 static time_t date┆ 0x04f200…09e600 63 6f 6e 76 28 6d 6d 2c 20 64 64 2c 20 79 79 2c 20 68 2c 20 6d 2c 20 73 2c 20 6d 65 72 2c 20 7a ┆conv(mm, dd, yy, h, m, s, mer, z┆ 0x04f200…09e600 6f 6e 65 2c 20 64 61 79 66 6c 61 67 29 0a 69 6e 74 20 6d 6d 2c 20 64 64 2c 20 79 79 2c 20 68 2c ┆one, dayflag) int mm, dd, yy, h,┆ 0x04f200…09e600 20 6d 2c 20 73 2c 20 6d 65 72 2c 20 7a 6f 6e 65 2c 20 64 61 79 66 6c 61 67 3b 0a 7b 0a 20 20 20 ┆ m, s, mer, zone, dayflag; { ┆ 0x04f200…09e600 20 74 69 6d 65 5f 74 20 74 6f 64 2c 20 6a 64 61 74 65 3b 0a 20 20 20 20 72 65 67 69 73 74 65 72 ┆ time_t tod, jdate; register┆ 0x04f200…09e600 20 69 6e 74 20 69 3b 0a 20 20 20 20 73 74 61 74 69 63 20 74 69 6d 65 5f 74 20 74 69 6d 65 63 6f ┆ int i; static time_t timeco┆ 0x04f200…09e600 6e 76 28 29 3b 0a 0a 20 20 20 20 69 66 20 28 79 79 20 3c 20 30 29 0a 09 79 79 20 3d 20 2d 79 79 ┆nv(); if (yy < 0) yy = -yy┆ 0x04f200…09e600 3b 0a 20 20 20 20 69 66 20 28 79 79 20 3c 20 31 30 30 29 0a 09 79 79 20 2b 3d 20 31 39 30 30 3b ┆; if (yy < 100) yy += 1900;┆ 0x04f200…09e600 0a 0a 20 20 20 20 6d 64 61 79 73 5b 31 5d 20 3d 20 32 38 20 2b 20 28 79 79 25 34 20 3d 3d 20 30 ┆ mdays[1] = 28 + (yy%4 == 0┆ 0x04f200…09e600 20 26 26 20 28 79 79 25 31 30 30 20 21 3d 20 30 20 7c 7c 20 79 79 25 34 30 30 20 3d 3d 20 30 29 ┆ && (yy%100 != 0 || yy%400 == 0)┆ 0x04f200…09e600 29 3b 0a 0a 20 20 20 20 69 66 20 28 79 79 3c 65 70 6f 63 68 20 7c 7c 20 79 79 3e 31 39 39 39 20 ┆); if (yy<epoch || yy>1999 ┆ 0x04f200…09e600 7c 7c 20 6d 6d 3c 31 20 7c 7c 20 6d 6d 3e 31 32 20 7c 7c 20 64 64 3c 31 20 7c 7c 20 64 64 3e 6d ┆|| mm<1 || mm>12 || dd<1 || dd>m┆ 0x04f200…09e600 64 61 79 73 5b 2d 2d 6d 6d 5d 29 0a 09 72 65 74 75 72 6e 28 55 4e 4b 4e 4f 57 4e 29 3b 0a 0a 20 ┆days[--mm]) return(UNKNOWN); ┆ 0x04f200…09e600 20 20 20 6a 64 61 74 65 20 3d 20 64 64 2d 31 3b 0a 20 20 20 20 66 6f 72 20 28 69 3d 30 3b 20 69 ┆ jdate = dd-1; for (i=0; i┆ 0x04f200…09e600 3c 6d 6d 3b 20 69 2b 2b 29 0a 09 6a 64 61 74 65 20 2b 3d 20 6d 64 61 79 73 5b 69 5d 3b 0a 20 20 ┆<mm; i++) jdate += mdays[i]; ┆ 0x04f200…09e600 20 20 66 6f 72 20 28 69 20 3d 20 65 70 6f 63 68 3b 20 69 20 3c 20 79 79 3b 20 69 2b 2b 29 0a 09 ┆ for (i = epoch; i < yy; i++) ┆ 0x04f200…09e600 6a 64 61 74 65 20 2b 3d 20 33 36 35 20 2b 20 28 69 25 34 20 3d 3d 20 30 29 3b 0a 20 20 20 20 6a ┆jdate += 365 + (i%4 == 0); j┆ 0x04f200…09e600 64 61 74 65 20 2a 3d 20 64 61 79 73 65 63 3b 0a 0a 20 20 20 20 69 66 20 28 28 74 6f 64 20 3d 20 ┆date *= daysec; if ((tod = ┆ 0x04f200…09e600 74 69 6d 65 63 6f 6e 76 28 68 2c 20 6d 2c 20 73 2c 20 6d 65 72 29 29 20 3c 20 30 29 0a 09 72 65 ┆timeconv(h, m, s, mer)) < 0) re┆ 0x04f200…09e600 74 75 72 6e 28 55 4e 4b 4e 4f 57 4e 29 3b 0a 0a 20 20 20 20 6a 64 61 74 65 20 2b 3d 20 28 74 6f ┆turn(UNKNOWN); jdate += (to┆ 0x04f200…09e600 64 20 2b 20 7a 6f 6e 65 20 2a 20 36 30 4c 29 3b 0a 20 20 20 20 69 66 20 28 64 61 79 66 6c 61 67 ┆d + zone * 60L); if (dayflag┆ 0x04f200…09e600 3d 3d 44 41 59 4c 49 47 48 54 20 7c 7c 20 28 64 61 79 66 6c 61 67 3d 3d 4d 41 59 42 45 26 26 6c ┆==DAYLIGHT || (dayflag==MAYBE&&l┆ 0x04f200…09e600 6f 63 61 6c 74 69 6d 65 28 26 6a 64 61 74 65 29 2d 3e 74 6d 5f 69 73 64 73 74 29 29 0a 09 6a 64 ┆ocaltime(&jdate)->tm_isdst)) jd┆ 0x04f200…09e600 61 74 65 20 2b 3d 20 2d 31 2a 36 30 2a 36 30 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 28 6a 64 ┆ate += -1*60*60; return (jd┆ 0x04f200…09e600 61 74 65 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 74 69 6d 65 5f 74 20 64 61 79 63 6f 6e 76 28 6f ┆ate); } static time_t dayconv(o┆ 0x04f200…09e600 72 64 2c 20 64 61 79 2c 20 6e 6f 77 29 0a 69 6e 74 20 6f 72 64 2c 20 64 61 79 3b 20 74 69 6d 65 ┆rd, day, now) int ord, day; time┆ 0x04f200…09e600 5f 74 20 6e 6f 77 3b 0a 7b 0a 20 20 20 20 72 65 67 69 73 74 65 72 20 73 74 72 75 63 74 20 74 6d ┆_t now; { register struct tm┆ 0x04f200…09e600 20 2a 6c 6f 63 74 69 6d 65 3b 0a 20 20 20 20 74 69 6d 65 5f 74 20 74 6f 64 3b 0a 20 20 20 20 73 ┆ *loctime; time_t tod; s┆ 0x04f200…09e600 74 61 74 69 63 20 74 69 6d 65 5f 74 20 64 61 79 6c 63 6f 72 72 28 29 3b 0a 0a 20 20 20 20 74 6f ┆tatic time_t daylcorr(); to┆ 0x04f200…09e600 64 20 3d 20 6e 6f 77 3b 0a 20 20 20 20 6c 6f 63 74 69 6d 65 20 3d 20 6c 6f 63 61 6c 74 69 6d 65 ┆d = now; loctime = localtime┆ 0x04f200…09e600 28 26 74 6f 64 29 3b 0a 20 20 20 20 74 6f 64 20 2b 3d 20 64 61 79 73 65 63 20 2a 20 28 28 64 61 ┆(&tod); tod += daysec * ((da┆ 0x04f200…09e600 79 20 2d 20 6c 6f 63 74 69 6d 65 2d 3e 74 6d 5f 77 64 61 79 20 2b 20 37 29 20 25 20 37 29 3b 0a ┆y - loctime->tm_wday + 7) % 7); ┆ 0x04f200…09e600 20 20 20 20 74 6f 64 20 2b 3d 20 37 4c 20 2a 20 64 61 79 73 65 63 2a 28 6f 72 64 3c 3d 30 3f 6f ┆ tod += 7L * daysec*(ord<=0?o┆ 0x04f200…09e600 72 64 3a 6f 72 64 2d 31 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 28 64 61 79 6c 63 6f 72 72 28 74 ┆rd:ord-1); return(daylcorr(t┆ 0x04f200…09e600 6f 64 2c 20 6e 6f 77 29 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 74 69 6d 65 5f 74 20 74 69 6d 65 ┆od, now)); } static time_t time┆ 0x04f200…09e600 63 6f 6e 76 28 68 68 2c 20 6d 6d 2c 20 73 73 2c 20 6d 65 72 29 0a 72 65 67 69 73 74 65 72 20 69 ┆conv(hh, mm, ss, mer) register i┆ 0x04f200…09e600 6e 74 20 68 68 2c 20 6d 6d 2c 20 73 73 2c 20 6d 65 72 3b 0a 7b 0a 20 20 20 20 69 66 20 28 6d 6d ┆nt hh, mm, ss, mer; { if (mm┆ 0x04f200…09e600 20 3c 20 30 20 7c 7c 20 6d 6d 20 3e 20 35 39 20 7c 7c 20 73 73 20 3c 20 30 20 7c 7c 20 73 73 20 ┆ < 0 || mm > 59 || ss < 0 || ss ┆ 0x04f200…09e600 3e 20 35 39 29 0a 09 72 65 74 75 72 6e 28 55 4e 4b 4e 4f 57 4e 29 3b 0a 20 20 20 20 73 77 69 74 ┆> 59) return(UNKNOWN); swit┆ 0x04f200…09e600 63 68 20 28 6d 65 72 29 0a 20 20 20 20 7b 0a 20 20 20 20 63 61 73 65 20 41 4d 3a 0a 09 69 66 20 ┆ch (mer) { case AM: if ┆ 0x04f200…09e600 28 68 68 20 3c 20 31 20 7c 7c 20 68 68 20 3e 20 31 32 29 0a 09 20 20 20 20 72 65 74 75 72 6e 28 ┆(hh < 1 || hh > 12) return(┆ 0x04f200…09e600 55 4e 4b 4e 4f 57 4e 29 3b 0a 09 72 65 74 75 72 6e 28 36 30 4c 20 2a 20 28 28 68 68 25 31 32 29 ┆UNKNOWN); return(60L * ((hh%12)┆ 0x04f200…09e600 2a 36 30 4c 20 2b 20 6d 6d 29 2b 73 73 29 3b 0a 20 20 20 20 63 61 73 65 20 50 4d 3a 0a 09 69 66 ┆*60L + mm)+ss); case PM: if┆ 0x04f200…09e600 20 28 68 68 20 3c 20 31 20 7c 7c 20 68 68 20 3e 20 31 32 29 0a 09 20 20 20 20 72 65 74 75 72 6e ┆ (hh < 1 || hh > 12) return┆ 0x04f200…09e600 28 55 4e 4b 4e 4f 57 4e 29 3b 0a 09 72 65 74 75 72 6e 28 36 30 4c 20 2a 20 28 28 68 68 25 31 32 ┆(UNKNOWN); return(60L * ((hh%12┆ 0x04f200…09e600 20 2b 31 32 29 2a 36 30 4c 20 2b 20 6d 6d 29 2b 73 73 29 3b 0a 20 20 20 20 63 61 73 65 20 32 34 ┆ +12)*60L + mm)+ss); case 24┆ 0x04f200…09e600 3a 0a 09 69 66 20 28 68 68 20 3c 20 30 20 7c 7c 20 68 68 20 3e 20 32 33 29 0a 09 20 20 20 20 72 ┆: if (hh < 0 || hh > 23) r┆ 0x04f200…09e600 65 74 75 72 6e 20 28 55 4e 4b 4e 4f 57 4e 29 3b 0a 09 72 65 74 75 72 6e 28 36 30 4c 20 2a 20 28 ┆eturn (UNKNOWN); return(60L * (┆ 0x04f200…09e600 68 68 2a 36 30 4c 20 2b 20 6d 6d 29 2b 73 73 29 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 09 ┆hh*60L + mm)+ss); default: ┆ 0x04f200…09e600 72 65 74 75 72 6e 28 55 4e 4b 4e 4f 57 4e 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 ┆return(UNKNOWN); } } static┆ 0x04f200…09e600 20 74 69 6d 65 5f 74 20 6d 6f 6e 74 68 61 64 64 28 73 64 61 74 65 2c 20 72 65 6c 6d 6f 6e 74 68 ┆ time_t monthadd(sdate, relmonth┆ 0x04f200…09e600 29 0a 74 69 6d 65 5f 74 20 73 64 61 74 65 2c 20 72 65 6c 6d 6f 6e 74 68 3b 0a 7b 0a 20 20 20 20 ┆) time_t sdate, relmonth; { ┆ 0x04f200…09e600 73 74 72 75 63 74 20 74 6d 20 2a 6c 74 69 6d 65 3b 0a 20 20 20 20 74 69 6d 65 5f 74 20 64 61 74 ┆struct tm *ltime; time_t dat┆ 0x04f200…09e600 65 63 6f 6e 76 28 29 3b 0a 20 20 20 20 73 74 61 74 69 63 20 74 69 6d 65 5f 74 20 64 61 79 6c 63 ┆econv(); static time_t daylc┆ 0x04f200…09e600 6f 72 72 28 29 3b 0a 20 20 20 20 69 6e 74 20 6d 6d 2c 20 79 79 3b 0a 0a 20 20 20 20 69 66 20 28 ┆orr(); int mm, yy; if (┆ 0x04f200…09e600 72 65 6c 6d 6f 6e 74 68 20 3d 3d 20 30 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 6c 74 69 ┆relmonth == 0) return 0; lti┆ 0x04f200…09e600 6d 65 20 3d 20 6c 6f 63 61 6c 74 69 6d 65 28 26 73 64 61 74 65 29 3b 0a 20 20 20 20 6d 6d 20 3d ┆me = localtime(&sdate); mm =┆ 0x04f200…09e600 20 31 32 2a 6c 74 69 6d 65 2d 3e 74 6d 5f 79 65 61 72 20 2b 20 6c 74 69 6d 65 2d 3e 74 6d 5f 6d ┆ 12*ltime->tm_year + ltime->tm_m┆ 0x04f200…09e600 6f 6e 20 2b 20 72 65 6c 6d 6f 6e 74 68 3b 0a 20 20 20 20 79 79 20 3d 20 6d 6d 2f 31 32 3b 0a 20 ┆on + relmonth; yy = mm/12; ┆ 0x04f200…09e600 20 20 20 6d 6d 20 3d 20 6d 6d 25 31 32 20 2b 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 64 61 ┆ mm = mm%12 + 1; return da┆ 0x04f200…09e600 79 6c 63 6f 72 72 28 64 61 74 65 63 6f 6e 76 28 6d 6d 2c 20 6c 74 69 6d 65 2d 3e 74 6d 5f 6d 64 ┆ylcorr(dateconv(mm, ltime->tm_md┆ 0x04f200…09e600 61 79 2c 20 79 79 2c 20 6c 74 69 6d 65 2d 3e 74 6d 5f 68 6f 75 72 2c 0a 09 09 09 20 20 20 20 20 ┆ay, yy, ltime->tm_hour, ┆ 0x04f200…09e600 6c 74 69 6d 65 2d 3e 74 6d 5f 6d 69 6e 2c 20 6c 74 69 6d 65 2d 3e 74 6d 5f 73 65 63 2c 20 32 34 ┆ltime->tm_min, ltime->tm_sec, 24┆ 0x04f200…09e600 2c 20 6f 75 72 7a 6f 6e 65 2c 20 4d 41 59 42 45 29 2c 20 73 64 61 74 65 29 3b 0a 7d 0a 0a 73 74 ┆, ourzone, MAYBE), sdate); } st┆ 0x04f200…09e600 61 74 69 63 20 74 69 6d 65 5f 74 20 64 61 79 6c 63 6f 72 72 28 66 75 74 75 72 65 2c 20 6e 6f 77 ┆atic time_t daylcorr(future, now┆ 0x04f200…09e600 29 0a 74 69 6d 65 5f 74 20 66 75 74 75 72 65 2c 20 6e 6f 77 3b 0a 7b 0a 20 20 20 20 69 6e 74 20 ┆) time_t future, now; { int ┆ 0x04f200…09e600 66 64 61 79 6c 2c 20 6e 6f 77 64 61 79 6c 3b 0a 0a 20 20 20 20 6e 6f 77 64 61 79 6c 20 3d 20 28 ┆fdayl, nowdayl; nowdayl = (┆ 0x04f200…09e600 6c 6f 63 61 6c 74 69 6d 65 28 26 6e 6f 77 29 2d 3e 74 6d 5f 68 6f 75 72 2b 31 29 20 25 20 32 34 ┆localtime(&now)->tm_hour+1) % 24┆ 0x04f200…09e600 3b 0a 20 20 20 20 66 64 61 79 6c 20 3d 20 28 6c 6f 63 61 6c 74 69 6d 65 28 26 66 75 74 75 72 65 ┆; fdayl = (localtime(&future┆ 0x04f200…09e600 29 2d 3e 74 6d 5f 68 6f 75 72 2b 31 29 20 25 20 32 34 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 ┆)->tm_hour+1) % 24; return (┆ 0x04f200…09e600 66 75 74 75 72 65 2d 6e 6f 77 29 20 2b 20 36 30 4c 2a 36 30 4c 2a 28 6e 6f 77 64 61 79 6c 2d 66 ┆future-now) + 60L*60L*(nowdayl-f┆ 0x04f200…09e600 64 61 79 6c 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 6c 70 74 72 3b 0a 0a 73 74 ┆dayl); } static char *lptr; st┆ 0x04f200…09e600 61 74 69 63 20 69 6e 74 20 79 79 6c 65 78 28 29 0a 7b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e ┆atic int yylex() { extern in┆ 0x04f200…09e600 74 20 79 79 6c 76 61 6c 3b 0a 20 20 20 20 69 6e 74 20 73 69 67 6e 3b 0a 20 20 20 20 72 65 67 69 ┆t yylval; int sign; regi┆ 0x04f200…09e600 73 74 65 72 20 63 68 61 72 20 63 3b 0a 20 20 20 20 72 65 67 69 73 74 65 72 20 63 68 61 72 20 2a ┆ster char c; register char *┆ 0x04f200…09e600 70 3b 0a 20 20 20 20 63 68 61 72 20 69 64 62 75 66 5b 32 30 5d 3b 0a 20 20 20 20 69 6e 74 20 70 ┆p; char idbuf[20]; int p┆ 0x04f200…09e600 63 6e 74 3b 0a 20 20 20 20 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 6f 6b 75 70 28 29 3b 0a 0a 20 ┆cnt; static int lookup(); ┆ 0x04f200…09e600 20 20 20 66 6f 72 20 28 3b 3b 29 0a 20 20 20 20 7b 0a 09 77 68 69 6c 65 20 28 69 73 73 70 61 63 ┆ for (;;) { while (isspac┆ 0x04f200…09e600 65 28 2a 6c 70 74 72 29 29 0a 09 20 20 20 20 6c 70 74 72 2b 2b 3b 0a 0a 09 69 66 20 28 69 73 64 ┆e(*lptr)) lptr++; if (isd┆ 0x04f200…09e600 69 67 69 74 28 63 20 3d 20 2a 6c 70 74 72 29 20 7c 7c 20 63 20 3d 3d 20 27 2d 27 20 7c 7c 20 63 ┆igit(c = *lptr) || c == '-' || c┆ 0x04f200…09e600 20 3d 3d 20 27 2b 27 29 0a 09 7b 0a 09 20 20 20 20 69 66 20 28 63 3d 3d 20 27 2d 27 20 7c 7c 20 ┆ == '+') { if (c== '-' || ┆ 0x04f200…09e600 63 20 3d 3d 20 27 2b 27 29 0a 09 20 20 20 20 7b 0a 09 09 69 66 20 28 63 20 3d 3d 20 27 2d 27 29 ┆c == '+') { if (c == '-')┆ 0x04f200…09e600 0a 09 09 20 20 20 20 73 69 67 6e 20 3d 20 2d 31 3b 0a 09 09 65 6c 73 65 0a 09 09 20 20 20 20 73 ┆ sign = -1; else s┆ 0x04f200…09e600 69 67 6e 20 3d 20 31 3b 0a 09 09 69 66 20 28 21 69 73 64 69 67 69 74 28 2a 2b 2b 6c 70 74 72 29 ┆ign = 1; if (!isdigit(*++lptr)┆ 0x04f200…09e600 29 0a 09 09 7b 0a 09 09 20 20 20 20 2f 2a 20 79 79 6c 76 61 6c 20 3d 20 73 69 67 6e 3b 20 72 65 ┆) { /* yylval = sign; re┆ 0x04f200…09e600 74 75 72 6e 20 28 4e 55 4d 42 45 52 29 3b 20 2a 2f 0a 09 09 20 20 20 20 72 65 74 75 72 6e 20 79 ┆turn (NUMBER); */ return y┆ 0x04f200…09e600 79 6c 65 78 28 29 3b 09 2f 2a 20 73 6b 69 70 20 74 68 65 20 27 2d 27 20 73 69 67 6e 20 2a 2f 0a ┆ylex(); /* skip the '-' sign */ ┆ 0x04f200…09e600 09 09 7d 0a 09 20 20 20 20 7d 20 65 6c 73 65 0a 09 09 73 69 67 6e 20 3d 20 31 3b 0a 09 20 20 20 ┆ } } else sign = 1; ┆ 0x04f200…09e600 20 79 79 6c 76 61 6c 20 3d 20 30 3b 0a 09 20 20 20 20 77 68 69 6c 65 20 28 69 73 64 69 67 69 74 ┆ yylval = 0; while (isdigit┆ 0x04f200…09e600 28 63 20 3d 20 2a 6c 70 74 72 2b 2b 29 29 20 79 79 6c 76 61 6c 20 3d 20 31 30 2a 79 79 6c 76 61 ┆(c = *lptr++)) yylval = 10*yylva┆ 0x04f200…09e600 6c 20 2b 20 63 20 2d 20 27 30 27 3b 0a 09 20 20 20 20 79 79 6c 76 61 6c 20 2a 3d 20 73 69 67 6e ┆l + c - '0'; yylval *= sign┆ 0x04f200…09e600 3b 0a 09 20 20 20 20 6c 70 74 72 2d 2d 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 28 4e 55 4d 42 ┆; lptr--; return (NUMB┆ 0x04f200…09e600 45 52 29 3b 0a 09 7d 0a 09 65 6c 73 65 20 69 66 20 28 69 73 61 6c 70 68 61 28 63 29 29 0a 09 7b ┆ER); } else if (isalpha(c)) {┆ 0x04f200…09e600 0a 09 20 20 20 20 70 20 3d 20 69 64 62 75 66 3b 0a 09 20 20 20 20 77 68 69 6c 65 20 28 69 73 61 ┆ p = idbuf; while (isa┆ 0x04f200…09e600 6c 70 68 61 28 63 20 3d 20 2a 6c 70 74 72 2b 2b 29 20 7c 7c 20 63 3d 3d 27 2e 27 29 0a 09 09 2a ┆lpha(c = *lptr++) || c=='.') *┆ 0x04f200…09e600 70 2b 2b 20 3d 20 63 3b 0a 09 20 20 20 20 2a 70 20 3d 20 27 5c 30 27 3b 0a 09 20 20 20 20 6c 70 ┆p++ = c; *p = '\0'; lp┆ 0x04f200…09e600 74 72 2d 2d 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 28 6c 6f 6f 6b 75 70 28 69 64 62 75 66 29 ┆tr--; return (lookup(idbuf)┆ 0x04f200…09e600 29 3b 0a 09 7d 0a 09 65 6c 73 65 20 69 66 20 28 63 20 3d 3d 20 27 28 27 29 0a 09 7b 0a 09 20 20 ┆); } else if (c == '(') { ┆ 0x04f200…09e600 20 20 70 63 6e 74 20 3d 20 30 3b 0a 09 20 20 20 20 64 6f 20 7b 0a 09 09 63 20 3d 20 2a 6c 70 74 ┆ pcnt = 0; do { c = *lpt┆ 0x04f200…09e600 72 2b 2b 3b 0a 09 09 69 66 20 28 63 20 3d 3d 20 27 5c 30 27 29 20 72 65 74 75 72 6e 28 63 29 3b ┆r++; if (c == '\0') return(c);┆ 0x04f200…09e600 0a 09 09 65 6c 73 65 20 69 66 20 28 63 20 3d 3d 20 27 28 27 29 20 70 63 6e 74 2b 2b 3b 0a 09 09 ┆ else if (c == '(') pcnt++; ┆ 0x04f200…09e600 65 6c 73 65 20 69 66 20 28 63 20 3d 3d 20 27 29 27 29 20 70 63 6e 74 2d 2d 3b 0a 09 20 20 20 20 ┆else if (c == ')') pcnt--; ┆ 0x04f200…09e600 7d 20 77 68 69 6c 65 0a 09 09 28 70 63 6e 74 20 3e 20 30 29 3b 0a 09 7d 0a 09 65 6c 73 65 0a 09 ┆} while (pcnt > 0); } else ┆ 0x04f200…09e600 20 20 20 20 72 65 74 75 72 6e 20 28 2a 6c 70 74 72 2b 2b 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0a 73 ┆ return (*lptr++); } } s┆ 0x04f200…09e600 74 72 75 63 74 20 74 61 62 6c 65 0a 7b 0a 20 20 20 20 63 68 61 72 20 2a 6e 61 6d 65 3b 0a 20 20 ┆truct table { char *name; ┆ 0x04f200…09e600 20 20 69 6e 74 20 74 79 70 65 2c 20 76 61 6c 75 65 3b 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 74 61 ┆ int type, value; }; struct ta┆ 0x04f200…09e600 62 6c 65 20 6d 64 74 61 62 5b 5d 20 3d 20 7b 0a 09 7b 22 6a 61 6e 75 61 72 79 22 2c 20 4d 4f 4e ┆ble mdtab[] = { {"january", MON┆ 0x04f200…09e600 54 48 2c 20 31 7d 2c 0a 09 7b 22 66 65 62 72 75 61 72 79 22 2c 20 4d 4f 4e 54 48 2c 20 32 7d 2c ┆TH, 1}, {"february", MONTH, 2},┆ 0x04f200…09e600 0a 09 7b 22 6d 61 72 63 68 22 2c 20 4d 4f 4e 54 48 2c 20 33 7d 2c 0a 09 7b 22 61 70 72 69 6c 22 ┆ {"march", MONTH, 3}, {"april"┆ 0x04f200…09e600 2c 20 4d 4f 4e 54 48 2c 20 34 7d 2c 0a 09 7b 22 6d 61 79 22 2c 20 4d 4f 4e 54 48 2c 20 35 7d 2c ┆, MONTH, 4}, {"may", MONTH, 5},┆ 0x04f200…09e600 0a 09 7b 22 6a 75 6e 65 22 2c 20 4d 4f 4e 54 48 2c 20 36 7d 2c 0a 09 7b 22 6a 75 6c 79 22 2c 20 ┆ {"june", MONTH, 6}, {"july", ┆ 0x04f200…09e600 4d 4f 4e 54 48 2c 20 37 7d 2c 0a 09 7b 22 61 75 67 75 73 74 22 2c 20 4d 4f 4e 54 48 2c 20 38 7d ┆MONTH, 7}, {"august", MONTH, 8}┆ 0x04f200…09e600 2c 0a 09 7b 22 73 65 70 74 65 6d 62 65 72 22 2c 20 4d 4f 4e 54 48 2c 20 39 7d 2c 0a 09 7b 22 6f ┆, {"september", MONTH, 9}, {"o┆ 0x04f200…09e600 63 74 6f 62 65 72 22 2c 20 4d 4f 4e 54 48 2c 20 31 30 7d 2c 0a 09 7b 22 6e 6f 76 65 6d 62 65 72 ┆ctober", MONTH, 10}, {"november┆ 0x04f200…09e600 22 2c 20 4d 4f 4e 54 48 2c 20 31 31 7d 2c 0a 09 7b 22 64 65 63 65 6d 62 65 72 22 2c 20 4d 4f 4e ┆", MONTH, 11}, {"december", MON┆ 0x04f200…09e600 54 48 2c 20 31 32 7d 2c 0a 0a 09 7b 22 73 75 6e 64 61 79 22 2c 20 44 41 59 2c 20 30 7d 2c 0a 09 ┆TH, 12}, {"sunday", DAY, 0}, ┆ 0x04f200…09e600 7b 22 6d 6f 6e 64 61 79 22 2c 20 44 41 59 2c 20 31 7d 2c 0a 09 7b 22 74 75 65 73 64 61 79 22 2c ┆{"monday", DAY, 1}, {"tuesday",┆ 0x04f200…09e600 20 44 41 59 2c 20 32 7d 2c 0a 09 7b 22 74 75 65 73 22 2c 20 44 41 59 2c 20 32 7d 2c 0a 09 7b 22 ┆ DAY, 2}, {"tues", DAY, 2}, {"┆ 0x04f200…09e600 77 65 64 6e 65 73 64 61 79 22 2c 20 44 41 59 2c 20 33 7d 2c 0a 09 7b 22 77 65 64 6e 65 73 22 2c ┆wednesday", DAY, 3}, {"wednes",┆ 0x04f200…09e600 20 44 41 59 2c 20 33 7d 2c 0a 09 7b 22 74 68 75 72 73 64 61 79 22 2c 20 44 41 59 2c 20 34 7d 2c ┆ DAY, 3}, {"thursday", DAY, 4},┆ 0x04f200…09e600 0a 09 7b 22 74 68 75 72 22 2c 20 44 41 59 2c 20 34 7d 2c 0a 09 7b 22 74 68 75 72 73 22 2c 20 44 ┆ {"thur", DAY, 4}, {"thurs", D┆ 0x04f200…09e600 41 59 2c 20 34 7d 2c 0a 09 7b 22 66 72 69 64 61 79 22 2c 20 44 41 59 2c 20 35 7d 2c 0a 09 7b 22 ┆AY, 4}, {"friday", DAY, 5}, {"┆ 0x04f200…09e600 73 61 74 75 72 64 61 79 22 2c 20 44 41 59 2c 20 36 7d 2c 0a 09 7b 30 2c 20 30 2c 20 30 7d 7d 3b ┆saturday", DAY, 6}, {0, 0, 0}};┆ 0x04f200…09e600 0a 0a 23 64 65 66 69 6e 65 20 48 52 53 20 2a 36 30 0a 23 64 65 66 69 6e 65 20 48 41 4c 46 48 52 ┆ #define HRS *60 #define HALFHR┆ 0x04f200…09e600 20 33 30 0a 73 74 72 75 63 74 20 74 61 62 6c 65 20 6d 7a 74 61 62 5b 5d 20 3d 20 7b 0a 09 7b 22 ┆ 30 struct table mztab[] = { {"┆ 0x04f200…09e600 61 2e 6d 2e 22 2c 20 4d 45 52 49 44 49 41 4e 2c 20 41 4d 7d 2c 0a 09 7b 22 61 6d 22 2c 20 4d 45 ┆a.m.", MERIDIAN, AM}, {"am", ME┆ 0x04f200…09e600 52 49 44 49 41 4e 2c 20 41 4d 7d 2c 0a 09 7b 22 70 2e 6d 2e 22 2c 20 4d 45 52 49 44 49 41 4e 2c ┆RIDIAN, AM}, {"p.m.", MERIDIAN,┆ 0x04f200…09e600 20 50 4d 7d 2c 0a 09 7b 22 70 6d 22 2c 20 4d 45 52 49 44 49 41 4e 2c 20 50 4d 7d 2c 0a 09 7b 22 ┆ PM}, {"pm", MERIDIAN, PM}, {"┆ 0x04f200…09e600 6e 73 74 22 2c 20 5a 4f 4e 45 2c 20 33 20 48 52 53 20 2b 20 48 41 4c 46 48 52 7d 2c 09 09 2f 2a ┆nst", ZONE, 3 HRS + HALFHR}, /*┆ 0x04f200…09e600 20 4e 65 77 66 6f 75 6e 64 6c 61 6e 64 20 2a 2f 0a 09 7b 22 6e 2e 73 2e 74 2e 22 2c 20 5a 4f 4e ┆ Newfoundland */ {"n.s.t.", ZON┆ 0x04f200…09e600 45 2c 20 33 20 48 52 53 20 2b 20 48 41 4c 46 48 52 7d 2c 0a 09 7b 22 61 73 74 22 2c 20 5a 4f 4e ┆E, 3 HRS + HALFHR}, {"ast", ZON┆ 0x04f200…09e600 45 2c 20 34 20 48 52 53 7d 2c 09 09 2f 2a 20 41 74 6c 61 6e 74 69 63 20 2a 2f 0a 09 7b 22 61 2e ┆E, 4 HRS}, /* Atlantic */ {"a.┆ 0x04f200…09e600 73 2e 74 2e 22 2c 20 5a 4f 4e 45 2c 20 34 20 48 52 53 7d 2c 0a 09 7b 22 61 64 74 22 2c 20 44 41 ┆s.t.", ZONE, 4 HRS}, {"adt", DA┆ 0x04f200…09e600 59 5a 4f 4e 45 2c 20 34 20 48 52 53 7d 2c 0a 09 7b 22 61 2e 64 2e 74 2e 22 2c 20 44 41 59 5a 4f ┆YZONE, 4 HRS}, {"a.d.t.", DAYZO┆ 0x04f200…09e600 4e 45 2c 20 34 20 48 52 53 7d 2c 0a 09 7b 22 65 73 74 22 2c 20 5a 4f 4e 45 2c 20 35 20 48 52 53 ┆NE, 4 HRS}, {"est", ZONE, 5 HRS┆ 0x04f200…09e600 7d 2c 09 09 2f 2a 20 45 61 73 74 65 72 6e 20 2a 2f 0a 09 7b 22 65 2e 73 2e 74 2e 22 2c 20 5a 4f ┆}, /* Eastern */ {"e.s.t.", ZO┆ 0x04f200…09e600 4e 45 2c 20 35 20 48 52 53 7d 2c 0a 09 7b 22 65 64 74 22 2c 20 44 41 59 5a 4f 4e 45 2c 20 35 20 ┆NE, 5 HRS}, {"edt", DAYZONE, 5 ┆ 0x04f200…09e600 48 52 53 7d 2c 0a 09 7b 22 65 2e 64 2e 74 2e 22 2c 20 44 41 59 5a 4f 4e 45 2c 20 35 20 48 52 53 ┆HRS}, {"e.d.t.", DAYZONE, 5 HRS┆ 0x04f200…09e600 7d 2c 0a 09 7b 22 63 73 74 22 2c 20 5a 4f 4e 45 2c 20 36 20 48 52 53 7d 2c 09 09 2f 2a 20 43 65 ┆}, {"cst", ZONE, 6 HRS}, /* Ce┆ 0x04f200…09e600 6e 74 72 61 6c 20 2a 2f 0a 09 7b 22 63 2e 73 2e 74 2e 22 2c 20 5a 4f 4e 45 2c 20 36 20 48 52 53 ┆ntral */ {"c.s.t.", ZONE, 6 HRS┆ 0x04f200…09e600 7d 2c 0a 09 7b 22 63 64 74 22 2c 20 44 41 59 5a 4f 4e 45 2c 20 36 20 48 52 53 7d 2c 0a 09 7b 22 ┆}, {"cdt", DAYZONE, 6 HRS}, {"┆ 0x04f200…09e600 63 2e 64 2e 74 2e 22 2c 20 44 41 59 5a 4f 4e 45 2c 20 36 20 48 52 53 7d 2c 0a 09 7b 22 6d 73 74 ┆c.d.t.", DAYZONE, 6 HRS}, {"mst┆ 0x04f200…09e600 22 2c 20 5a 4f 4e 45 2c 20 37 20 48 52 53 7d 2c 09 09 2f 2a 20 4d 6f 75 6e 74 61 69 6e 20 2a 2f ┆", ZONE, 7 HRS}, /* Mountain */┆ 0x04f200…09e600 0a 09 7b 22 6d 2e 73 2e 74 2e 22 2c 20 5a 4f 4e 45 2c 20 37 20 48 52 53 7d 2c 0a 09 7b 22 6d 64 ┆ {"m.s.t.", ZONE, 7 HRS}, {"md┆ 0x04f200…09e600 74 22 2c 20 44 41 59 5a 4f 4e 45 2c 20 37 20 48 52 53 7d 2c 0a 09 7b 22 6d 2e 64 2e 74 2e 22 2c ┆t", DAYZONE, 7 HRS}, {"m.d.t.",┆ 0x04f200…09e600 20 44 41 59 5a 4f 4e 45 2c 20 37 20 48 52 53 7d 2c 0a 09 7b 22 70 73 74 22 2c 20 5a 4f 4e 45 2c ┆ DAYZONE, 7 HRS}, {"pst", ZONE,┆ 0x04f200…09e600 20 38 20 48 52 53 7d 2c 09 09 2f 2a 20 50 61 63 69 66 69 63 20 2a 2f 0a 09 7b 22 70 2e 73 2e 74 ┆ 8 HRS}, /* Pacific */ {"p.s.t┆ 0x04f200…09e600 2e 22 2c 20 5a 4f 4e 45 2c 20 38 20 48 52 53 7d 2c 0a 09 7b 22 70 64 74 22 2c 20 44 41 59 5a 4f ┆.", ZONE, 8 HRS}, {"pdt", DAYZO┆ 0x04f200…09e600 4e 45 2c 20 38 20 48 52 53 7d 2c 0a 09 7b 22 70 2e 64 2e 74 2e 22 2c 20 44 41 59 5a 4f 4e 45 2c ┆NE, 8 HRS}, {"p.d.t.", DAYZONE,┆ 0x04f200…09e600 20 38 20 48 52 53 7d 2c 0a 09 7b 22 79 73 74 22 2c 20 5a 4f 4e 45 2c 20 39 20 48 52 53 7d 2c 09 ┆ 8 HRS}, {"yst", ZONE, 9 HRS}, ┆ 0x04f200…09e600 09 2f 2a 20 59 75 6b 6f 6e 20 2a 2f 0a 09 7b 22 79 2e 73 2e 74 2e 22 2c 20 5a 4f 4e 45 2c 20 39 ┆ /* Yukon */ {"y.s.t.", ZONE, 9┆ 0x04f200…09e600 20 48 52 53 7d 2c 0a 09 7b 22 79 64 74 22 2c 20 44 41 59 5a 4f 4e 45 2c 20 39 20 48 52 53 7d 2c ┆ HRS}, {"ydt", DAYZONE, 9 HRS},┆ 0x04f200…09e600 0a 09 7b 22 79 2e 64 2e 74 2e 22 2c 20 44 41 59 5a 4f 4e 45 2c 20 39 20 48 52 53 7d 2c 0a 09 7b ┆ {"y.d.t.", DAYZONE, 9 HRS}, {┆ 0x04f200…09e600 22 68 73 74 22 2c 20 5a 4f 4e 45 2c 20 31 30 20 48 52 53 7d 2c 09 09 2f 2a 20 48 61 77 61 69 69 ┆"hst", ZONE, 10 HRS}, /* Hawaii┆ 0x04f200…09e600 20 2a 2f 0a 09 7b 22 68 2e 73 2e 74 2e 22 2c 20 5a 4f 4e 45 2c 20 31 30 20 48 52 53 7d 2c 0a 09 ┆ */ {"h.s.t.", ZONE, 10 HRS}, ┆ 0x04f200…09e600 7b 22 68 64 74 22 2c 20 44 41 59 5a 4f 4e 45 2c 20 31 30 20 48 52 53 7d 2c 0a 09 7b 22 68 2e 64 ┆{"hdt", DAYZONE, 10 HRS}, {"h.d┆ 0x04f200…09e600 2e 74 2e 22 2c 20 44 41 59 5a 4f 4e 45 2c 20 31 30 20 48 52 53 7d 2c 0a 0a 09 7b 22 67 6d 74 22 ┆.t.", DAYZONE, 10 HRS}, {"gmt"┆ 0x04f200…09e600 2c 20 5a 4f 4e 45 2c 20 30 20 48 52 53 7d 2c 0a 09 7b 22 67 2e 6d 2e 74 2e 22 2c 20 5a 4f 4e 45 ┆, ZONE, 0 HRS}, {"g.m.t.", ZONE┆ 0x04f200…09e600 2c 20 30 20 48 52 53 7d 2c 0a 09 7b 22 62 73 74 22 2c 20 44 41 59 5a 4f 4e 45 2c 20 30 20 48 52 ┆, 0 HRS}, {"bst", DAYZONE, 0 HR┆ 0x04f200…09e600 53 7d 2c 09 09 2f 2a 20 42 72 69 74 69 73 68 20 53 75 6d 6d 65 72 20 54 69 6d 65 20 2a 2f 0a 09 ┆S}, /* British Summer Time */ ┆ 0x04f200…09e600 7b 22 62 2e 73 2e 74 2e 22 2c 20 44 41 59 5a 4f 4e 45 2c 20 30 20 48 52 53 7d 2c 0a 09 7b 22 65 ┆{"b.s.t.", DAYZONE, 0 HRS}, {"e┆ 0x04f200…09e600 65 74 22 2c 20 5a 4f 4e 45 2c 20 30 20 48 52 53 7d 2c 09 09 2f 2a 20 45 75 72 6f 70 65 61 6e 20 ┆et", ZONE, 0 HRS}, /* European ┆ 0x04f200…09e600 45 61 73 74 65 72 6e 20 54 69 6d 65 20 2a 2f 0a 09 7b 22 65 2e 65 2e 74 2e 22 2c 20 5a 4f 4e 45 ┆Eastern Time */ {"e.e.t.", ZONE┆ 0x04f200…09e600 2c 20 30 20 48 52 53 7d 2c 0a 09 7b 22 65 65 73 74 22 2c 20 44 41 59 5a 4f 4e 45 2c 20 30 20 48 ┆, 0 HRS}, {"eest", DAYZONE, 0 H┆ 0x04f200…09e600 52 53 7d 2c 09 2f 2a 20 45 75 72 6f 70 65 61 6e 20 45 61 73 74 65 72 6e 20 53 75 6d 6d 65 72 20 ┆RS}, /* European Eastern Summer ┆ 0x04f200…09e600 54 69 6d 65 20 2a 2f 0a 09 7b 22 65 2e 65 2e 73 2e 74 2e 22 2c 20 44 41 59 5a 4f 4e 45 2c 20 30 ┆Time */ {"e.e.s.t.", DAYZONE, 0┆ 0x04f200…09e600 20 48 52 53 7d 2c 0a 09 7b 22 6d 65 74 22 2c 20 5a 4f 4e 45 2c 20 2d 31 20 48 52 53 7d 2c 09 09 ┆ HRS}, {"met", ZONE, -1 HRS}, ┆ 0x04f200…09e600 2f 2a 20 4d 69 64 64 6c 65 20 45 75 72 6f 70 65 61 6e 20 54 69 6d 65 20 2a 2f 0a 09 7b 22 6d 2e ┆/* Middle European Time */ {"m.┆ 0x04f200…09e600 65 2e 74 2e 22 2c 20 5a 4f 4e 45 2c 20 2d 31 20 48 52 53 7d 2c 0a 09 7b 22 6d 65 73 74 22 2c 20 ┆e.t.", ZONE, -1 HRS}, {"mest", ┆ 0x04f200…09e600 44 41 59 5a 4f 4e 45 2c 20 2d 31 20 48 52 53 7d 2c 09 2f 2a 20 4d 69 64 64 6c 65 20 45 75 72 6f ┆DAYZONE, -1 HRS}, /* Middle Euro┆ 0x04f200…09e600 70 65 61 6e 20 53 75 6d 6d 65 72 20 54 69 6d 65 20 2a 2f 0a 09 7b 22 6d 2e 65 2e 73 2e 74 2e 22 ┆pean Summer Time */ {"m.e.s.t."┆ 0x04f200…09e600 2c 20 44 41 59 5a 4f 4e 45 2c 20 2d 31 20 48 52 53 7d 2c 0a 09 7b 22 77 65 74 22 2c 20 5a 4f 4e ┆, DAYZONE, -1 HRS}, {"wet", ZON┆ 0x04f200…09e600 45 2c 20 2d 32 20 48 52 53 20 7d 2c 09 09 2f 2a 20 57 65 73 74 65 72 6e 20 45 75 72 6f 70 65 61 ┆E, -2 HRS }, /* Western Europea┆ 0x04f200…09e600 6e 20 54 69 6d 65 20 2a 2f 0a 09 7b 22 77 2e 65 2e 74 2e 22 2c 20 5a 4f 4e 45 2c 20 2d 32 20 48 ┆n Time */ {"w.e.t.", ZONE, -2 H┆ 0x04f200…09e600 52 53 20 7d 2c 0a 09 7b 22 77 65 73 74 22 2c 20 44 41 59 5a 4f 4e 45 2c 20 2d 32 20 48 52 53 7d ┆RS }, {"west", DAYZONE, -2 HRS}┆ 0x04f200…09e600 2c 09 2f 2a 20 57 65 73 74 65 72 6e 20 45 75 72 6f 70 65 61 6e 20 53 75 6d 6d 65 72 20 54 69 6d ┆, /* Western European Summer Tim┆ 0x04f200…09e600 65 20 2a 2f 0a 09 7b 22 77 2e 65 2e 73 2e 74 2e 22 2c 20 44 41 59 5a 4f 4e 45 2c 20 2d 32 20 48 ┆e */ {"w.e.s.t.", DAYZONE, -2 H┆ 0x04f200…09e600 52 53 7d 2c 0a 0a 09 7b 22 6a 73 74 22 2c 20 5a 4f 4e 45 2c 20 2d 39 20 48 52 53 7d 2c 09 09 2f ┆RS}, {"jst", ZONE, -9 HRS}, /┆ 0x04f200…09e600 2a 20 4a 61 70 61 6e 20 53 74 61 6e 64 61 72 64 20 54 69 6d 65 20 2a 2f 0a 09 7b 22 6a 2e 73 2e ┆* Japan Standard Time */ {"j.s.┆ 0x04f200…09e600 74 2e 22 2c 20 5a 4f 4e 45 2c 20 2d 39 20 48 52 53 7d 2c 09 2f 2a 20 4a 61 70 61 6e 20 53 74 61 ┆t.", ZONE, -9 HRS}, /* Japan Sta┆ 0x04f200…09e600 6e 64 61 72 64 20 54 69 6d 65 20 2a 2f 0a 09 09 09 09 09 2f 2a 20 4e 6f 20 64 61 79 6c 69 67 68 ┆ndard Time */ /* No dayligh┆ 0x04f200…09e600 74 20 73 61 76 69 6e 67 73 20 74 69 6d 65 20 2a 2f 0a 0a 09 7b 22 61 65 73 74 22 2c 20 5a 4f 4e ┆t savings time */ {"aest", ZON┆ 0x04f200…09e600 45 2c 20 2d 31 30 20 48 52 53 7d 2c 09 2f 2a 20 41 75 73 74 72 61 6c 69 61 6e 20 45 61 73 74 65 ┆E, -10 HRS}, /* Australian Easte┆ 0x04f200…09e600 72 6e 20 54 69 6d 65 20 2a 2f 0a 09 7b 22 61 2e 65 2e 73 2e 74 2e 22 2c 20 5a 4f 4e 45 2c 20 2d ┆rn Time */ {"a.e.s.t.", ZONE, -┆ 0x04f200…09e600 31 30 20 48 52 53 7d 2c 0a 09 7b 22 61 65 73 73 74 22 2c 20 44 41 59 5a 4f 4e 45 2c 20 2d 31 30 ┆10 HRS}, {"aesst", DAYZONE, -10┆ 0x04f200…09e600 20 48 52 53 7d 2c 09 2f 2a 20 41 75 73 74 72 61 6c 69 61 6e 20 45 61 73 74 65 72 6e 20 53 75 6d ┆ HRS}, /* Australian Eastern Sum┆ 0x04f200…09e600 6d 65 72 20 54 69 6d 65 20 2a 2f 0a 09 7b 22 61 2e 65 2e 73 2e 73 2e 74 2e 22 2c 20 44 41 59 5a ┆mer Time */ {"a.e.s.s.t.", DAYZ┆ 0x04f200…09e600 4f 4e 45 2c 20 2d 31 30 20 48 52 53 7d 2c 0a 09 7b 22 61 63 73 74 22 2c 20 5a 4f 4e 45 2c 20 2d ┆ONE, -10 HRS}, {"acst", ZONE, -┆ 0x04f200…09e600 28 39 20 48 52 53 20 2b 20 48 41 4c 46 48 52 29 7d 2c 09 2f 2a 20 41 75 73 74 72 61 6c 69 61 6e ┆(9 HRS + HALFHR)}, /* Australian┆ 0x04f200…09e600 20 43 65 6e 74 72 61 6c 20 54 69 6d 65 20 2a 2f 0a 09 7b 22 61 2e 63 2e 73 2e 74 2e 22 2c 20 5a ┆ Central Time */ {"a.c.s.t.", Z┆ 0x04f200…09e600 4f 4e 45 2c 20 2d 28 39 20 48 52 53 20 2b 20 48 41 4c 46 48 52 29 7d 2c 0a 09 7b 22 61 63 73 73 ┆ONE, -(9 HRS + HALFHR)}, {"acss┆ 0x04f200…09e600 74 22 2c 20 44 41 59 5a 4f 4e 45 2c 20 2d 28 39 20 48 52 53 20 2b 20 48 41 4c 46 48 52 29 7d 2c ┆t", DAYZONE, -(9 HRS + HALFHR)},┆ 0x04f200…09e600 09 2f 2a 20 41 75 73 74 72 61 6c 69 61 6e 20 43 65 6e 74 72 61 6c 20 53 75 6d 6d 65 72 20 2a 2f ┆ /* Australian Central Summer */┆ 0x04f200…09e600 0a 09 7b 22 61 2e 63 2e 73 2e 73 2e 74 2e 22 2c 20 44 41 59 5a 4f 4e 45 2c 20 2d 28 39 20 48 52 ┆ {"a.c.s.s.t.", DAYZONE, -(9 HR┆ 0x04f200…09e600 53 20 2b 20 48 41 4c 46 48 52 29 7d 2c 0a 09 7b 22 61 77 73 74 22 2c 20 5a 4f 4e 45 2c 20 2d 38 ┆S + HALFHR)}, {"awst", ZONE, -8┆ 0x04f200…09e600 20 48 52 53 7d 2c 09 09 2f 2a 20 41 75 73 74 72 61 6c 69 61 6e 20 57 65 73 74 65 72 6e 20 54 69 ┆ HRS}, /* Australian Western Ti┆ 0x04f200…09e600 6d 65 20 2a 2f 0a 09 7b 22 61 2e 77 2e 73 2e 74 2e 22 2c 20 5a 4f 4e 45 2c 20 2d 38 20 48 52 53 ┆me */ {"a.w.s.t.", ZONE, -8 HRS┆ 0x04f200…09e600 7d 2c 09 2f 2a 20 28 6e 6f 20 64 61 79 6c 69 67 68 74 20 74 69 6d 65 20 74 68 65 72 65 2c 20 49 ┆}, /* (no daylight time there, I┆ 0x04f200…09e600 27 6d 20 74 6f 6c 64 20 2a 2f 0a 09 7b 30 2c 20 30 2c 20 30 7d 7d 3b 0a 0a 73 74 72 75 63 74 20 ┆'m told */ {0, 0, 0}}; struct ┆ 0x04f200…09e600 74 61 62 6c 65 20 75 6e 69 74 74 62 5b 5d 20 3d 20 7b 0a 09 7b 22 79 65 61 72 22 2c 20 4d 55 4e ┆table unittb[] = { {"year", MUN┆ 0x04f200…09e600 49 54 2c 20 31 32 7d 2c 0a 09 7b 22 6d 6f 6e 74 68 22 2c 20 4d 55 4e 49 54 2c 20 31 7d 2c 0a 09 ┆IT, 12}, {"month", MUNIT, 1}, ┆ 0x04f200…09e600 7b 22 66 6f 72 74 6e 69 67 68 74 22 2c 20 55 4e 49 54 2c 20 31 34 2a 32 34 2a 36 30 7d 2c 0a 09 ┆{"fortnight", UNIT, 14*24*60}, ┆ 0x04f200…09e600 7b 22 77 65 65 6b 22 2c 20 55 4e 49 54 2c 20 37 2a 32 34 2a 36 30 7d 2c 0a 09 7b 22 64 61 79 22 ┆{"week", UNIT, 7*24*60}, {"day"┆ 0x04f200…09e600 2c 20 55 4e 49 54 2c 20 31 2a 32 34 2a 36 30 7d 2c 0a 09 7b 22 68 6f 75 72 22 2c 20 55 4e 49 54 ┆, UNIT, 1*24*60}, {"hour", UNIT┆ 0x04f200…09e600 2c 20 36 30 7d 2c 0a 09 7b 22 6d 69 6e 75 74 65 22 2c 20 55 4e 49 54 2c 20 31 7d 2c 0a 09 7b 22 ┆, 60}, {"minute", UNIT, 1}, {"┆ 0x04f200…09e600 6d 69 6e 22 2c 20 55 4e 49 54 2c 20 31 7d 2c 0a 09 7b 22 73 65 63 6f 6e 64 22 2c 20 53 55 4e 49 ┆min", UNIT, 1}, {"second", SUNI┆ 0x04f200…09e600 54 2c 20 31 7d 2c 0a 09 7b 22 73 65 63 22 2c 20 53 55 4e 49 54 2c 20 31 7d 2c 0a 09 7b 30 2c 20 ┆T, 1}, {"sec", SUNIT, 1}, {0, ┆ 0x04f200…09e600 30 2c 20 30 7d 7d 3b 0a 0a 73 74 72 75 63 74 20 74 61 62 6c 65 20 6f 74 68 65 72 74 62 5b 5d 20 ┆0, 0}}; struct table othertb[] ┆ 0x04f200…09e600 3d 20 7b 0a 09 7b 22 74 6f 6d 6f 72 72 6f 77 22 2c 20 55 4e 49 54 2c 20 31 2a 32 34 2a 36 30 7d ┆= { {"tomorrow", UNIT, 1*24*60}┆ 0x04f200…09e600 2c 0a 09 7b 22 79 65 73 74 65 72 64 61 79 22 2c 20 55 4e 49 54 2c 20 2d 31 2a 32 34 2a 36 30 7d ┆, {"yesterday", UNIT, -1*24*60}┆ 0x04f200…09e600 2c 0a 09 7b 22 74 6f 64 61 79 22 2c 20 55 4e 49 54 2c 20 30 7d 2c 0a 09 7b 22 6e 6f 77 22 2c 20 ┆, {"today", UNIT, 0}, {"now", ┆ 0x04f200…09e600 55 4e 49 54 2c 20 30 7d 2c 0a 09 7b 22 6c 61 73 74 22 2c 20 4e 55 4d 42 45 52 2c 20 2d 31 7d 2c ┆UNIT, 0}, {"last", NUMBER, -1},┆ 0x04f200…09e600 0a 09 7b 22 74 68 69 73 22 2c 20 55 4e 49 54 2c 20 30 7d 2c 0a 09 7b 22 6e 65 78 74 22 2c 20 4e ┆ {"this", UNIT, 0}, {"next", N┆ 0x04f200…09e600 55 4d 42 45 52 2c 20 32 7d 2c 0a 09 7b 22 66 69 72 73 74 22 2c 20 4e 55 4d 42 45 52 2c 20 31 7d ┆UMBER, 2}, {"first", NUMBER, 1}┆ 0x04f200…09e600 2c 0a 09 2f 2a 20 7b 22 73 65 63 6f 6e 64 22 2c 20 4e 55 4d 42 45 52 2c 20 32 7d 2c 20 2a 2f 0a ┆, /* {"second", NUMBER, 2}, */ ┆ 0x04f200…09e600 09 7b 22 74 68 69 72 64 22 2c 20 4e 55 4d 42 45 52 2c 20 33 7d 2c 0a 09 7b 22 66 6f 75 72 74 68 ┆ {"third", NUMBER, 3}, {"fourth┆ 0x04f200…09e600 22 2c 20 4e 55 4d 42 45 52 2c 20 34 7d 2c 0a 09 7b 22 66 69 66 74 68 22 2c 20 4e 55 4d 42 45 52 ┆", NUMBER, 4}, {"fifth", NUMBER┆ 0x04f200…09e600 2c 20 35 7d 2c 0a 09 7b 22 73 69 78 74 68 22 2c 20 4e 55 4d 42 45 52 2c 20 36 7d 2c 0a 09 7b 22 ┆, 5}, {"sixth", NUMBER, 6}, {"┆ 0x04f200…09e600 73 65 76 65 6e 74 68 22 2c 20 4e 55 4d 42 45 52 2c 20 37 7d 2c 0a 09 7b 22 65 69 67 74 68 22 2c ┆seventh", NUMBER, 7}, {"eigth",┆ 0x04f200…09e600 20 4e 55 4d 42 45 52 2c 20 38 7d 2c 0a 09 7b 22 6e 69 6e 74 68 22 2c 20 4e 55 4d 42 45 52 2c 20 ┆ NUMBER, 8}, {"ninth", NUMBER, ┆ 0x04f200…09e600 39 7d 2c 0a 09 7b 22 74 65 6e 74 68 22 2c 20 4e 55 4d 42 45 52 2c 20 31 30 7d 2c 0a 09 7b 22 65 ┆9}, {"tenth", NUMBER, 10}, {"e┆ 0x04f200…09e600 6c 65 76 65 6e 74 68 22 2c 20 4e 55 4d 42 45 52 2c 20 31 31 7d 2c 0a 09 7b 22 74 77 65 6c 66 74 ┆leventh", NUMBER, 11}, {"twelft┆ 0x04f200…09e600 68 22 2c 20 4e 55 4d 42 45 52 2c 20 31 32 7d 2c 0a 09 7b 22 61 67 6f 22 2c 20 41 47 4f 2c 20 31 ┆h", NUMBER, 12}, {"ago", AGO, 1┆ 0x04f200…09e600 7d 2c 0a 09 7b 30 2c 20 30 2c 20 30 7d 7d 3b 0a 0a 73 74 72 75 63 74 20 74 61 62 6c 65 20 6d 69 ┆}, {0, 0, 0}}; struct table mi┆ 0x04f200…09e600 6c 7a 6f 6e 65 5b 5d 20 3d 20 7b 0a 09 7b 22 61 22 2c 20 5a 4f 4e 45 2c 20 31 20 48 52 53 7d 2c ┆lzone[] = { {"a", ZONE, 1 HRS},┆ 0x04f200…09e600 0a 09 7b 22 62 22 2c 20 5a 4f 4e 45 2c 20 32 20 48 52 53 7d 2c 0a 09 7b 22 63 22 2c 20 5a 4f 4e ┆ {"b", ZONE, 2 HRS}, {"c", ZON┆ 0x04f200…09e600 45 2c 20 33 20 48 52 53 7d 2c 0a 09 7b 22 64 22 2c 20 5a 4f 4e 45 2c 20 34 20 48 52 53 7d 2c 0a ┆E, 3 HRS}, {"d", ZONE, 4 HRS}, ┆ 0x04f200…09e600 09 7b 22 65 22 2c 20 5a 4f 4e 45 2c 20 35 20 48 52 53 7d 2c 0a 09 7b 22 66 22 2c 20 5a 4f 4e 45 ┆ {"e", ZONE, 5 HRS}, {"f", ZONE┆ 0x04f200…09e600 2c 20 36 20 48 52 53 7d 2c 0a 09 7b 22 67 22 2c 20 5a 4f 4e 45 2c 20 37 20 48 52 53 7d 2c 0a 09 ┆, 6 HRS}, {"g", ZONE, 7 HRS}, ┆ 0x04f200…09e600 7b 22 68 22 2c 20 5a 4f 4e 45 2c 20 38 20 48 52 53 7d 2c 0a 09 7b 22 69 22 2c 20 5a 4f 4e 45 2c ┆{"h", ZONE, 8 HRS}, {"i", ZONE,┆ 0x04f200…09e600 20 39 20 48 52 53 7d 2c 0a 09 7b 22 6b 22 2c 20 5a 4f 4e 45 2c 20 31 30 20 48 52 53 7d 2c 0a 09 ┆ 9 HRS}, {"k", ZONE, 10 HRS}, ┆ 0x04f200…09e600 7b 22 6c 22 2c 20 5a 4f 4e 45 2c 20 31 31 20 48 52 53 7d 2c 0a 09 7b 22 6d 22 2c 20 5a 4f 4e 45 ┆{"l", ZONE, 11 HRS}, {"m", ZONE┆ 0x04f200…09e600 2c 20 31 32 20 48 52 53 7d 2c 0a 09 7b 22 6e 22 2c 20 5a 4f 4e 45 2c 20 2d 31 20 48 52 53 7d 2c ┆, 12 HRS}, {"n", ZONE, -1 HRS},┆ 0x04f200…09e600 0a 09 7b 22 6f 22 2c 20 5a 4f 4e 45 2c 20 2d 32 20 48 52 53 7d 2c 0a 09 7b 22 70 22 2c 20 5a 4f ┆ {"o", ZONE, -2 HRS}, {"p", ZO┆ 0x04f200…09e600 4e 45 2c 20 2d 33 20 48 52 53 7d 2c 0a 09 7b 22 71 22 2c 20 5a 4f 4e 45 2c 20 2d 34 20 48 52 53 ┆NE, -3 HRS}, {"q", ZONE, -4 HRS┆ 0x04f200…09e600 7d 2c 0a 09 7b 22 72 22 2c 20 5a 4f 4e 45 2c 20 2d 35 20 48 52 53 7d 2c 0a 09 7b 22 73 22 2c 20 ┆}, {"r", ZONE, -5 HRS}, {"s", ┆ 0x04f200…09e600 5a 4f 4e 45 2c 20 2d 36 20 48 52 53 7d 2c 0a 09 7b 22 74 22 2c 20 5a 4f 4e 45 2c 20 2d 37 20 48 ┆ZONE, -6 HRS}, {"t", ZONE, -7 H┆ 0x04f200…09e600 52 53 7d 2c 0a 09 7b 22 75 22 2c 20 5a 4f 4e 45 2c 20 2d 38 20 48 52 53 7d 2c 0a 09 7b 22 76 22 ┆RS}, {"u", ZONE, -8 HRS}, {"v"┆ 0x04f200…09e600 2c 20 5a 4f 4e 45 2c 20 2d 39 20 48 52 53 7d 2c 0a 09 7b 22 77 22 2c 20 5a 4f 4e 45 2c 20 2d 31 ┆, ZONE, -9 HRS}, {"w", ZONE, -1┆ 0x04f200…09e600 30 20 48 52 53 7d 2c 0a 09 7b 22 78 22 2c 20 5a 4f 4e 45 2c 20 2d 31 31 20 48 52 53 7d 2c 0a 09 ┆0 HRS}, {"x", ZONE, -11 HRS}, ┆ 0x04f200…09e600 7b 22 79 22 2c 20 5a 4f 4e 45 2c 20 2d 31 32 20 48 52 53 7d 2c 0a 09 7b 22 7a 22 2c 20 5a 4f 4e ┆{"y", ZONE, -12 HRS}, {"z", ZON┆ 0x04f200…09e600 45 2c 20 30 20 48 52 53 7d 2c 0a 09 7b 30 2c 20 30 2c 20 30 7d 7d 3b 0a 0a 73 74 61 74 69 63 20 ┆E, 0 HRS}, {0, 0, 0}}; static ┆ 0x04f200…09e600 69 6e 74 20 6c 6f 6f 6b 75 70 28 69 64 29 0a 63 68 61 72 20 2a 69 64 3b 0a 7b 0a 23 64 65 66 69 ┆int lookup(id) char *id; { #defi┆ 0x04f200…09e600 6e 65 20 67 6f 74 69 74 20 28 79 79 6c 76 61 6c 3d 69 2d 3e 76 61 6c 75 65 2c 20 20 69 2d 3e 74 ┆ne gotit (yylval=i->value, i->t┆ 0x04f200…09e600 79 70 65 29 0a 20 20 0a 20 20 20 20 63 68 61 72 20 69 64 76 61 72 5b 31 32 38 5d 3b 0a 20 20 20 ┆ype) char idvar[128]; ┆ 0x04f200…09e600 20 72 65 67 69 73 74 65 72 20 63 68 61 72 20 2a 6a 2c 20 2a 6b 3b 0a 20 20 20 20 72 65 67 69 73 ┆ register char *j, *k; regis┆ 0x04f200…09e600 74 65 72 20 73 74 72 75 63 74 20 74 61 62 6c 65 20 2a 69 3b 0a 20 20 20 20 69 6e 74 20 61 62 62 ┆ter struct table *i; int abb┆ 0x04f200…09e600 72 65 76 3b 0a 20 20 0a 20 20 20 20 28 76 6f 69 64 29 20 73 74 72 63 70 79 28 69 64 76 61 72 2c ┆rev; (void) strcpy(idvar,┆ 0x04f200…09e600 20 69 64 29 3b 0a 20 20 20 20 6a 20 3d 20 69 64 76 61 72 3b 0a 20 20 20 20 6b 20 3d 20 69 64 20 ┆ id); j = idvar; k = id ┆ 0x04f200…09e600 2d 20 31 3b 0a 20 20 20 20 77 68 69 6c 65 20 28 2a 2b 2b 6b 29 0a 09 2a 6a 2b 2b 20 3d 20 69 73 ┆- 1; while (*++k) *j++ = is┆ 0x04f200…09e600 75 70 70 65 72 28 2a 6b 29 20 3f 20 74 6f 6c 6f 77 65 72 28 2a 6b 29 20 3a 20 2a 6b 3b 0a 20 20 ┆upper(*k) ? tolower(*k) : *k; ┆ 0x04f200…09e600 20 20 2a 6a 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 72 6c 65 6e 28 69 64 76 ┆ *j = '\0'; if (strlen(idv┆ 0x04f200…09e600 61 72 29 20 3d 3d 20 33 29 0a 09 61 62 62 72 65 76 20 3d 20 31 3b 0a 20 20 20 20 65 6c 73 65 0a ┆ar) == 3) abbrev = 1; else ┆ 0x04f200…09e600 09 69 66 20 28 73 74 72 6c 65 6e 28 69 64 76 61 72 29 20 3d 3d 20 34 20 26 26 20 69 64 76 61 72 ┆ if (strlen(idvar) == 4 && idvar┆ 0x04f200…09e600 5b 33 5d 20 3d 3d 20 27 2e 27 29 20 7b 0a 09 20 20 20 20 61 62 62 72 65 76 20 3d 20 31 3b 0a 09 ┆[3] == '.') { abbrev = 1; ┆ 0x04f200…09e600 20 20 20 20 69 64 76 61 72 5b 33 5d 20 3d 20 27 5c 30 27 3b 0a 09 7d 0a 09 65 6c 73 65 0a 09 20 ┆ idvar[3] = '\0'; } else ┆ 0x04f200…09e600 20 20 20 61 62 62 72 65 76 20 3d 20 30 3b 0a 20 20 0a 20 20 20 20 66 6f 72 20 28 69 20 3d 20 6d ┆ abbrev = 0; for (i = m┆ 0x04f200…09e600 64 74 61 62 3b 20 69 2d 3e 6e 61 6d 65 3b 20 69 2b 2b 29 20 7b 0a 09 6b 20 3d 20 69 64 76 61 72 ┆dtab; i->name; i++) { k = idvar┆ 0x04f200…09e600 3b 0a 09 66 6f 72 20 28 6a 20 3d 20 69 2d 3e 6e 61 6d 65 3b 20 2a 6a 2b 2b 20 3d 3d 20 2a 6b 2b ┆; for (j = i->name; *j++ == *k+┆ 0x04f200…09e600 2b 3b 29 20 7b 0a 09 20 20 20 20 69 66 20 28 61 62 62 72 65 76 20 26 26 20 6a 20 3d 3d 20 69 2d ┆+;) { if (abbrev && j == i-┆ 0x04f200…09e600 3e 6e 61 6d 65 2b 33 29 0a 09 09 72 65 74 75 72 6e 20 67 6f 74 69 74 3b 0a 09 20 20 20 20 69 66 ┆>name+3) return gotit; if┆ 0x04f200…09e600 20 28 6a 5b 2d 31 5d 20 3d 3d 20 30 29 0a 09 09 72 65 74 75 72 6e 20 67 6f 74 69 74 3b 0a 09 7d ┆ (j[-1] == 0) return gotit; }┆ 0x04f200…09e600 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 66 6f 72 20 28 69 20 3d 20 6d 7a 74 61 62 3b 20 69 2d ┆ } for (i = mztab; i-┆ 0x04f200…09e600 3e 6e 61 6d 65 3b 20 69 2b 2b 29 0a 09 69 66 20 28 73 74 72 63 6d 70 28 69 2d 3e 6e 61 6d 65 2c ┆>name; i++) if (strcmp(i->name,┆ 0x04f200…09e600 20 69 64 76 61 72 29 20 3d 3d 20 30 29 0a 09 20 20 20 20 72 65 74 75 72 6e 20 67 6f 74 69 74 3b ┆ idvar) == 0) return gotit;┆ 0x04f200…09e600 0a 20 20 0a 20 20 20 20 66 6f 72 20 28 69 3d 6d 7a 74 61 62 3b 20 69 2d 3e 6e 61 6d 65 3b 20 69 ┆ for (i=mztab; i->name; i┆ 0x04f200…09e600 2b 2b 29 0a 09 69 66 20 28 73 74 72 63 6d 70 28 69 2d 3e 6e 61 6d 65 2c 20 69 64 76 61 72 29 20 ┆++) if (strcmp(i->name, idvar) ┆ 0x04f200…09e600 3d 3d 20 30 29 0a 09 20 20 20 20 72 65 74 75 72 6e 20 67 6f 74 69 74 3b 0a 20 20 0a 20 20 20 20 ┆== 0) return gotit; ┆ 0x04f200…09e600 66 6f 72 20 28 69 3d 75 6e 69 74 74 62 3b 20 69 2d 3e 6e 61 6d 65 3b 20 69 2b 2b 29 0a 09 69 66 ┆for (i=unittb; i->name; i++) if┆ 0x04f200…09e600 20 28 73 74 72 63 6d 70 28 69 2d 3e 6e 61 6d 65 2c 20 69 64 76 61 72 29 20 3d 3d 20 30 29 0a 09 ┆ (strcmp(i->name, idvar) == 0) ┆ 0x04f200…09e600 20 20 20 20 72 65 74 75 72 6e 20 67 6f 74 69 74 3b 0a 20 20 0a 20 20 20 20 69 66 20 28 69 64 76 ┆ return gotit; if (idv┆ 0x04f200…09e600 61 72 5b 73 74 72 6c 65 6e 28 69 64 76 61 72 29 2d 31 5d 20 3d 3d 20 27 73 27 29 0a 09 69 64 76 ┆ar[strlen(idvar)-1] == 's') idv┆ 0x04f200…09e600 61 72 5b 73 74 72 6c 65 6e 28 69 64 76 61 72 29 2d 31 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 20 ┆ar[strlen(idvar)-1] = '\0'; ┆ 0x04f200…09e600 20 66 6f 72 20 28 69 3d 75 6e 69 74 74 62 3b 20 69 2d 3e 6e 61 6d 65 3b 20 69 2b 2b 29 0a 09 69 ┆ for (i=unittb; i->name; i++) i┆ 0x04f200…09e600 66 20 28 73 74 72 63 6d 70 28 69 2d 3e 6e 61 6d 65 2c 20 69 64 76 61 72 29 20 3d 3d 20 30 29 0a ┆f (strcmp(i->name, idvar) == 0) ┆ 0x04f200…09e600 09 20 20 20 20 72 65 74 75 72 6e 20 67 6f 74 69 74 3b 0a 20 20 0a 20 20 20 20 66 6f 72 20 28 69 ┆ return gotit; for (i┆ 0x04f200…09e600 20 3d 20 6f 74 68 65 72 74 62 3b 20 69 2d 3e 6e 61 6d 65 3b 20 69 2b 2b 29 0a 09 69 66 20 28 73 ┆ = othertb; i->name; i++) if (s┆ 0x04f200…09e600 74 72 63 6d 70 28 69 2d 3e 6e 61 6d 65 2c 20 69 64 76 61 72 29 20 3d 3d 20 30 29 0a 09 20 20 20 ┆trcmp(i->name, idvar) == 0) ┆ 0x04f200…09e600 20 72 65 74 75 72 6e 20 67 6f 74 69 74 3b 0a 20 20 0a 20 20 20 20 69 66 20 28 73 74 72 6c 65 6e ┆ return gotit; if (strlen┆ 0x04f200…09e600 28 69 64 76 61 72 29 20 3d 3d 20 31 20 26 26 20 69 73 61 6c 70 68 61 28 2a 69 64 76 61 72 29 29 ┆(idvar) == 1 && isalpha(*idvar))┆ 0x04f200…09e600 20 7b 0a 09 66 6f 72 20 28 69 20 3d 20 6d 69 6c 7a 6f 6e 65 3b 20 69 2d 3e 6e 61 6d 65 3b 20 69 ┆ { for (i = milzone; i->name; i┆ 0x04f200…09e600 2b 2b 29 0a 09 20 20 20 20 69 66 20 28 73 74 72 63 6d 70 28 69 2d 3e 6e 61 6d 65 2c 20 69 64 76 ┆++) if (strcmp(i->name, idv┆ 0x04f200…09e600 61 72 29 20 3d 3d 20 30 29 0a 09 09 72 65 74 75 72 6e 20 67 6f 74 69 74 3b 0a 20 20 20 20 7d 0a ┆ar) == 0) return gotit; } ┆ 0x04f200…09e600 20 20 0a 20 20 20 20 72 65 74 75 72 6e 20 49 44 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 55 53 47 0a ┆ return ID; } #ifdef USG ┆ 0x04f200…09e600 65 78 74 65 72 6e 20 6c 6f 6e 67 20 74 69 6d 65 7a 6f 6e 65 3b 0a 65 78 74 65 72 6e 20 69 6e 74 ┆extern long timezone; extern int┆ 0x04f200…09e600 20 20 64 61 79 6c 69 67 68 74 3b 0a 0a 66 74 69 6d 65 28 74 70 29 0a 73 74 72 75 63 74 20 74 69 ┆ daylight; ftime(tp) struct ti┆ 0x04f200…09e600 6d 65 62 20 2a 74 70 3b 0a 7b 0a 20 20 20 20 28 76 6f 69 64 29 20 74 69 6d 65 28 26 74 70 2d 3e ┆meb *tp; { (void) time(&tp->┆ 0x04f200…09e600 74 69 6d 65 29 3b 0a 20 20 20 20 74 70 2d 3e 6d 69 6c 6c 69 74 6d 20 3d 20 30 3b 0a 20 20 20 20 ┆time); tp->millitm = 0; ┆ 0x04f200…09e600 74 70 2d 3e 74 69 6d 65 7a 6f 6e 65 20 3d 20 74 69 6d 65 7a 6f 6e 65 2f 36 30 3b 0a 20 20 20 20 ┆tp->timezone = timezone/60; ┆ 0x04f200…09e600 74 70 2d 3e 64 73 74 66 6c 61 67 20 3d 20 64 61 79 6c 69 67 68 74 3b 0a 7d 0a 23 65 6e 64 69 66 ┆tp->dstflag = daylight; } #endif┆ 0x04f200…09e600 20 2f 2a 20 55 53 47 20 2a 2f 0a 0a 74 69 6d 65 5f 74 20 67 65 74 64 61 74 65 28 70 2c 20 6e 6f ┆ /* USG */ time_t getdate(p, no┆ 0x04f200…09e600 77 29 0a 63 68 61 72 20 2a 70 3b 20 73 74 72 75 63 74 20 74 69 6d 65 62 20 2a 6e 6f 77 3b 0a 7b ┆w) char *p; struct timeb *now; {┆ 0x04f200…09e600 0a 20 20 20 20 74 69 6d 65 5f 74 20 6d 6f 6e 74 68 61 64 64 28 29 3b 0a 20 20 20 20 69 6e 74 20 ┆ time_t monthadd(); int ┆ 0x04f200…09e600 65 72 72 3b 0a 20 20 20 20 73 74 72 75 63 74 20 74 6d 20 2a 6c 74 3b 0a 20 20 20 20 73 74 72 75 ┆err; struct tm *lt; stru┆ 0x04f200…09e600 63 74 20 74 69 6d 65 62 20 66 74 7a 3b 0a 20 20 20 20 74 69 6d 65 5f 74 20 73 64 61 74 65 2c 20 ┆ct timeb ftz; time_t sdate, ┆ 0x04f200…09e600 74 6f 64 3b 0a 0a 20 20 20 20 6c 70 74 72 20 3d 20 70 3b 0a 20 20 20 20 69 66 20 28 6e 6f 77 20 ┆tod; lptr = p; if (now ┆ 0x04f200…09e600 3d 3d 20 28 28 73 74 72 75 63 74 20 74 69 6d 65 62 20 2a 29 20 4e 55 4c 4c 29 29 0a 20 20 20 20 ┆== ((struct timeb *) NULL)) ┆ 0x04f200…09e600 7b 0a 09 6e 6f 77 20 3d 20 26 66 74 7a 3b 0a 09 66 74 69 6d 65 28 26 66 74 7a 29 3b 0a 20 20 20 ┆{ now = &ftz; ftime(&ftz); ┆ 0x04f200…09e600 20 7d 0a 20 20 20 20 6c 74 20 3d 20 6c 6f 63 61 6c 74 69 6d 65 28 26 6e 6f 77 2d 3e 74 69 6d 65 ┆ } lt = localtime(&now->time┆ 0x04f200…09e600 29 3b 0a 20 20 20 20 79 65 61 72 20 3d 20 6c 74 2d 3e 74 6d 5f 79 65 61 72 3b 0a 20 20 20 20 6d ┆); year = lt->tm_year; m┆ 0x04f200…09e600 6f 6e 74 68 20 3d 20 6c 74 2d 3e 74 6d 5f 6d 6f 6e 2b 31 3b 0a 20 20 20 20 64 61 79 20 3d 20 6c ┆onth = lt->tm_mon+1; day = l┆ 0x04f200…09e600 74 2d 3e 74 6d 5f 6d 64 61 79 3b 0a 20 20 20 20 72 65 6c 73 65 63 20 3d 20 30 3b 20 72 65 6c 6d ┆t->tm_mday; relsec = 0; relm┆ 0x04f200…09e600 6f 6e 74 68 20 3d 20 30 3b 0a 20 20 20 20 74 69 6d 65 66 6c 61 67 20 3d 20 7a 6f 6e 65 66 6c 61 ┆onth = 0; timeflag = zonefla┆ 0x04f200…09e600 67 20 3d 20 64 61 74 65 66 6c 61 67 20 3d 20 64 61 79 66 6c 61 67 20 3d 20 72 65 6c 66 6c 61 67 ┆g = dateflag = dayflag = relflag┆ 0x04f200…09e600 20 3d 20 30 3b 0a 20 20 20 20 6f 75 72 7a 6f 6e 65 20 3d 20 6e 6f 77 2d 3e 74 69 6d 65 7a 6f 6e ┆ = 0; ourzone = now->timezon┆ 0x04f200…09e600 65 3b 0a 20 20 20 20 73 64 61 79 6c 69 67 68 74 20 3d 20 4d 41 59 42 45 3b 0a 20 20 20 20 68 68 ┆e; sdaylight = MAYBE; hh┆ 0x04f200…09e600 20 3d 20 6d 6d 20 3d 20 73 73 20 3d 20 30 3b 0a 20 20 20 20 6d 65 72 69 64 20 3d 20 32 34 3b 0a ┆ = mm = ss = 0; merid = 24; ┆ 0x04f200…09e600 0a 20 20 20 20 69 66 20 28 65 72 72 20 3d 20 79 79 70 61 72 73 65 28 29 20 7c 7c 20 74 69 6d 65 ┆ if (err = yyparse() || time┆ 0x04f200…09e600 66 6c 61 67 3e 31 20 7c 7c 20 7a 6f 6e 65 66 6c 61 67 3e 31 20 7c 7c 20 64 61 74 65 66 6c 61 67 ┆flag>1 || zoneflag>1 || dateflag┆ 0x04f200…09e600 3e 31 20 7c 7c 20 64 61 79 66 6c 61 67 3e 31 29 0a 09 72 65 74 75 72 6e 20 28 55 4e 4b 4e 4f 57 ┆>1 || dayflag>1) return (UNKNOW┆ 0x04f200…09e600 4e 29 3b 0a 0a 20 20 20 20 69 66 20 28 64 61 74 65 66 6c 61 67 20 7c 7c 20 74 69 6d 65 66 6c 61 ┆N); if (dateflag || timefla┆ 0x04f200…09e600 67 20 7c 7c 20 64 61 79 66 6c 61 67 29 0a 20 20 20 20 7b 0a 09 73 64 61 74 65 20 3d 20 64 61 74 ┆g || dayflag) { sdate = dat┆ 0x04f200…09e600 65 63 6f 6e 76 28 6d 6f 6e 74 68 2c 64 61 79 2c 79 65 61 72 2c 68 68 2c 6d 6d 2c 73 73 2c 6d 65 ┆econv(month,day,year,hh,mm,ss,me┆ 0x04f200…09e600 72 69 64 2c 6f 75 72 7a 6f 6e 65 2c 73 64 61 79 6c 69 67 68 74 29 3b 0a 09 69 66 20 28 73 64 61 ┆rid,ourzone,sdaylight); if (sda┆ 0x04f200…09e600 74 65 20 3c 20 30 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 ┆te < 0) return -1; } els┆ 0x04f200…09e600 65 0a 20 20 20 20 7b 0a 09 73 64 61 74 65 20 3d 20 6e 6f 77 2d 3e 74 69 6d 65 3b 0a 09 69 66 20 ┆e { sdate = now->time; if ┆ 0x04f200…09e600 28 72 65 6c 66 6c 61 67 20 3d 3d 20 30 29 0a 09 20 20 20 20 73 64 61 74 65 20 2d 3d 20 28 6c 74 ┆(relflag == 0) sdate -= (lt┆ 0x04f200…09e600 2d 3e 74 6d 5f 73 65 63 20 2b 20 6c 74 2d 3e 74 6d 5f 6d 69 6e 2a 36 30 20 2b 20 6c 74 2d 3e 74 ┆->tm_sec + lt->tm_min*60 + lt->t┆ 0x04f200…09e600 6d 5f 68 6f 75 72 2a 28 36 30 4c 2a 36 30 4c 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 64 ┆m_hour*(60L*60L)); } sd┆ 0x04f200…09e600 61 74 65 20 2b 3d 20 72 65 6c 73 65 63 3b 0a 20 20 20 20 73 64 61 74 65 20 2b 3d 20 6d 6f 6e 74 ┆ate += relsec; sdate += mont┆ 0x04f200…09e600 68 61 64 64 28 73 64 61 74 65 2c 20 72 65 6c 6d 6f 6e 74 68 29 3b 0a 0a 20 20 20 20 69 66 20 28 ┆hadd(sdate, relmonth); if (┆ 0x04f200…09e600 64 61 79 66 6c 61 67 20 26 26 20 21 64 61 74 65 66 6c 61 67 29 0a 20 20 20 20 7b 0a 09 74 6f 64 ┆dayflag && !dateflag) { tod┆ 0x04f200…09e600 20 3d 20 64 61 79 63 6f 6e 76 28 64 61 79 6f 72 64 2c 20 64 61 79 72 65 71 2c 20 73 64 61 74 65 ┆ = dayconv(dayord, dayreq, sdate┆ 0x04f200…09e600 29 3b 0a 09 73 64 61 74 65 20 2b 3d 20 74 6f 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 65 74 ┆); sdate += tod; } ret┆ 0x04f200…09e600 75 72 6e 28 73 64 61 74 65 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 51 55 49 43 4b 44 41 54 45 0a ┆urn(sdate); } #ifdef QUICKDATE ┆ 0x04f200…09e600 74 69 6d 65 5f 74 20 71 75 69 63 6b 64 61 74 65 28 70 29 0a 2f 2a 20 67 65 74 20 61 20 64 61 74 ┆time_t quickdate(p) /* get a dat┆ 0x04f200…09e600 65 2c 20 61 73 73 75 6d 69 6e 67 20 69 74 27 73 20 69 6e 20 52 46 43 38 32 32 20 73 74 61 6e 64 ┆e, assuming it's in RFC822 stand┆ 0x04f200…09e600 61 72 64 20 66 6f 72 6d 61 74 20 77 69 74 68 20 6e 6f 20 6c 65 61 64 69 6e 67 20 64 61 79 20 2a ┆ard format with no leading day *┆ 0x04f200…09e600 2f 0a 7b 0a 20 20 20 20 63 68 61 72 09 6e 6d 6f 6e 74 68 5b 31 30 5d 3b 0a 20 20 20 20 73 74 61 ┆/ { char nmonth[10]; sta┆ 0x04f200…09e600 74 69 63 20 63 68 61 72 09 2a 6d 6f 6e 74 68 61 62 62 72 65 76 73 5b 5d 20 3d 0a 20 20 20 20 7b ┆tic char *monthabbrevs[] = {┆ 0x04f200…09e600 0a 09 22 4a 61 6e 22 2c 20 22 46 65 62 22 2c 20 22 4d 61 72 22 2c 20 22 41 70 72 22 2c 20 22 4d ┆ "Jan", "Feb", "Mar", "Apr", "M┆ 0x04f200…09e600 61 79 22 2c 20 22 4a 75 6e 22 2c 0a 09 22 4a 75 6c 22 2c 20 22 41 75 67 22 2c 20 22 53 65 70 22 ┆ay", "Jun", "Jul", "Aug", "Sep"┆ 0x04f200…09e600 2c 20 22 4f 63 74 22 2c 20 22 4e 6f 76 22 2c 20 22 44 65 63 22 2c 0a 09 28 63 68 61 72 20 2a 29 ┆, "Oct", "Nov", "Dec", (char *)┆ 0x04f200…09e600 4e 55 4c 4c 0a 20 20 20 20 7d 3b 0a 0a 20 20 20 20 69 66 20 28 73 73 63 61 6e 66 28 70 2c 20 22 ┆NULL }; if (sscanf(p, "┆ 0x04f200…09e600 25 64 20 25 73 20 25 64 20 25 64 3a 25 64 3a 25 64 20 47 4d 54 22 2c 20 26 64 61 79 2c 6e 6d 6f ┆%d %s %d %d:%d:%d GMT", &day,nmo┆ 0x04f200…09e600 6e 74 68 2c 26 79 65 61 72 2c 26 68 68 2c 26 6d 6d 2c 26 73 73 29 20 21 3d 20 36 29 0a 09 72 65 ┆nth,&year,&hh,&mm,&ss) != 6) re┆ 0x04f200…09e600 74 75 72 6e 28 55 4e 4b 4e 4f 57 4e 29 3b 0a 20 20 20 20 65 6c 73 65 0a 20 20 20 20 7b 0a 09 72 ┆turn(UNKNOWN); else { r┆ 0x04f200…09e600 65 67 69 73 74 65 72 20 63 68 61 72 20 2a 2a 6d 70 3b 0a 0a 09 66 6f 72 28 6d 70 20 3d 20 6d 6f ┆egister char **mp; for(mp = mo┆ 0x04f200…09e600 6e 74 68 61 62 62 72 65 76 73 3b 20 2a 6d 70 3b 20 6d 70 2b 2b 29 0a 09 20 20 20 20 69 66 20 28 ┆nthabbrevs; *mp; mp++) if (┆ 0x04f200…09e600 73 74 72 63 6d 70 28 6d 70 5b 30 5d 2c 20 6e 6d 6f 6e 74 68 29 20 3d 3d 20 30 29 0a 09 09 62 72 ┆strcmp(mp[0], nmonth) == 0) br┆ 0x04f200…09e600 65 61 6b 3b 0a 09 69 66 20 28 2a 6d 70 20 3d 3d 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 0a 09 ┆eak; if (*mp == (char *)NULL) ┆ 0x04f200…09e600 20 20 20 20 72 65 74 75 72 6e 28 55 4e 4b 4e 4f 57 4e 29 3b 0a 09 65 6c 73 65 0a 09 20 20 20 20 ┆ return(UNKNOWN); else ┆ 0x04f200…09e600 72 65 74 75 72 6e 28 64 61 74 65 63 6f 6e 76 28 6d 70 20 2d 20 6d 6f 6e 74 68 61 62 62 72 65 76 ┆return(dateconv(mp - monthabbrev┆ 0x04f200…09e600 73 2c 0a 09 09 09 20 20 20 20 64 61 79 2c 20 79 65 61 72 2c 20 68 68 2c 20 6d 6d 2c 20 73 73 2c ┆s, day, year, hh, mm, ss,┆ 0x04f200…09e600 20 30 2c 20 30 2c 20 53 54 41 4e 44 41 52 44 29 29 3b 0a 20 20 20 20 7d 0a 7d 0a 23 65 6e 64 69 ┆ 0, 0, STANDARD)); } } #endi┆ 0x04f200…09e600 66 20 2f 2a 20 51 55 49 43 4b 44 41 54 45 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 79 79 ┆f /* QUICKDATE */ static int yy┆ 0x04f200…09e600 65 72 72 6f 72 28 73 29 20 63 68 61 72 20 2a 73 3b 20 7b 7d 0a 0a 2f 2a 20 67 65 74 64 61 74 65 ┆error(s) char *s; {} /* getdate┆ 0x04f200…09e600 2e 79 20 65 6e 64 73 20 68 65 72 65 20 2a 2f 0a 6c 22 2c 20 22 41 75 67 22 2c 20 22 53 65 70 22 ┆.y ends here */ l", "Aug", "Sep"┆ 0x04f200…09e600 2c 20 22 4f 63 74 22 2c 20 22 4e 6f 76 22 2c 20 22 44 65 63 22 2c 0a 09 28 63 68 61 72 20 2a 29 ┆, "Oct", "Nov", "Dec", (char *)┆ 0x04f200…09e600 4e 55 4c 4c 0a 20 20 20 20 7d 3b 0a 0a 20 20 20 20 73 72 63 2f 44 2e 70 6f 72 74 2f 67 72 6f 77 ┆NULL }; src/D.port/grow┆ 0x04f200…09e600 2e 63 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆.c ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆ ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 20 20 20 34 34 34 20 00 20 20 20 ┆ 444 ┆ 0x04f200…09e600 31 34 35 20 00 20 20 20 20 20 31 20 00 20 20 20 20 20 20 31 31 30 35 34 20 20 34 34 35 36 31 35 ┆145 1 11054 445615┆ 0x04f200…09e600 34 30 35 33 20 20 20 37 31 36 34 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆4053 7164 ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆ ┆ […0x9…] 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆ /**************┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆********************************┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 0a ┆****************************** ┆ 0x04f200…09e600 4e 41 4d 45 0a 20 20 20 67 72 6f 77 2e 63 20 2d 2d 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 69 ┆NAME grow.c -- functions to i┆ 0x04f200…09e600 6d 70 6c 65 6d 65 6e 74 20 61 20 6d 61 6c 6c 6f 63 27 69 6e 67 20 6c 69 6e 65 20 72 65 61 64 65 ┆mplement a malloc'ing line reade┆ 0x04f200…09e600 72 0a 09 0a 53 59 4e 4f 50 53 49 53 0a 20 20 20 23 69 6e 63 6c 75 64 65 20 22 67 72 6f 77 2e 68 ┆r SYNOPSIS #include "grow.h┆ 0x04f200…09e600 22 0a 0a 20 20 20 73 74 72 75 63 74 20 67 72 6f 77 20 2a 67 72 6f 77 69 6e 69 74 28 78 29 09 2d ┆" struct grow *growinit(x) -┆ 0x04f200…09e600 2d 20 73 65 74 20 75 70 20 61 6e 20 69 6e 70 75 74 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 62 6c 6f ┆- set up an input allocation blo┆ 0x04f200…09e600 63 6b 0a 20 20 20 73 74 72 75 63 74 20 67 72 6f 77 20 2a 78 3b 0a 0a 20 20 20 63 68 61 72 20 2a ┆ck struct grow *x; char *┆ 0x04f200…09e600 67 72 6f 77 66 70 28 70 61 72 65 6e 74 2c 20 66 70 29 09 2d 2d 20 67 65 74 20 63 68 61 72 73 20 ┆growfp(parent, fp) -- get chars ┆ 0x04f200…09e600 74 69 6c 6c 20 6e 65 77 6c 69 6e 65 0a 20 20 20 73 74 72 75 63 74 20 67 72 6f 77 20 2a 70 61 72 ┆till newline struct grow *par┆ 0x04f200…09e600 65 6e 74 3b 0a 0a 20 20 20 76 6f 69 64 20 67 72 6f 77 73 74 72 28 70 61 72 65 6e 74 2c 20 6e 65 ┆ent; void growstr(parent, ne┆ 0x04f200…09e600 77 73 74 72 29 09 2d 2d 20 61 70 70 65 6e 64 20 63 68 61 72 61 63 74 65 72 20 73 74 72 69 6e 67 ┆wstr) -- append character string┆ 0x04f200…09e600 0a 20 20 20 73 74 72 75 63 74 20 67 72 6f 77 20 2a 70 61 72 65 6e 74 3b 20 63 68 61 72 20 2a 6e ┆ struct grow *parent; char *n┆ 0x04f200…09e600 65 77 73 74 72 3b 0a 0a 20 20 20 76 6f 69 64 20 67 72 6f 77 63 68 61 72 28 70 61 72 65 6e 74 2c ┆ewstr; void growchar(parent,┆ 0x04f200…09e600 20 63 29 09 2d 2d 20 61 70 70 65 6e 64 20 63 68 61 72 61 63 74 65 72 0a 20 20 20 73 74 72 75 63 ┆ c) -- append character struc┆ 0x04f200…09e600 74 20 67 72 6f 77 20 2a 70 61 72 65 6e 74 3b 20 72 65 67 69 73 74 65 72 20 63 68 61 72 20 63 3b ┆t grow *parent; register char c;┆ 0x04f200…09e600 0a 0a 44 45 53 43 52 49 50 54 49 4f 4e 0a 20 20 20 54 68 65 73 65 20 66 75 6e 63 74 69 6f 6e 73 ┆ DESCRIPTION These functions┆ 0x04f200…09e600 20 70 72 6f 76 69 64 65 20 61 20 6d 61 6c 6c 6f 63 69 6e 67 20 6c 69 6e 65 20 72 65 61 64 65 72 ┆ provide a mallocing line reader┆ 0x04f200…09e600 20 6e 6f 74 20 72 65 73 74 72 69 63 74 65 64 20 74 6f 20 61 6e 79 0a 66 69 78 65 64 2d 73 69 7a ┆ not restricted to any fixed-siz┆ 0x04f200…09e600 65 20 62 75 66 66 65 72 2e 0a 0a 41 55 54 48 4f 52 0a 20 20 20 4a 65 61 6e 20 4d 61 72 69 65 20 ┆e buffer. AUTHOR Jean Marie ┆ 0x04f200…09e600 44 69 61 7a 0a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆Diaz **************************┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆********************************┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 4c 49 4e 54 4c 49 42 52 41 52 59 2a ┆****************/ /*LINTLIBRARY*┆ 0x04f200…09e600 2f 0a 23 69 6e 63 6c 75 64 65 20 22 6c 69 62 70 6f 72 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 ┆/ #include "libport.h" #include ┆ 0x04f200…09e600 22 67 72 6f 77 2e 68 22 0a 0a 73 74 72 75 63 74 20 67 72 6f 77 20 2a 67 72 6f 77 69 6e 69 74 28 ┆"grow.h" struct grow *growinit(┆ 0x04f200…09e600 78 29 0a 73 74 72 75 63 74 20 67 72 6f 77 20 2a 78 3b 0a 7b 0a 20 20 20 20 69 66 20 28 78 29 0a ┆x) struct grow *x; { if (x) ┆ 0x04f200…09e600 20 20 20 20 7b 0a 09 69 66 20 28 78 2d 3e 63 75 72 70 74 72 29 0a 09 20 20 20 20 66 72 65 65 28 ┆ { if (x->curptr) free(┆ 0x04f200…09e600 28 63 68 61 72 20 2a 29 78 2d 3e 63 75 72 70 74 72 29 3b 0a 09 66 72 65 65 28 28 63 68 61 72 20 ┆(char *)x->curptr); free((char ┆ 0x04f200…09e600 2a 29 78 29 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 6c 69 6e 74 0a 20 20 20 20 78 20 3d ┆*)x); } #ifndef lint x =┆ 0x04f200…09e600 20 28 73 74 72 75 63 74 20 67 72 6f 77 20 2a 29 6d 61 6c 6c 6f 63 28 28 75 6e 73 69 67 6e 65 64 ┆ (struct grow *)malloc((unsigned┆ 0x04f200…09e600 29 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 67 72 6f 77 29 29 3b 0a 23 65 6c 73 65 0a 20 20 ┆) sizeof(struct grow)); #else ┆ 0x04f200…09e600 20 20 78 20 3d 20 28 73 74 72 75 63 74 20 67 72 6f 77 20 2a 29 4e 55 4c 4c 3b 0a 23 65 6e 64 69 ┆ x = (struct grow *)NULL; #endi┆ 0x04f200…09e600 66 20 2f 2a 20 6c 69 6e 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 78 20 3d 3d 20 28 73 74 72 75 63 ┆f /* lint */ if (x == (struc┆ 0x04f200…09e600 74 20 67 72 6f 77 20 2a 29 4e 55 4c 4c 29 0a 09 78 65 72 72 6f 72 28 22 4f 75 74 20 6f 66 20 6d ┆t grow *)NULL) xerror("Out of m┆ 0x04f200…09e600 65 6d 6f 72 79 22 29 3b 0a 20 20 20 20 65 6c 73 65 0a 20 20 20 20 7b 0a 09 78 2d 3e 68 6f 77 6c ┆emory"); else { x->howl┆ 0x04f200…09e600 6f 6e 67 20 3d 20 78 2d 3e 6d 61 78 6c 65 6e 20 3d 20 30 3b 0a 09 78 2d 3e 68 65 61 64 20 3d 20 ┆ong = x->maxlen = 0; x->head = ┆ 0x04f200…09e600 78 2d 3e 63 75 72 70 74 72 20 3d 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a ┆x->curptr = (char *)NULL; } ┆ 0x04f200…09e600 20 20 20 20 72 65 74 75 72 6e 28 78 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 47 69 76 65 6e 20 61 20 ┆ return(x); } /* * Given a ┆ 0x04f200…09e600 28 73 74 72 75 63 74 20 67 72 6f 77 20 2a 29 20 61 6e 64 20 61 20 28 46 49 4c 45 20 2a 29 2c 20 ┆(struct grow *) and a (FILE *), ┆ 0x04f200…09e600 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 66 70 20 75 6e 74 69 6c 20 77 65 0a 20 2a 20 73 65 65 ┆read from the fp until we * see┆ 0x04f200…09e600 20 61 20 6e 65 77 6c 69 6e 65 2e 0a 20 2a 2f 0a 63 68 61 72 20 2a 67 72 6f 77 66 70 28 70 61 72 ┆ a newline. */ char *growfp(par┆ 0x04f200…09e600 65 6e 74 2c 20 66 70 29 0a 73 74 72 75 63 74 20 67 72 6f 77 20 2a 70 61 72 65 6e 74 3b 0a 46 49 ┆ent, fp) struct grow *parent; FI┆ 0x04f200…09e600 4c 45 20 2a 66 70 3b 0a 7b 0a 20 20 20 20 72 65 67 69 73 74 65 72 20 69 6e 74 20 69 6e 63 72 65 ┆LE *fp; { register int incre┆ 0x04f200…09e600 6d 65 6e 74 20 3d 20 42 55 46 53 49 5a 20 2f 20 34 3b 0a 20 20 20 20 63 68 61 72 20 2a 70 74 72 ┆ment = BUFSIZ / 4; char *ptr┆ 0x04f200…09e600 3b 0a 09 0a 20 20 20 20 66 6f 72 20 28 3b 3b 29 0a 20 20 20 20 7b 09 09 09 2f 2a 20 77 65 20 72 ┆; for (;;) { /* we r┆ 0x04f200…09e600 65 74 75 72 6e 20 6f 75 74 20 6f 66 20 68 65 72 65 20 2a 2f 0a 09 2f 2a 20 67 65 74 20 6d 6f 72 ┆eturn out of here */ /* get mor┆ 0x04f200…09e600 65 20 73 70 61 63 65 20 2a 2f 0a 09 69 66 20 28 70 61 72 65 6e 74 2d 3e 6d 61 78 6c 65 6e 20 3d ┆e space */ if (parent->maxlen =┆ 0x04f200…09e600 3d 20 30 29 20 7b 20 2f 2a 20 69 73 20 74 68 69 73 20 74 68 65 20 76 65 72 79 20 66 69 72 73 74 ┆= 0) { /* is this the very first┆ 0x04f200…09e600 20 74 69 6d 65 3f 20 2a 2f 0a 09 20 20 20 20 70 61 72 65 6e 74 2d 3e 68 65 61 64 20 3d 20 70 61 ┆ time? */ parent->head = pa┆ 0x04f200…09e600 72 65 6e 74 2d 3e 63 75 72 70 74 72 20 3d 0a 09 09 6d 61 6c 6c 6f 63 28 28 75 6e 73 69 67 6e 65 ┆rent->curptr = malloc((unsigne┆ 0x04f200…09e600 64 29 20 73 69 7a 65 6f 66 28 63 68 61 72 20 2a 29 20 2a 20 69 6e 63 72 65 6d 65 6e 74 29 3b 0a ┆d) sizeof(char *) * increment); ┆ 0x04f200…09e600 09 20 20 20 20 69 66 20 28 70 61 72 65 6e 74 2d 3e 68 65 61 64 20 3d 3d 20 28 63 68 61 72 20 2a ┆ if (parent->head == (char *┆ 0x04f200…09e600 29 20 4e 55 4c 4c 29 0a 09 09 78 65 72 72 6f 72 28 22 4f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 22 ┆) NULL) xerror("Out of memory"┆ 0x04f200…09e600 29 3b 0a 09 20 20 20 20 70 61 72 65 6e 74 2d 3e 6d 61 78 6c 65 6e 20 3d 20 69 6e 63 72 65 6d 65 ┆); parent->maxlen = increme┆ 0x04f200…09e600 6e 74 3b 0a 09 7d 0a 09 65 6c 73 65 0a 09 7b 09 09 09 2f 2a 20 72 65 61 6c 6c 6f 63 20 6d 6f 72 ┆nt; } else { /* realloc mor┆ 0x04f200…09e600 65 20 73 70 61 63 65 20 2a 2f 0a 09 20 20 20 20 70 61 72 65 6e 74 2d 3e 6d 61 78 6c 65 6e 20 2b ┆e space */ parent->maxlen +┆ 0x04f200…09e600 3d 20 69 6e 63 72 65 6d 65 6e 74 3b 0a 09 20 20 20 20 70 61 72 65 6e 74 2d 3e 68 65 61 64 20 3d ┆= increment; parent->head =┆ 0x04f200…09e600 20 72 65 61 6c 6c 6f 63 28 70 61 72 65 6e 74 2d 3e 68 65 61 64 2c 0a 09 09 09 09 20 20 20 28 75 ┆ realloc(parent->head, (u┆ 0x04f200…09e600 6e 73 69 67 6e 65 64 29 20 73 69 7a 65 6f 66 28 63 68 61 72 20 2a 29 0a 09 09 09 09 20 20 20 2a ┆nsigned) sizeof(char *) *┆ 0x04f200…09e600 20 70 61 72 65 6e 74 2d 3e 6d 61 78 6c 65 6e 29 3b 0a 09 20 20 20 20 69 66 20 28 70 61 72 65 6e ┆ parent->maxlen); if (paren┆ 0x04f200…09e600 74 2d 3e 68 65 61 64 20 3d 3d 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 0a 09 09 78 65 72 72 ┆t->head == (char *) NULL) xerr┆ 0x04f200…09e600 6f 72 28 22 4f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 22 29 3b 0a 09 20 20 20 20 70 61 72 65 6e 74 ┆or("Out of memory"); parent┆ 0x04f200…09e600 2d 3e 63 75 72 70 74 72 20 3d 20 26 28 70 61 72 65 6e 74 2d 3e 68 65 61 64 5b 70 61 72 65 6e 74 ┆->curptr = &(parent->head[parent┆ 0x04f200…09e600 2d 3e 68 6f 77 6c 6f 6e 67 5d 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 6e 6f 77 20 74 68 61 74 20 77 65 ┆->howlong]); } /* now that we┆ 0x04f200…09e600 27 76 65 20 67 6f 74 20 6d 6f 72 65 20 73 70 61 63 65 2c 20 75 73 65 20 69 74 20 2a 2f 0a 0a 09 ┆'ve got more space, use it */ ┆ 0x04f200…09e600 69 66 20 28 28 70 74 72 20 3d 20 66 67 65 74 73 28 70 61 72 65 6e 74 2d 3e 63 75 72 70 74 72 2c ┆if ((ptr = fgets(parent->curptr,┆ 0x04f200…09e600 0a 09 09 09 20 28 70 61 72 65 6e 74 2d 3e 6d 61 78 6c 65 6e 20 2d 20 70 61 72 65 6e 74 2d 3e 68 ┆ (parent->maxlen - parent->h┆ 0x04f200…09e600 6f 77 6c 6f 6e 67 29 2c 20 66 70 29 29 0a 09 20 20 20 20 3d 3d 20 28 63 68 61 72 20 2a 29 4e 55 ┆owlong), fp)) == (char *)NU┆ 0x04f200…09e600 4c 4c 29 0a 09 20 20 20 20 72 65 74 75 72 6e 28 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 20 2f ┆LL) return((char *)NULL); /┆ 0x04f200…09e600 2a 20 45 4f 46 2c 20 6f 72 20 65 72 72 6f 72 20 2a 2f 0a 0a 09 69 66 20 28 28 70 74 72 20 3d 20 ┆* EOF, or error */ if ((ptr = ┆ 0x04f200…09e600 73 74 72 63 68 72 28 70 61 72 65 6e 74 2d 3e 63 75 72 70 74 72 2c 20 27 5c 6e 27 29 29 20 21 3d ┆strchr(parent->curptr, '\n')) !=┆ 0x04f200…09e600 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20 20 20 2a ┆ (char *)NULL) { /* *┆ 0x04f200…09e600 20 77 65 20 67 6f 74 20 61 20 6e 65 77 6c 69 6e 65 2c 20 73 6f 20 77 65 27 76 65 20 72 65 61 64 ┆ we got a newline, so we've read┆ 0x04f200…09e600 20 61 20 77 68 6f 6c 65 0a 09 20 20 20 20 20 2a 20 6c 69 6e 65 2e 20 20 4e 75 6c 6c 20 6f 75 74 ┆ a whole * line. Null out┆ 0x04f200…09e600 20 74 68 65 20 6e 65 77 6c 69 6e 65 20 61 6e 64 20 67 6f 2e 0a 09 20 20 20 20 20 2a 2f 0a 09 20 ┆ the newline and go. */ ┆ 0x04f200…09e600 20 20 20 2a 70 74 72 20 3d 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 28 70 61 72 65 ┆ *ptr = NULL; return(pare┆ 0x04f200…09e600 6e 74 2d 3e 68 65 61 64 29 3b 0a 09 7d 0a 09 2f 2a 0a 09 20 2a 20 48 6d 6d 20 2d 2d 20 74 68 65 ┆nt->head); } /* * Hmm -- the┆ 0x04f200…09e600 72 65 27 73 20 6d 6f 72 65 20 77 61 69 74 69 6e 67 3b 20 6c 65 74 27 73 20 64 6f 20 69 74 20 61 ┆re's more waiting; let's do it a┆ 0x04f200…09e600 67 61 69 6e 2e 0a 09 20 2a 2f 0a 20 20 20 20 7d 0a 7d 0a 0a 23 69 66 64 65 66 20 46 55 54 55 52 ┆gain. */ } } #ifdef FUTUR┆ 0x04f200…09e600 45 0a 2f 2a 0a 20 2a 20 47 69 76 65 6e 20 61 20 28 73 74 72 75 63 74 20 67 72 6f 77 20 2a 29 20 ┆E /* * Given a (struct grow *) ┆ 0x04f200…09e600 61 6e 64 20 61 20 6e 75 6c 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 2c 20 61 64 ┆and a null-terminated string, ad┆ 0x04f200…09e600 64 20 69 74 2c 20 70 75 6e 74 69 6e 67 20 61 6e 79 0a 20 2a 20 27 5c 72 27 20 61 6c 6f 6e 67 20 ┆d it, punting any * '\r' along ┆ 0x04f200…09e600 74 68 65 20 77 61 79 2e 0a 20 2a 2f 0a 76 6f 69 64 20 67 72 6f 77 73 74 72 28 70 61 72 65 6e 74 ┆the way. */ void growstr(parent┆ 0x04f200…09e600 2c 20 6e 65 77 73 74 72 29 0a 73 74 72 75 63 74 20 67 72 6f 77 20 2a 70 61 72 65 6e 74 3b 0a 63 ┆, newstr) struct grow *parent; c┆ 0x04f200…09e600 68 61 72 20 2a 6e 65 77 73 74 72 3b 0a 7b 0a 20 20 20 20 72 65 67 69 73 74 65 72 20 69 6e 74 20 ┆har *newstr; { register int ┆ 0x04f200…09e600 69 3b 0a 20 20 20 20 72 65 67 69 73 74 65 72 20 69 6e 74 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e ┆i; register int len = strlen┆ 0x04f200…09e600 28 6e 65 77 73 74 72 29 3b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 77 65 20 77 61 6e 74 20 ┆(newstr); /* * we want ┆ 0x04f200…09e600 74 6f 20 6f 76 65 72 77 72 69 74 65 20 74 68 65 20 6e 75 6c 6c 20 6f 6e 20 74 68 65 20 6e 65 78 ┆to overwrite the null on the nex┆ 0x04f200…09e600 74 20 70 61 73 73 2c 20 69 66 20 74 68 65 72 65 20 69 73 0a 20 20 20 20 20 2a 20 61 20 6e 65 78 ┆t pass, if there is * a nex┆ 0x04f200…09e600 74 20 70 61 73 73 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 69 66 20 28 28 70 61 72 65 6e 74 ┆t pass. */ if ((parent┆ 0x04f200…09e600 2d 3e 68 6f 77 6c 6f 6e 67 20 2b 20 6c 65 6e 29 20 3e 3d 20 70 61 72 65 6e 74 2d 3e 6d 61 78 6c ┆->howlong + len) >= parent->maxl┆ 0x04f200…09e600 65 6e 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 68 65 72 65 20 77 65 20 73 74 6f 6d 70 20 61 20 73 75 ┆en) { /* * here we stomp a su┆ 0x04f200…09e600 62 74 6c 65 20 62 75 67 3a 20 74 68 65 20 61 73 73 75 6d 70 74 69 6f 6e 20 74 68 61 74 20 0a 09 ┆btle bug: the assumption that ┆ 0x04f200…09e600 20 2a 20 6c 65 6e 20 3c 20 42 55 46 53 49 5a 2e 20 20 49 6e 73 74 65 61 64 20 6f 66 20 61 64 64 ┆ * len < BUFSIZ. Instead of add┆ 0x04f200…09e600 69 6e 67 20 42 55 46 53 49 5a 20 74 6f 0a 09 20 2a 20 70 61 72 65 6e 74 2d 3e 68 65 61 64 2c 20 ┆ing BUFSIZ to * parent->head, ┆ 0x04f200…09e600 61 64 64 20 28 6c 65 6e 20 2b 20 28 42 55 46 53 49 5a 20 2f 20 34 29 29 2e 0a 09 20 2a 2f 0a 09 ┆add (len + (BUFSIZ / 4)). */ ┆ 0x04f200…09e600 72 65 67 69 73 74 65 72 20 69 6e 74 20 6d 6f 72 65 72 6f 6f 6d 20 3d 20 6c 65 6e 20 2b 20 28 42 ┆register int moreroom = len + (B┆ 0x04f200…09e600 55 46 53 49 5a 2f 34 29 3b 0a 0a 09 70 61 72 65 6e 74 2d 3e 6d 61 78 6c 65 6e 20 2b 3d 20 6d 6f ┆UFSIZ/4); parent->maxlen += mo┆ 0x04f200…09e600 72 65 72 6f 6f 6d 3b 0a 09 69 66 20 28 70 61 72 65 6e 74 2d 3e 6d 61 78 6c 65 6e 20 3d 3d 20 6d ┆reroom; if (parent->maxlen == m┆ 0x04f200…09e600 6f 72 65 72 6f 6f 6d 29 0a 09 7b 09 09 0a 09 20 20 20 20 2f 2a 20 69 65 2c 20 77 61 73 20 74 68 ┆oreroom) { /* ie, was th┆ 0x04f200…09e600 69 73 20 74 68 65 20 66 69 72 73 74 20 74 72 69 70 20 74 68 72 6f 75 67 68 3f 20 2a 2f 0a 09 20 ┆is the first trip through? */ ┆ 0x04f200…09e600 20 20 20 70 61 72 65 6e 74 2d 3e 63 75 72 70 74 72 20 3d 20 70 61 72 65 6e 74 2d 3e 68 65 61 64 ┆ parent->curptr = parent->head┆ 0x04f200…09e600 20 3d 20 6d 61 6c 6c 6f 63 28 28 75 6e 73 69 67 6e 65 64 29 0a 09 09 09 09 09 09 20 20 20 73 69 ┆ = malloc((unsigned) si┆ 0x04f200…09e600 7a 65 6f 66 20 28 63 68 61 72 20 2a 29 0a 09 09 09 09 09 09 20 20 20 2a 20 70 61 72 65 6e 74 2d ┆zeof (char *) * parent-┆ 0x04f200…09e600 3e 6d 61 78 6c 65 6e 29 3b 0a 09 20 20 20 20 69 66 20 28 70 61 72 65 6e 74 2d 3e 63 75 72 70 74 ┆>maxlen); if (parent->curpt┆ 0x04f200…09e600 72 20 3d 3d 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 0a 09 09 78 65 72 72 6f 72 28 22 4f 75 ┆r == (char *) NULL) xerror("Ou┆ 0x04f200…09e600 74 20 6f 66 20 6d 65 6d 6f 72 79 22 29 3b 0a 09 7d 0a 09 65 6c 73 65 0a 09 7b 0a 09 20 20 20 20 ┆t of memory"); } else { ┆ 0x04f200…09e600 70 61 72 65 6e 74 2d 3e 68 65 61 64 20 3d 20 72 65 61 6c 6c 6f 63 28 70 61 72 65 6e 74 2d 3e 68 ┆parent->head = realloc(parent->h┆ 0x04f200…09e600 65 61 64 2c 28 28 75 6e 73 69 67 6e 65 64 29 20 73 69 7a 65 6f 66 0a 09 09 09 09 09 09 20 28 63 ┆ead,((unsigned) sizeof (c┆ 0x04f200…09e600 68 61 72 20 2a 29 0a 09 09 09 09 09 09 20 2a 20 70 61 72 65 6e 74 2d 3e 6d 61 78 6c 65 6e 29 29 ┆har *) * parent->maxlen))┆ 0x04f200…09e600 3b 0a 09 20 20 20 20 69 66 20 28 70 61 72 65 6e 74 2d 3e 68 65 61 64 20 3d 3d 20 28 63 68 61 72 ┆; if (parent->head == (char┆ 0x04f200…09e600 20 2a 29 20 4e 55 4c 4c 29 0a 09 09 78 65 72 72 6f 72 28 22 4f 75 74 20 6f 66 20 6d 65 6d 6f 72 ┆ *) NULL) xerror("Out of memor┆ 0x04f200…09e600 79 22 29 3b 0a 09 20 20 20 20 70 61 72 65 6e 74 2d 3e 63 75 72 70 74 72 20 3d 20 26 28 70 61 72 ┆y"); parent->curptr = &(par┆ 0x04f200…09e600 65 6e 74 2d 3e 68 65 61 64 5b 70 61 72 65 6e 74 2d 3e 68 6f 77 6c 6f 6e 67 5d 29 3b 0a 09 7d 0a ┆ent->head[parent->howlong]); } ┆ 0x04f200…09e600 20 20 20 20 7d 20 0a 0a 20 20 20 20 66 6f 72 20 28 69 20 3d 20 30 3b 20 69 20 3c 20 6c 65 6e 3b ┆ } for (i = 0; i < len;┆ 0x04f200…09e600 20 69 2b 2b 29 0a 20 20 20 20 7b 0a 09 69 66 20 28 6e 65 77 73 74 72 5b 69 5d 20 21 3d 20 27 5c ┆ i++) { if (newstr[i] != '\┆ 0x04f200…09e600 72 27 29 0a 09 7b 0a 09 20 20 20 20 2a 70 61 72 65 6e 74 2d 3e 63 75 72 70 74 72 2b 2b 20 3d 20 ┆r') { *parent->curptr++ = ┆ 0x04f200…09e600 6e 65 77 73 74 72 5b 69 5d 3b 0a 09 20 20 20 20 70 61 72 65 6e 74 2d 3e 68 6f 77 6c 6f 6e 67 2b ┆newstr[i]; parent->howlong+┆ 0x04f200…09e600 2b 3b 0a 09 7d 0a 20 20 20 20 7d 0a 7d 20 0a 0a 2f 2a 0a 20 2a 20 47 69 76 65 6e 20 61 20 28 73 ┆+; } } } /* * Given a (s┆ 0x04f200…09e600 74 72 75 63 74 20 67 72 6f 77 20 2a 29 20 61 6e 64 20 61 20 73 69 6e 67 6c 65 20 63 68 61 72 61 ┆truct grow *) and a single chara┆ 0x04f200…09e600 63 74 65 72 2c 20 61 70 70 65 6e 64 20 69 74 2c 20 61 73 20 6c 6f 6e 67 20 61 73 20 69 74 20 69 ┆cter, append it, as long as it i┆ 0x04f200…09e600 73 0a 20 2a 20 6e 6f 74 20 27 5c 72 27 2e 0a 20 2a 2f 0a 76 6f 69 64 20 67 72 6f 77 63 68 61 72 ┆s * not '\r'. */ void growchar┆ 0x04f200…09e600 28 70 61 72 65 6e 74 2c 20 63 29 0a 73 74 72 75 63 74 20 67 72 6f 77 20 2a 70 61 72 65 6e 74 3b ┆(parent, c) struct grow *parent;┆ 0x04f200…09e600 0a 72 65 67 69 73 74 65 72 20 63 68 61 72 20 63 3b 0a 7b 0a 20 20 20 20 69 66 20 28 63 20 3d 3d ┆ register char c; { if (c ==┆ 0x04f200…09e600 20 27 5c 72 27 29 20 72 65 74 75 72 6e 3b 0a 09 0a 20 20 20 20 69 66 20 28 28 70 61 72 65 6e 74 ┆ '\r') return; if ((parent┆ 0x04f200…09e600 2d 3e 68 6f 77 6c 6f 6e 67 20 2b 20 31 29 20 3e 3d 20 70 61 72 65 6e 74 2d 3e 6d 61 78 6c 65 6e ┆->howlong + 1) >= parent->maxlen┆ 0x04f200…09e600 29 20 7b 0a 09 09 0a 09 70 61 72 65 6e 74 2d 3e 6d 61 78 6c 65 6e 20 2b 3d 20 42 55 46 53 49 5a ┆) { parent->maxlen += BUFSIZ┆ 0x04f200…09e600 3b 0a 09 69 66 20 28 70 61 72 65 6e 74 2d 3e 6d 61 78 6c 65 6e 20 3d 3d 20 42 55 46 53 49 5a 29 ┆; if (parent->maxlen == BUFSIZ)┆ 0x04f200…09e600 0a 09 7b 09 09 0a 09 20 20 20 20 2f 2a 20 69 65 2c 20 77 61 73 20 74 68 69 73 20 74 68 65 20 66 ┆ { /* ie, was this the f┆ 0x04f200…09e600 69 72 73 74 20 74 72 69 70 20 74 68 72 6f 75 67 68 3f 20 2a 2f 0a 09 20 20 20 20 70 61 72 65 6e ┆irst trip through? */ paren┆ 0x04f200…09e600 74 2d 3e 68 65 61 64 20 3d 20 6d 61 6c 6c 6f 63 28 28 75 6e 73 69 67 6e 65 64 29 20 73 69 7a 65 ┆t->head = malloc((unsigned) size┆ 0x04f200…09e600 6f 66 20 28 63 68 61 72 20 2a 29 0a 09 09 09 09 20 20 2a 20 70 61 72 65 6e 74 2d 3e 6d 61 78 6c ┆of (char *) * parent->maxl┆ 0x04f200…09e600 65 6e 29 3b 0a 09 20 20 20 20 69 66 20 28 70 61 72 65 6e 74 2d 3e 68 65 61 64 20 3d 3d 20 28 63 ┆en); if (parent->head == (c┆ 0x04f200…09e600 68 61 72 20 2a 29 20 4e 55 4c 4c 29 0a 09 09 78 65 72 72 6f 72 28 22 4f 75 74 20 6f 66 20 6d 65 ┆har *) NULL) xerror("Out of me┆ 0x04f200…09e600 6d 6f 72 79 22 29 3b 0a 09 7d 0a 20 20 20 20 20 20 20 20 65 6c 73 65 0a 09 7b 0a 09 20 20 20 20 ┆mory"); } else { ┆ 0x04f200…09e600 70 61 72 65 6e 74 2d 3e 68 65 61 64 20 3d 20 72 65 61 6c 6c 6f 63 28 70 61 72 65 6e 74 2d 3e 68 ┆parent->head = realloc(parent->h┆ 0x04f200…09e600 65 61 64 2c 20 28 28 75 6e 73 69 67 6e 65 64 29 20 73 69 7a 65 6f 66 0a 09 09 09 09 09 09 20 20 ┆ead, ((unsigned) sizeof ┆ 0x04f200…09e600 28 63 68 61 72 20 2a 29 20 2a 20 70 61 72 65 6e 74 2d 3e 6d 61 78 6c 65 6e 29 29 3b 0a 09 20 20 ┆(char *) * parent->maxlen)); ┆ 0x04f200…09e600 20 20 69 66 20 28 70 61 72 65 6e 74 2d 3e 68 65 61 64 20 3d 3d 20 28 63 68 61 72 20 2a 29 20 4e ┆ if (parent->head == (char *) N┆ 0x04f200…09e600 55 4c 4c 29 0a 09 09 78 65 72 72 6f 72 28 22 4f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 22 29 3b 0a ┆ULL) xerror("Out of memory"); ┆ 0x04f200…09e600 09 7d 0a 09 70 61 72 65 6e 74 2d 3e 63 75 72 70 74 72 20 3d 20 70 61 72 65 6e 74 2d 3e 68 65 61 ┆ } parent->curptr = parent->hea┆ 0x04f200…09e600 64 20 2b 20 70 61 72 65 6e 74 2d 3e 68 6f 77 6c 6f 6e 67 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ┆d + parent->howlong; } ┆ 0x04f200…09e600 2a 70 61 72 65 6e 74 2d 3e 63 75 72 70 74 72 2b 2b 20 3d 20 63 3b 0a 20 20 20 20 70 61 72 65 6e ┆*parent->curptr++ = c; paren┆ 0x04f200…09e600 74 2d 3e 68 6f 77 6c 6f 6e 67 2b 2b 3b 0a 7d 20 0a 23 65 6e 64 69 66 20 2f 2a 20 46 55 54 55 52 ┆t->howlong++; } #endif /* FUTUR┆ 0x04f200…09e600 45 20 2a 2f 0a 0a 2f 2a 20 67 72 6f 77 2e 63 20 65 6e 64 73 20 68 65 72 65 20 2a 2f 0a 65 20 66 ┆E */ /* grow.c ends here */ e f┆ 0x04f200…09e600 69 72 73 74 20 74 72 69 70 20 74 68 72 6f 75 67 68 3f 20 2a 2f 0a 09 20 20 20 20 70 61 72 65 6e ┆irst trip through? */ paren┆ 0x04f200…09e600 74 2d 3e 68 65 61 64 20 3d 20 6d 61 6c 6c 6f 63 28 28 75 6e 73 69 67 6e 65 64 29 20 73 69 7a 65 ┆t->head = malloc((unsigned) size┆ 0x04f200…09e600 6f 66 20 28 63 68 61 72 20 2a 29 0a 09 09 09 09 20 20 2a 20 70 61 72 65 6e 74 2d 3e 6d 61 78 6c ┆of (char *) * parent->maxl┆ 0x04f200…09e600 65 6e 29 3b 0a 09 20 20 20 20 69 66 20 28 70 61 72 65 6e 74 2d 3e 68 65 61 64 20 3d 3d 20 28 63 ┆en); if (parent->head == (c┆ 0x04f200…09e600 68 61 72 20 2a 29 20 4e 55 4c 4c 29 0a 09 09 78 65 72 72 6f 72 28 22 4f 75 74 20 6f 66 20 6d 65 ┆har *) NULL) xerror("Out of me┆ 0x04f200…09e600 6d 6f 72 79 22 29 3b 0a 09 7d 0a 20 20 20 20 20 20 20 20 65 6c 73 65 0a 09 7b 0a 09 20 20 20 20 ┆mory"); } else { ┆ 0x04f200…09e600 70 61 72 65 6e 74 2d 3e 68 65 61 64 20 3d 20 72 65 61 6c 6c 6f 63 28 70 61 72 65 6e 74 2d 3e 68 ┆parent->head = realloc(parent->h┆ 0x04f200…09e600 65 61 64 2c 20 28 28 75 6e 73 69 67 6e 65 64 29 20 73 69 7a 65 6f 66 0a 09 09 09 09 09 09 20 20 ┆ead, ((unsigned) sizeof ┆ 0x04f200…09e600 28 63 68 61 72 20 2a 29 20 2a 20 70 61 72 65 6e 74 2d 3e 6d 61 78 6c 65 6e 29 29 3b 0a 09 20 20 ┆(char *) * parent->maxlen)); ┆ 0x04f200…09e600 20 20 69 66 20 28 70 61 72 65 6e 74 2d 3e 68 65 61 64 20 3d 3d 20 28 63 68 61 72 20 2a 29 20 4e ┆ if (parent->head == (char *) N┆ 0x04f200…09e600 55 4c 4c 29 0a 09 09 78 65 72 72 6f 72 28 22 4f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 22 29 3b 0a ┆ULL) xerror("Out of memory"); ┆ 0x04f200…09e600 09 7d 0a 09 70 61 72 65 6e 74 2d 3e 63 75 72 70 74 72 20 3d 20 70 61 72 65 6e 74 2d 3e 68 65 61 ┆ } parent->curptr = parent->hea┆ 0x04f200…09e600 64 20 2b 20 70 61 72 65 6e 74 2d 3e 68 6f 77 6c 6f 6e 67 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ┆d + parent->howlong; } ┆ 0x04f200…09e600 2a 70 61 72 65 6e 74 2d 3e 63 75 72 70 74 72 2b 2b 20 3d 20 63 3b 0a 20 20 20 20 70 61 72 65 6e ┆*parent->curptr++ = c; paren┆ 0x04f200…09e600 74 2d 3e 68 6f 77 6c 6f 6e 67 2b 2b 3b 0a 7d 20 0a 73 72 63 2f 44 2e 70 6f 72 74 2f 67 72 6f 77 ┆t->howlong++; } src/D.port/grow┆ 0x04f200…09e600 2e 68 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆.h ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆ ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 20 20 20 34 34 34 20 00 20 20 20 ┆ 444 ┆ 0x04f200…09e600 31 34 35 20 00 20 20 20 20 20 31 20 00 20 20 20 20 20 20 20 20 34 32 36 20 20 34 34 35 36 31 35 ┆145 1 426 445615┆ 0x04f200…09e600 34 30 35 30 20 20 20 37 31 32 37 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆4050 7127 ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆ ┆ […0x9…] 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 2f 2a 20 67 72 6f 77 2e 68 20 2d 2d 20 69 6e ┆ /* grow.h -- in┆ 0x04f200…09e600 74 65 72 66 61 63 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 66 6f 72 20 6d 61 6c 6c 6f 63 69 ┆terface declarations for malloci┆ 0x04f200…09e600 6e 67 20 6c 69 6e 65 20 72 65 61 64 65 72 20 2a 2f 0a 0a 73 74 72 75 63 74 20 67 72 6f 77 0a 7b ┆ng line reader */ struct grow {┆ 0x04f200…09e600 0a 20 20 20 20 69 6e 74 20 68 6f 77 6c 6f 6e 67 3b 0a 20 20 20 20 69 6e 74 20 6d 61 78 6c 65 6e ┆ int howlong; int maxlen┆ 0x04f200…09e600 3b 0a 20 20 20 20 63 68 61 72 20 2a 68 65 61 64 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 75 72 70 ┆; char *head; char *curp┆ 0x04f200…09e600 74 72 3b 0a 7d 3b 0a 0a 65 78 74 65 72 6e 20 73 74 72 75 63 74 20 67 72 6f 77 20 2a 67 72 6f 77 ┆tr; }; extern struct grow *grow┆ 0x04f200…09e600 69 6e 69 74 28 29 3b 0a 65 78 74 65 72 6e 20 63 68 61 72 20 2a 67 72 6f 77 66 70 28 29 3b 0a 65 ┆init(); extern char *growfp(); e┆ 0x04f200…09e600 78 74 65 72 6e 20 76 6f 69 64 20 67 72 6f 77 73 74 72 28 29 3b 0a 65 78 74 65 72 6e 20 76 6f 69 ┆xtern void growstr(); extern voi┆ 0x04f200…09e600 64 20 67 72 6f 77 63 68 61 72 28 29 3b 0a 0a 2f 2a 20 67 72 6f 77 2e 68 20 65 6e 64 73 20 68 65 ┆d growchar(); /* grow.h ends he┆ 0x04f200…09e600 72 65 20 2a 2f 0a 0a 75 6e 73 69 67 6e 65 64 29 20 73 69 7a 65 6f 66 0a 09 09 09 09 09 09 20 20 ┆re */ unsigned) sizeof ┆ 0x04f200…09e600 28 63 68 61 72 20 2a 29 20 2a 20 70 61 72 65 6e 74 2d 3e 6d 61 78 6c 65 6e 29 29 3b 0a 09 20 20 ┆(char *) * parent->maxlen)); ┆ 0x04f200…09e600 20 20 69 66 20 28 70 61 72 65 6e 74 2d 3e 68 65 61 64 20 3d 3d 20 28 63 68 61 72 20 2a 29 20 4e ┆ if (parent->head == (char *) N┆ 0x04f200…09e600 55 4c 4c 29 0a 09 09 78 65 72 72 6f 72 28 22 4f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 22 29 3b 0a ┆ULL) xerror("Out of memory"); ┆ 0x04f200…09e600 09 7d 0a 09 70 61 72 65 6e 74 2d 3e 63 75 72 70 74 72 20 3d 20 70 61 72 65 6e 74 2d 3e 68 65 61 ┆ } parent->curptr = parent->hea┆ 0x04f200…09e600 64 20 2b 20 70 61 72 65 6e 74 2d 3e 68 6f 77 6c 6f 6e 67 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ┆d + parent->howlong; } ┆ 0x04f200…09e600 2a 70 61 72 65 6e 74 2d 3e 63 75 72 70 74 72 2b 2b 20 3d 20 63 3b 0a 20 20 20 20 70 61 72 65 6e ┆*parent->curptr++ = c; paren┆ 0x04f200…09e600 74 2d 3e 68 6f 77 6c 6f 6e 67 2b 2b 3b 0a 7d 20 0a 73 72 63 2f 44 2e 70 6f 72 74 2f 6b 6d 61 6c ┆t->howlong++; } src/D.port/kmal┆ 0x04f200…09e600 6c 6f 63 2e 63 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆loc.c ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆ ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 20 20 20 34 34 34 20 00 20 20 20 ┆ 444 ┆ 0x04f200…09e600 31 34 35 20 00 20 20 20 20 20 31 20 00 20 20 20 20 20 20 32 33 36 34 33 20 20 34 34 35 36 31 35 ┆145 1 23643 445615┆ 0x04f200…09e600 34 30 35 35 20 20 20 37 36 34 31 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆4055 7641 ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆ ┆ […0x9…] 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 2f 2a 0a 20 2a 20 6d 61 6c 6c 6f 63 2e 63 20 ┆ /* * malloc.c ┆ 0x04f200…09e600 28 43 61 6c 74 65 63 68 29 20 32 2f 32 31 2f 38 32 0a 20 2a 20 43 68 72 69 73 20 4b 69 6e 67 73 ┆(Caltech) 2/21/82 * Chris Kings┆ 0x04f200…09e600 6c 65 79 2c 20 6b 69 6e 67 73 6c 65 79 40 63 69 74 2d 32 30 2e 0a 20 2a 20 54 68 69 73 20 76 65 ┆ley, kingsley@cit-20. * This ve┆ 0x04f200…09e600 72 73 69 6f 6e 20 72 69 70 70 65 64 20 6f 66 66 20 66 72 6f 6d 20 4c 61 72 72 79 20 57 61 6c 6c ┆rsion ripped off from Larry Wall┆ 0x04f200…09e600 27 73 20 70 65 72 6c 20 61 74 20 70 61 74 63 68 20 6c 65 76 65 6c 20 32 34 2c 20 74 68 65 6e 0a ┆'s perl at patch level 24, then ┆ 0x04f200…09e600 20 2a 20 6c 69 67 68 74 6c 79 20 68 61 63 6b 65 64 20 74 6f 20 63 6f 6e 66 6f 72 6d 20 74 6f 20 ┆ * lightly hacked to conform to ┆ 0x04f200…09e600 73 6f 6d 65 20 6e 65 74 6e 65 77 73 20 64 69 73 74 72 69 62 75 74 69 6f 6e 20 63 6f 64 65 20 63 ┆some netnews distribution code c┆ 0x04f200…09e600 6f 6e 76 65 6e 74 69 6f 6e 73 2e 0a 20 2a 0a 20 2a 20 54 68 69 73 20 69 73 20 61 20 76 65 72 79 ┆onventions. * * This is a very┆ 0x04f200…09e600 20 66 61 73 74 20 73 74 6f 72 61 67 65 20 61 6c 6c 6f 63 61 74 6f 72 2e 20 20 49 74 20 61 6c 6c ┆ fast storage allocator. It all┆ 0x04f200…09e600 6f 63 61 74 65 73 20 62 6c 6f 63 6b 73 20 6f 66 20 61 20 73 6d 61 6c 6c 20 0a 20 2a 20 6e 75 6d ┆ocates blocks of a small * num┆ 0x04f200…09e600 62 65 72 20 6f 66 20 64 69 66 66 65 72 65 6e 74 20 73 69 7a 65 73 2c 20 61 6e 64 20 6b 65 65 70 ┆ber of different sizes, and keep┆ 0x04f200…09e600 73 20 66 72 65 65 20 6c 69 73 74 73 20 6f 66 20 65 61 63 68 20 73 69 7a 65 2e 20 20 42 6c 6f 63 ┆s free lists of each size. Bloc┆ 0x04f200…09e600 6b 73 20 74 68 61 74 0a 20 2a 20 64 6f 6e 27 74 20 65 78 61 63 74 6c 79 20 66 69 74 20 61 72 65 ┆ks that * don't exactly fit are┆ 0x04f200…09e600 20 70 61 73 73 65 64 20 75 70 20 74 6f 20 74 68 65 20 6e 65 78 74 20 6c 61 72 67 65 72 20 73 69 ┆ passed up to the next larger si┆ 0x04f200…09e600 7a 65 2e 20 20 49 6e 20 74 68 69 73 20 0a 20 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2c ┆ze. In this * implementation,┆ 0x04f200…09e600 20 74 68 65 20 61 76 61 69 6c 61 62 6c 65 20 73 69 7a 65 73 20 61 72 65 20 32 5e 6e 2d 34 20 28 ┆ the available sizes are 2^n-4 (┆ 0x04f200…09e600 6f 72 20 32 5e 6e 2d 31 32 29 20 62 79 74 65 73 20 6c 6f 6e 67 2e 0a 20 2a 20 54 68 69 73 20 69 ┆or 2^n-12) bytes long. * This i┆ 0x04f200…09e600 73 20 64 65 73 69 67 6e 65 64 20 66 6f 72 20 75 73 65 20 69 6e 20 61 20 70 72 6f 67 72 61 6d 20 ┆s designed for use in a program ┆ 0x04f200…09e600 74 68 61 74 20 75 73 65 73 20 76 61 73 74 20 71 75 61 6e 74 69 74 69 65 73 20 6f 66 20 6d 65 6d ┆that uses vast quantities of mem┆ 0x04f200…09e600 6f 72 79 2c 0a 20 2a 20 62 75 74 20 62 6f 6d 62 73 20 77 68 65 6e 20 69 74 20 72 75 6e 73 20 6f ┆ory, * but bombs when it runs o┆ 0x04f200…09e600 75 74 2e 20 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 6c 69 6e 74 09 2f 2a 20 6c 65 74 20 74 68 65 ┆ut. */ #ifndef lint /* let the┆ 0x04f200…09e600 20 6c 69 6e 74 20 6c 69 62 72 61 72 79 20 68 61 6e 64 6c 65 20 72 65 66 65 72 65 6e 63 65 73 20 ┆ lint library handle references ┆ 0x04f200…09e600 74 6f 20 6d 61 6c 6c 6f 63 20 26 20 63 6f 2e 20 2a 2f 0a 0a 23 69 6e 63 6c 75 64 65 20 22 73 79 ┆to malloc & co. */ #include "sy┆ 0x04f200…09e600 73 74 65 6d 2e 68 22 09 2f 2a 20 69 6e 63 6c 75 64 65 73 20 73 74 64 69 6f 2e 68 20 61 6e 64 20 ┆stem.h" /* includes stdio.h and ┆ 0x04f200…09e600 6f 74 68 65 72 20 74 68 69 6e 67 73 20 2a 2f 0a 0a 23 64 65 66 69 6e 65 20 70 75 62 6c 69 63 09 ┆other things */ #define public ┆ 0x04f200…09e600 2f 2a 20 65 6d 70 74 79 20 2a 2f 0a 23 64 65 66 69 6e 65 20 52 43 48 45 43 4b 0a 0a 23 69 66 64 ┆/* empty */ #define RCHECK #ifd┆ 0x04f200…09e600 65 66 20 53 54 41 4e 44 41 4c 4f 4e 45 0a 74 79 70 65 64 65 66 20 63 68 61 72 09 2a 63 61 64 64 ┆ef STANDALONE typedef char *cadd┆ 0x04f200…09e600 72 5f 74 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 54 41 4e 44 41 4c 4f 4e 45 20 2a 2f 0a 0a 2f 2a ┆r_t; #endif /* STANDALONE */ /*┆ 0x04f200…09e600 0a 20 2a 20 54 68 65 20 6f 76 65 72 68 65 61 64 20 6f 6e 20 61 20 62 6c 6f 63 6b 20 69 73 20 61 ┆ * The overhead on a block is a┆ 0x04f200…09e600 74 20 6c 65 61 73 74 20 34 20 62 79 74 65 73 2e 20 20 57 68 65 6e 20 66 72 65 65 2c 20 74 68 69 ┆t least 4 bytes. When free, thi┆ 0x04f200…09e600 73 20 73 70 61 63 65 0a 20 2a 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f ┆s space * contains a pointer to┆ 0x04f200…09e600 20 74 68 65 20 6e 65 78 74 20 66 72 65 65 20 62 6c 6f 63 6b 2c 20 61 6e 64 20 74 68 65 20 62 6f ┆ the next free block, and the bo┆ 0x04f200…09e600 74 74 6f 6d 20 74 77 6f 20 62 69 74 73 20 6d 75 73 74 0a 20 2a 20 62 65 20 7a 65 72 6f 2e 20 20 ┆ttom two bits must * be zero. ┆ 0x04f200…09e600 57 68 65 6e 20 69 6e 20 75 73 65 2c 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20 69 73 20 73 ┆When in use, the first byte is s┆ 0x04f200…09e600 65 74 20 74 6f 20 4d 41 47 49 43 2c 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e 64 0a 20 2a 20 62 ┆et to MAGIC, and the second * b┆ 0x04f200…09e600 79 74 65 20 69 73 20 74 68 65 20 73 69 7a 65 20 69 6e 64 65 78 2e 20 20 54 68 65 20 72 65 6d 61 ┆yte is the size index. The rema┆ 0x04f200…09e600 69 6e 69 6e 67 20 62 79 74 65 73 20 61 72 65 20 66 6f 72 20 61 6c 69 67 6e 6d 65 6e 74 2e 0a 20 ┆ining bytes are for alignment. ┆ 0x04f200…09e600 2a 20 49 66 20 72 61 6e 67 65 20 63 68 65 63 6b 69 6e 67 20 69 73 20 65 6e 61 62 6c 65 64 20 61 ┆* If range checking is enabled a┆ 0x04f200…09e600 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 20 66 69 74 73 0a 20 2a ┆nd the size of the block fits *┆ 0x04f200…09e600 20 69 6e 20 74 77 6f 20 62 79 74 65 73 2c 20 74 68 65 6e 20 74 68 65 20 74 6f 70 20 74 77 6f 20 ┆ in two bytes, then the top two ┆ 0x04f200…09e600 62 79 74 65 73 20 68 6f 6c 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 72 65 71 75 65 ┆bytes hold the size of the reque┆ 0x04f200…09e600 73 74 65 64 20 62 6c 6f 63 6b 0a 20 2a 20 70 6c 75 73 20 74 68 65 20 72 61 6e 67 65 20 63 68 65 ┆sted block * plus the range che┆ 0x04f200…09e600 63 6b 69 6e 67 20 77 6f 72 64 73 2c 20 61 6e 64 20 74 68 65 20 68 65 61 64 65 72 20 77 6f 72 64 ┆cking words, and the header word┆ 0x04f200…09e600 20 4d 49 4e 55 53 20 4f 4e 45 2e 0a 20 2a 2f 0a 75 6e 69 6f 6e 20 6f 76 65 72 68 65 61 64 0a 7b ┆ MINUS ONE. */ union overhead {┆ 0x04f200…09e600 0a 20 20 20 20 75 6e 69 6f 6e 09 6f 76 65 72 68 65 61 64 20 2a 6f 76 5f 6e 65 78 74 3b 09 2f 2a ┆ union overhead *ov_next; /*┆ 0x04f200…09e600 20 77 68 65 6e 20 66 72 65 65 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20 7b 0a 09 75 6e 73 69 ┆ when free */ struct { unsi┆ 0x04f200…09e600 67 6e 65 64 20 63 68 61 72 09 6f 76 75 5f 6d 61 67 69 63 3b 09 2f 2a 20 6d 61 67 69 63 20 6e 75 ┆gned char ovu_magic; /* magic nu┆ 0x04f200…09e600 6d 62 65 72 20 2a 2f 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 09 6f 76 75 5f 69 6e 64 65 78 ┆mber */ unsigned char ovu_index┆ 0x04f200…09e600 3b 09 2f 2a 20 62 75 63 6b 65 74 20 23 20 2a 2f 0a 23 69 66 64 65 66 20 52 43 48 45 43 4b 0a 09 ┆; /* bucket # */ #ifdef RCHECK ┆ 0x04f200…09e600 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 09 6f 76 75 5f 73 69 7a 65 3b 09 2f 2a 20 61 63 74 75 ┆unsigned short ovu_size; /* actu┆ 0x04f200…09e600 61 6c 20 62 6c 6f 63 6b 20 73 69 7a 65 20 2a 2f 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e 74 09 6f ┆al block size */ unsigned int o┆ 0x04f200…09e600 76 75 5f 72 6d 61 67 69 63 3b 09 2f 2a 20 72 61 6e 67 65 20 6d 61 67 69 63 20 6e 75 6d 62 65 72 ┆vu_rmagic; /* range magic number┆ 0x04f200…09e600 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 20 6f 76 75 3b 0a 23 64 65 66 69 6e 65 09 6f 76 ┆ */ #endif } ovu; #define ov┆ 0x04f200…09e600 5f 6d 61 67 69 63 09 6f 76 75 2e 6f 76 75 5f 6d 61 67 69 63 0a 23 64 65 66 69 6e 65 09 6f 76 5f ┆_magic ovu.ovu_magic #define ov_┆ 0x04f200…09e600 69 6e 64 65 78 09 6f 76 75 2e 6f 76 75 5f 69 6e 64 65 78 0a 23 64 65 66 69 6e 65 09 6f 76 5f 73 ┆index ovu.ovu_index #define ov_s┆ 0x04f200…09e600 69 7a 65 09 09 6f 76 75 2e 6f 76 75 5f 73 69 7a 65 0a 23 64 65 66 69 6e 65 09 6f 76 5f 72 6d 61 ┆ize ovu.ovu_size #define ov_rma┆ 0x04f200…09e600 67 69 63 09 6f 76 75 2e 6f 76 75 5f 72 6d 61 67 69 63 0a 7d 3b 0a 0a 23 64 65 66 69 6e 65 09 4d ┆gic ovu.ovu_rmagic }; #define M┆ 0x04f200…09e600 41 47 49 43 09 09 30 78 66 66 09 09 2f 2a 20 6d 61 67 69 63 20 23 20 6f 6e 20 61 63 63 6f 75 6e ┆AGIC 0xff /* magic # on accoun┆ 0x04f200…09e600 74 69 6e 67 20 69 6e 66 6f 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4f 4c 44 4d 41 47 49 43 09 30 78 ┆ting info */ #define OLDMAGIC 0x┆ 0x04f200…09e600 37 66 09 09 2f 2a 20 73 61 6d 65 20 61 66 74 65 72 20 61 20 66 72 65 65 28 29 20 2a 2f 0a 23 64 ┆7f /* same after a free() */ #d┆ 0x04f200…09e600 65 66 69 6e 65 20 52 4d 41 47 49 43 09 09 30 78 35 35 35 35 35 35 35 35 09 2f 2a 20 6d 61 67 69 ┆efine RMAGIC 0x55555555 /* magi┆ 0x04f200…09e600 63 20 23 20 6f 6e 20 72 61 6e 67 65 20 69 6e 66 6f 20 2a 2f 0a 23 69 66 64 65 66 20 52 43 48 45 ┆c # on range info */ #ifdef RCHE┆ 0x04f200…09e600 43 4b 0a 23 64 65 66 69 6e 65 09 52 53 4c 4f 50 09 09 73 69 7a 65 6f 66 20 28 75 6e 73 69 67 6e ┆CK #define RSLOP sizeof (unsign┆ 0x04f200…09e600 65 64 20 69 6e 74 29 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 09 52 53 4c 4f 50 09 09 30 0a 23 ┆ed int) #else #define RSLOP 0 #┆ 0x04f200…09e600 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 6e 65 78 74 66 5b 69 5d 20 69 73 20 74 68 65 20 70 6f 69 ┆endif /* * nextf[i] is the poi┆ 0x04f200…09e600 6e 74 65 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20 66 72 65 65 20 62 6c 6f 63 6b 20 6f 66 20 73 ┆nter to the next free block of s┆ 0x04f200…09e600 69 7a 65 20 32 5e 28 69 2b 33 29 2e 20 20 54 68 65 0a 20 2a 20 73 6d 61 6c 6c 65 73 74 20 61 6c ┆ize 2^(i+3). The * smallest al┆ 0x04f200…09e600 6c 6f 63 61 74 61 62 6c 65 20 62 6c 6f 63 6b 20 69 73 20 38 20 62 79 74 65 73 2e 20 20 54 68 65 ┆locatable block is 8 bytes. The┆ 0x04f200…09e600 20 6f 76 65 72 68 65 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 20 2a 20 70 72 65 63 65 64 65 ┆ overhead information * precede┆ 0x04f200…09e600 73 20 74 68 65 20 64 61 74 61 20 61 72 65 61 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 ┆s the data area returned to the ┆ 0x04f200…09e600 75 73 65 72 2e 0a 20 2a 2f 0a 23 64 65 66 69 6e 65 09 4e 42 55 43 4b 45 54 53 20 33 30 0a 73 74 ┆user. */ #define NBUCKETS 30 st┆ 0x04f200…09e600 61 74 69 63 09 75 6e 69 6f 6e 20 6f 76 65 72 68 65 61 64 20 2a 6e 65 78 74 66 5b 4e 42 55 43 4b ┆atic union overhead *nextf[NBUCK┆ 0x04f200…09e600 45 54 53 5d 3b 0a 65 78 74 65 72 6e 09 63 68 61 72 20 2a 73 62 72 6b 28 29 3b 0a 0a 23 69 66 64 ┆ETS]; extern char *sbrk(); #ifd┆ 0x04f200…09e600 65 66 20 4d 53 54 41 54 53 0a 2f 2a 0a 20 2a 20 6e 6d 61 6c 6c 6f 63 5b 69 5d 20 69 73 20 74 68 ┆ef MSTATS /* * nmalloc[i] is th┆ 0x04f200…09e600 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 ┆e difference between the number ┆ 0x04f200…09e600 6f 66 20 6d 61 6c 6c 6f 63 73 20 61 6e 64 20 66 72 65 65 73 0a 20 2a 20 66 6f 72 20 61 20 67 69 ┆of mallocs and frees * for a gi┆ 0x04f200…09e600 76 65 6e 20 62 6c 6f 63 6b 20 73 69 7a 65 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 09 75 6e 73 69 67 ┆ven block size. */ static unsig┆ 0x04f200…09e600 6e 65 64 20 69 6e 74 20 6e 6d 61 6c 6c 6f 63 5b 4e 42 55 43 4b 45 54 53 5d 3b 0a 23 69 6e 63 6c ┆ned int nmalloc[NBUCKETS]; #incl┆ 0x04f200…09e600 75 64 65 20 3c 73 74 64 69 6f 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 64 65 62 ┆ude <stdio.h> #endif #ifdef deb┆ 0x04f200…09e600 75 67 0a 23 64 65 66 69 6e 65 09 41 53 53 45 52 54 28 70 29 20 20 20 69 66 20 28 21 28 70 29 29 ┆ug #define ASSERT(p) if (!(p))┆ 0x04f200…09e600 20 62 6f 74 63 68 28 22 70 22 29 3b 20 65 6c 73 65 0a 73 74 61 74 69 63 20 62 6f 74 63 68 28 73 ┆ botch("p"); else static botch(s┆ 0x04f200…09e600 29 0a 63 68 61 72 20 2a 73 3b 0a 7b 0a 20 20 20 20 28 76 6f 69 64 29 20 70 72 69 6e 74 66 28 22 ┆) char *s; { (void) printf("┆ 0x04f200…09e600 61 73 73 65 72 74 69 6f 6e 20 62 6f 74 63 68 65 64 3a 20 25 73 5c 6e 22 2c 20 73 29 3b 0a 20 20 ┆assertion botched: %s\n", s); ┆ 0x04f200…09e600 20 20 28 76 6f 69 64 29 20 61 62 6f 72 74 28 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e ┆ (void) abort(); } #else #defin┆ 0x04f200…09e600 65 09 41 53 53 45 52 54 28 70 29 0a 23 65 6e 64 69 66 0a 0a 70 75 62 6c 69 63 20 63 68 61 72 20 ┆e ASSERT(p) #endif public char ┆ 0x04f200…09e600 2a 6d 61 6c 6c 6f 63 28 6e 62 79 74 65 73 29 0a 72 65 67 69 73 74 65 72 20 75 6e 73 69 67 6e 65 ┆*malloc(nbytes) register unsigne┆ 0x04f200…09e600 64 20 6e 62 79 74 65 73 3b 0a 7b 0a 20 20 20 20 72 65 67 69 73 74 65 72 20 75 6e 69 6f 6e 20 6f ┆d nbytes; { register union o┆ 0x04f200…09e600 76 65 72 68 65 61 64 20 2a 70 3b 0a 20 20 20 20 72 65 67 69 73 74 65 72 20 69 6e 74 20 62 75 63 ┆verhead *p; register int buc┆ 0x04f200…09e600 6b 65 74 20 3d 20 30 3b 0a 20 20 20 20 72 65 67 69 73 74 65 72 20 75 6e 73 69 67 6e 65 64 20 73 ┆ket = 0; register unsigned s┆ 0x04f200…09e600 68 69 66 74 72 3b 0a 20 20 20 20 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 72 65 63 6f 72 65 28 29 ┆hiftr; static int morecore()┆ 0x04f200…09e600 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 43 6f 6e 76 65 72 74 20 61 6d 6f 75 6e 74 20 ┆; /* * Convert amount ┆ 0x04f200…09e600 6f 66 20 6d 65 6d 6f 72 79 20 72 65 71 75 65 73 74 65 64 20 69 6e 74 6f 0a 20 20 20 20 20 2a 20 ┆of memory requested into * ┆ 0x04f200…09e600 63 6c 6f 73 65 73 74 20 62 6c 6f 63 6b 20 73 69 7a 65 20 73 74 6f 72 65 64 20 69 6e 20 68 61 73 ┆closest block size stored in has┆ 0x04f200…09e600 68 20 62 75 63 6b 65 74 73 0a 20 20 20 20 20 2a 20 77 68 69 63 68 20 73 61 74 69 73 66 69 65 73 ┆h buckets * which satisfies┆ 0x04f200…09e600 20 72 65 71 75 65 73 74 2e 20 20 41 63 63 6f 75 6e 74 20 66 6f 72 0a 20 20 20 20 20 2a 20 73 70 ┆ request. Account for * sp┆ 0x04f200…09e600 61 63 65 20 75 73 65 64 20 70 65 72 20 62 6c 6f 63 6b 20 66 6f 72 20 61 63 63 6f 75 6e 74 69 6e ┆ace used per block for accountin┆ 0x04f200…09e600 67 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 6e 62 79 74 65 73 20 2b 3d 20 73 69 7a 65 6f 66 20 ┆g. */ nbytes += sizeof ┆ 0x04f200…09e600 28 75 6e 69 6f 6e 20 6f 76 65 72 68 65 61 64 29 20 2b 20 52 53 4c 4f 50 3b 0a 20 20 20 20 6e 62 ┆(union overhead) + RSLOP; nb┆ 0x04f200…09e600 79 74 65 73 20 3d 20 28 6e 62 79 74 65 73 20 2b 20 33 29 20 26 7e 20 33 3b 20 0a 20 20 20 20 73 ┆ytes = (nbytes + 3) &~ 3; s┆ 0x04f200…09e600 68 69 66 74 72 20 3d 20 28 6e 62 79 74 65 73 20 2d 20 31 29 20 3e 3e 20 32 3b 0a 20 20 20 20 2f ┆hiftr = (nbytes - 1) >> 2; /┆ 0x04f200…09e600 2a 20 61 70 61 72 74 20 66 72 6f 6d 20 74 68 69 73 20 6c 6f 6f 70 2c 20 74 68 69 73 20 69 73 20 ┆* apart from this loop, this is ┆ 0x04f200…09e600 4f 28 31 29 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 20 28 73 68 69 66 74 72 20 3e 3e 3d 20 31 29 ┆O(1) */ while (shiftr >>= 1)┆ 0x04f200…09e600 0a 09 62 75 63 6b 65 74 2b 2b 3b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 49 66 20 6e 6f 74 ┆ bucket++; /* * If not┆ 0x04f200…09e600 68 69 6e 67 20 69 6e 20 68 61 73 68 20 62 75 63 6b 65 74 20 72 69 67 68 74 20 6e 6f 77 2c 0a 20 ┆hing in hash bucket right now, ┆ 0x04f200…09e600 20 20 20 20 2a 20 72 65 71 75 65 73 74 20 6d 6f 72 65 20 6d 65 6d 6f 72 79 20 66 72 6f 6d 20 74 ┆ * request more memory from t┆ 0x04f200…09e600 68 65 20 73 79 73 74 65 6d 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 20 28 6e 65 78 74 66 ┆he system. */ if (nextf┆ 0x04f200…09e600 5b 62 75 63 6b 65 74 5d 20 3d 3d 20 28 75 6e 69 6f 6e 20 6f 76 65 72 68 65 61 64 20 2a 29 4e 55 ┆[bucket] == (union overhead *)NU┆ 0x04f200…09e600 4c 4c 29 20 20 20 20 0a 09 28 76 6f 69 64 29 20 6d 6f 72 65 63 6f 72 65 28 62 75 63 6b 65 74 29 ┆LL) (void) morecore(bucket)┆ 0x04f200…09e600 3b 0a 20 20 20 20 69 66 20 28 28 70 20 3d 20 28 75 6e 69 6f 6e 20 6f 76 65 72 68 65 61 64 20 2a ┆; if ((p = (union overhead *┆ 0x04f200…09e600 29 6e 65 78 74 66 5b 62 75 63 6b 65 74 5d 29 20 3d 3d 20 28 75 6e 69 6f 6e 20 6f 76 65 72 68 65 ┆)nextf[bucket]) == (union overhe┆ 0x04f200…09e600 61 64 20 2a 29 4e 55 4c 4c 29 0a 09 72 65 74 75 72 6e 20 28 28 63 68 61 72 20 2a 29 4e 55 4c 4c ┆ad *)NULL) return ((char *)NULL┆ 0x04f200…09e600 29 3b 0a 20 20 20 20 2f 2a 20 72 65 6d 6f 76 65 20 66 72 6f 6d 20 6c 69 6e 6b 65 64 20 6c 69 73 ┆); /* remove from linked lis┆ 0x04f200…09e600 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 2a 28 28 69 6e 74 2a 29 70 29 20 3e 20 30 78 31 30 30 30 ┆t */ if (*((int*)p) > 0x1000┆ 0x04f200…09e600 30 30 30 30 29 0a 09 28 76 6f 69 64 29 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 43 6f 72 ┆0000) (void)fprintf(stderr,"Cor┆ 0x04f200…09e600 72 75 70 74 20 6d 61 6c 6c 6f 63 20 70 74 72 20 30 78 25 78 20 61 74 20 30 78 25 78 5c 6e 22 2c ┆rupt malloc ptr 0x%x at 0x%x\n",┆ 0x04f200…09e600 2a 28 28 69 6e 74 2a 29 70 29 2c 70 29 3b 0a 20 20 20 20 6e 65 78 74 66 5b 62 75 63 6b 65 74 5d ┆*((int*)p),p); nextf[bucket]┆ 0x04f200…09e600 20 3d 20 6e 65 78 74 66 5b 62 75 63 6b 65 74 5d 2d 3e 6f 76 5f 6e 65 78 74 3b 0a 20 20 20 20 70 ┆ = nextf[bucket]->ov_next; p┆ 0x04f200…09e600 2d 3e 6f 76 5f 6d 61 67 69 63 20 3d 20 4d 41 47 49 43 3b 0a 20 20 20 20 70 2d 3e 6f 76 5f 69 6e ┆->ov_magic = MAGIC; p->ov_in┆ 0x04f200…09e600 64 65 78 20 3d 20 62 75 63 6b 65 74 3b 0a 23 69 66 64 65 66 20 4d 53 54 41 54 53 0a 20 20 20 20 ┆dex = bucket; #ifdef MSTATS ┆ 0x04f200…09e600 6e 6d 61 6c 6c 6f 63 5b 62 75 63 6b 65 74 5d 2b 2b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 ┆nmalloc[bucket]++; #endif #ifdef┆ 0x04f200…09e600 20 52 43 48 45 43 4b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 52 65 63 6f 72 64 20 61 6c 6c ┆ RCHECK /* * Record all┆ 0x04f200…09e600 6f 63 61 74 65 64 20 73 69 7a 65 20 6f 66 20 62 6c 6f 63 6b 20 61 6e 64 0a 20 20 20 20 20 2a 20 ┆ocated size of block and * ┆ 0x04f200…09e600 62 6f 75 6e 64 20 73 70 61 63 65 20 77 69 74 68 20 6d 61 67 69 63 20 6e 75 6d 62 65 72 73 2e 0a ┆bound space with magic numbers. ┆ 0x04f200…09e600 20 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 20 28 6e 62 79 74 65 73 20 3c 3d 20 30 78 31 30 30 30 ┆ */ if (nbytes <= 0x1000┆ 0x04f200…09e600 30 29 0a 09 70 2d 3e 6f 76 5f 73 69 7a 65 20 3d 20 6e 62 79 74 65 73 20 2d 20 31 3b 0a 20 20 20 ┆0) p->ov_size = nbytes - 1; ┆ 0x04f200…09e600 20 70 2d 3e 6f 76 5f 72 6d 61 67 69 63 20 3d 20 52 4d 41 47 49 43 3b 0a 20 20 20 20 2a 28 28 75 ┆ p->ov_rmagic = RMAGIC; *((u┆ 0x04f200…09e600 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a 29 28 28 63 61 64 64 72 5f 74 29 70 20 2b 20 6e 62 79 74 ┆nsigned int *)((caddr_t)p + nbyt┆ 0x04f200…09e600 65 73 20 2d 20 52 53 4c 4f 50 29 29 20 3d 20 52 4d 41 47 49 43 3b 0a 23 65 6e 64 69 66 0a 20 20 ┆es - RSLOP)) = RMAGIC; #endif ┆ 0x04f200…09e600 20 20 72 65 74 75 72 6e 20 28 28 63 68 61 72 20 2a 29 28 70 20 2b 20 31 29 29 3b 0a 7d 0a 0a 2f ┆ return ((char *)(p + 1)); } /┆ 0x04f200…09e600 2a 0a 20 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 6f 72 65 20 6d 65 6d 6f 72 79 20 74 6f 20 74 68 65 ┆* * Allocate more memory to the┆ 0x04f200…09e600 20 69 6e 64 69 63 61 74 65 64 20 62 75 63 6b 65 74 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e ┆ indicated bucket. */ static in┆ 0x04f200…09e600 74 20 6d 6f 72 65 63 6f 72 65 28 62 75 63 6b 65 74 29 0a 72 65 67 69 73 74 65 72 20 69 6e 74 20 ┆t morecore(bucket) register int ┆ 0x04f200…09e600 62 75 63 6b 65 74 3b 0a 7b 0a 20 20 20 20 72 65 67 69 73 74 65 72 20 75 6e 69 6f 6e 20 6f 76 65 ┆bucket; { register union ove┆ 0x04f200…09e600 72 68 65 61 64 20 2a 6f 70 3b 0a 20 20 20 20 72 65 67 69 73 74 65 72 20 69 6e 74 20 72 6e 75 3b ┆rhead *op; register int rnu;┆ 0x04f200…09e600 20 20 20 20 20 20 20 2f 2a 20 32 5e 72 6e 75 20 62 79 74 65 73 20 77 69 6c 6c 20 62 65 20 72 65 ┆ /* 2^rnu bytes will be re┆ 0x04f200…09e600 71 75 65 73 74 65 64 20 2a 2f 0a 20 20 20 20 72 65 67 69 73 74 65 72 20 69 6e 74 20 6e 62 6c 6b ┆quested */ register int nblk┆ 0x04f200…09e600 73 3b 20 20 20 20 20 2f 2a 20 62 65 63 6f 6d 65 20 6e 62 6c 6b 73 20 62 6c 6f 63 6b 73 20 6f 66 ┆s; /* become nblks blocks of┆ 0x04f200…09e600 20 74 68 65 20 64 65 73 69 72 65 64 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 72 65 67 69 73 74 65 ┆ the desired size */ registe┆ 0x04f200…09e600 72 20 69 6e 74 20 73 69 7a 3b 0a 0a 20 20 20 20 69 66 20 28 6e 65 78 74 66 5b 62 75 63 6b 65 74 ┆r int siz; if (nextf[bucket┆ 0x04f200…09e600 5d 29 0a 09 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 49 6e 73 75 72 ┆]) return; /* * Insur┆ 0x04f200…09e600 65 20 6d 65 6d 6f 72 79 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20 20 2a 20 6f 6e 20 ┆e memory is allocated * on ┆ 0x04f200…09e600 61 20 70 61 67 65 20 62 6f 75 6e 64 61 72 79 2e 20 20 53 68 6f 75 6c 64 0a 20 20 20 20 20 2a 20 ┆a page boundary. Should * ┆ 0x04f200…09e600 6d 61 6b 65 20 67 65 74 70 61 67 65 69 7a 65 20 63 61 6c 6c 3f 0a 20 20 20 20 20 2a 2f 0a 20 20 ┆make getpageize call? */ ┆ 0x04f200…09e600 20 20 6f 70 20 3d 20 28 75 6e 69 6f 6e 20 6f 76 65 72 68 65 61 64 20 2a 29 73 62 72 6b 28 30 29 ┆ op = (union overhead *)sbrk(0)┆ 0x04f200…09e600 3b 0a 20 20 20 20 69 66 20 28 28 69 6e 74 29 6f 70 20 26 20 30 78 33 66 66 29 0a 09 28 76 6f 69 ┆; if ((int)op & 0x3ff) (voi┆ 0x04f200…09e600 64 29 20 73 62 72 6b 28 31 30 32 34 20 2d 20 28 28 69 6e 74 29 6f 70 20 26 20 30 78 33 66 66 29 ┆d) sbrk(1024 - ((int)op & 0x3ff)┆ 0x04f200…09e600 29 3b 0a 0a 20 20 20 20 2f 2a 20 74 61 6b 65 20 32 6b 20 75 6e 6c 65 73 73 20 74 68 65 20 62 6c ┆); /* take 2k unless the bl┆ 0x04f200…09e600 6f 63 6b 20 69 73 20 62 69 67 67 65 72 20 74 68 61 6e 20 74 68 61 74 20 2a 2f 0a 20 20 20 20 72 ┆ock is bigger than that */ r┆ 0x04f200…09e600 6e 75 20 3d 20 28 62 75 63 6b 65 74 20 3c 3d 20 38 29 20 3f 20 31 31 20 3a 20 62 75 63 6b 65 74 ┆nu = (bucket <= 8) ? 11 : bucket┆ 0x04f200…09e600 20 2b 20 33 3b 0a 20 20 20 20 6e 62 6c 6b 73 20 3d 20 31 20 3c 3c 20 28 72 6e 75 20 2d 20 28 62 ┆ + 3; nblks = 1 << (rnu - (b┆ 0x04f200…09e600 75 63 6b 65 74 20 2b 20 33 29 29 3b 20 20 2f 2a 20 68 6f 77 20 6d 61 6e 79 20 62 6c 6f 63 6b 73 ┆ucket + 3)); /* how many blocks┆ 0x04f200…09e600 20 74 6f 20 67 65 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 72 6e 75 20 3c 20 62 75 63 6b 65 74 29 ┆ to get */ if (rnu < bucket)┆ 0x04f200…09e600 0a 09 72 6e 75 20 3d 20 62 75 63 6b 65 74 3b 0a 20 20 20 20 6f 70 20 3d 20 28 75 6e 69 6f 6e 20 ┆ rnu = bucket; op = (union ┆ 0x04f200…09e600 6f 76 65 72 68 65 61 64 20 2a 29 73 62 72 6b 28 31 20 3c 3c 20 72 6e 75 29 3b 0a 0a 20 20 20 20 ┆overhead *)sbrk(1 << rnu); ┆ 0x04f200…09e600 2f 2a 20 6e 6f 20 6d 6f 72 65 20 72 6f 6f 6d 21 20 2a 2f 0a 20 20 20 20 69 66 20 28 28 69 6e 74 ┆/* no more room! */ if ((int┆ 0x04f200…09e600 29 6f 70 20 3d 3d 20 2d 31 29 0a 09 72 65 74 75 72 6e 3b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 ┆)op == -1) return; /* ┆ 0x04f200…09e600 2a 20 52 6f 75 6e 64 20 75 70 20 74 6f 20 6d 69 6e 69 6d 75 6d 20 61 6c 6c 6f 63 61 74 69 6f 6e ┆* Round up to minimum allocation┆ 0x04f200…09e600 20 73 69 7a 65 20 62 6f 75 6e 64 61 72 79 0a 20 20 20 20 20 2a 20 61 6e 64 20 64 65 64 75 63 74 ┆ size boundary * and deduct┆ 0x04f200…09e600 20 66 72 6f 6d 20 62 6c 6f 63 6b 20 63 6f 75 6e 74 20 74 6f 20 72 65 66 6c 65 63 74 2e 0a 20 20 ┆ from block count to reflect. ┆ 0x04f200…09e600 20 20 20 2a 2f 0a 20 20 20 20 69 66 20 28 28 69 6e 74 29 6f 70 20 26 20 37 29 0a 20 20 20 20 7b ┆ */ if ((int)op & 7) {┆ 0x04f200…09e600 0a 09 6f 70 20 3d 20 28 75 6e 69 6f 6e 20 6f 76 65 72 68 65 61 64 20 2a 29 28 28 28 69 6e 74 29 ┆ op = (union overhead *)(((int)┆ 0x04f200…09e600 6f 70 20 2b 20 38 29 20 26 7e 20 37 29 3b 0a 09 6e 62 6c 6b 73 2d 2d 3b 0a 20 20 20 20 7d 0a 20 ┆op + 8) &~ 7); nblks--; } ┆ 0x04f200…09e600 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 41 64 64 20 6e 65 77 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f ┆ /* * Add new memory allo┆ 0x04f200…09e600 63 61 74 65 64 20 74 6f 20 74 68 61 74 20 6f 6e 0a 20 20 20 20 20 2a 20 66 72 65 65 20 6c 69 73 ┆cated to that on * free lis┆ 0x04f200…09e600 74 20 66 6f 72 20 74 68 69 73 20 68 61 73 68 20 62 75 63 6b 65 74 2e 0a 20 20 20 20 20 2a 2f 0a ┆t for this hash bucket. */ ┆ 0x04f200…09e600 20 20 20 20 6e 65 78 74 66 5b 62 75 63 6b 65 74 5d 20 3d 20 6f 70 3b 0a 20 20 20 20 73 69 7a 20 ┆ nextf[bucket] = op; siz ┆ 0x04f200…09e600 3d 20 31 20 3c 3c 20 28 62 75 63 6b 65 74 20 2b 20 33 29 3b 0a 20 20 20 20 77 68 69 6c 65 20 28 ┆= 1 << (bucket + 3); while (┆ 0x04f200…09e600 2d 2d 6e 62 6c 6b 73 20 3e 20 30 29 0a 20 20 20 20 7b 0a 09 6f 70 2d 3e 6f 76 5f 6e 65 78 74 20 ┆--nblks > 0) { op->ov_next ┆ 0x04f200…09e600 3d 20 28 75 6e 69 6f 6e 20 6f 76 65 72 68 65 61 64 20 2a 29 28 28 63 61 64 64 72 5f 74 29 6f 70 ┆= (union overhead *)((caddr_t)op┆ 0x04f200…09e600 20 2b 20 73 69 7a 29 3b 0a 09 6f 70 20 3d 20 28 75 6e 69 6f 6e 20 6f 76 65 72 68 65 61 64 20 2a ┆ + siz); op = (union overhead *┆ 0x04f200…09e600 29 28 28 63 61 64 64 72 5f 74 29 6f 70 20 2b 20 73 69 7a 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0a 70 ┆)((caddr_t)op + siz); } } p┆ 0x04f200…09e600 75 62 6c 69 63 20 76 6f 69 64 20 66 72 65 65 28 63 70 29 0a 2f 2a 20 66 72 65 65 20 61 6e 20 61 ┆ublic void free(cp) /* free an a┆ 0x04f200…09e600 6c 6c 6f 63 61 74 65 64 20 72 65 67 69 6f 6e 20 2a 2f 0a 63 68 61 72 20 2a 63 70 3b 0a 7b 20 20 ┆llocated region */ char *cp; { ┆ 0x04f200…09e600 20 0a 20 20 20 20 72 65 67 69 73 74 65 72 20 69 6e 74 20 73 69 7a 65 3b 0a 20 20 20 20 72 65 67 ┆ register int size; reg┆ 0x04f200…09e600 69 73 74 65 72 20 75 6e 69 6f 6e 20 6f 76 65 72 68 65 61 64 20 2a 6f 70 3b 0a 0a 20 20 20 20 69 ┆ister union overhead *op; i┆ 0x04f200…09e600 66 20 28 63 70 20 3d 3d 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 0a 09 72 65 74 75 72 6e 3b 0a ┆f (cp == (char *)NULL) return; ┆ 0x04f200…09e600 20 20 20 20 6f 70 20 3d 20 28 75 6e 69 6f 6e 20 6f 76 65 72 68 65 61 64 20 2a 29 28 28 63 61 64 ┆ op = (union overhead *)((cad┆ 0x04f200…09e600 64 72 5f 74 29 63 70 20 2d 20 73 69 7a 65 6f 66 20 28 75 6e 69 6f 6e 20 6f 76 65 72 68 65 61 64 ┆dr_t)cp - sizeof (union overhead┆ 0x04f200…09e600 29 29 3b 0a 23 69 66 64 65 66 20 64 65 62 75 67 0a 20 20 20 20 41 53 53 45 52 54 28 6f 70 2d 3e ┆)); #ifdef debug ASSERT(op->┆ 0x04f200…09e600 6f 76 5f 6d 61 67 69 63 20 3d 3d 20 4d 41 47 49 43 29 3b 09 09 2f 2a 20 6d 61 6b 65 20 73 75 72 ┆ov_magic == MAGIC); /* make sur┆ 0x04f200…09e600 65 20 69 74 20 77 61 73 20 69 6e 20 75 73 65 20 2a 2f 0a 23 65 6c 73 65 0a 20 20 20 20 69 66 20 ┆e it was in use */ #else if ┆ 0x04f200…09e600 28 6f 70 2d 3e 6f 76 5f 6d 61 67 69 63 20 21 3d 20 4d 41 47 49 43 29 0a 20 20 20 20 7b 0a 09 28 ┆(op->ov_magic != MAGIC) { (┆ 0x04f200…09e600 76 6f 69 64 29 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 25 73 20 66 72 65 65 28 29 20 ┆void) fprintf(stderr,"%s free() ┆ 0x04f200…09e600 69 67 6e 6f 72 65 64 5c 6e 22 2c 0a 09 09 6f 70 2d 3e 6f 76 5f 6d 61 67 69 63 20 3d 3d 20 4f 4c ┆ignored\n", op->ov_magic == OL┆ 0x04f200…09e600 44 4d 41 47 49 43 20 3f 20 22 44 75 70 6c 69 63 61 74 65 22 20 3a 20 22 42 61 64 22 29 3b 0a 09 ┆DMAGIC ? "Duplicate" : "Bad"); ┆ 0x04f200…09e600 72 65 74 75 72 6e 3b 09 09 09 09 2f 2a 20 73 61 6e 69 74 79 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 ┆return; /* sanity */ } ┆ 0x04f200…09e600 20 20 6f 70 2d 3e 6f 76 5f 6d 61 67 69 63 20 3d 20 4f 4c 44 4d 41 47 49 43 3b 0a 23 65 6e 64 69 ┆ op->ov_magic = OLDMAGIC; #endi┆ 0x04f200…09e600 66 0a 23 69 66 64 65 66 20 52 43 48 45 43 4b 0a 20 20 20 20 41 53 53 45 52 54 28 6f 70 2d 3e 6f ┆f #ifdef RCHECK ASSERT(op->o┆ 0x04f200…09e600 76 5f 72 6d 61 67 69 63 20 3d 3d 20 52 4d 41 47 49 43 29 3b 0a 20 20 20 20 69 66 20 28 6f 70 2d ┆v_rmagic == RMAGIC); if (op-┆ 0x04f200…09e600 3e 6f 76 5f 69 6e 64 65 78 20 3c 3d 20 31 33 29 0a 09 41 53 53 45 52 54 28 2a 28 75 6e 73 69 67 ┆>ov_index <= 13) ASSERT(*(unsig┆ 0x04f200…09e600 6e 65 64 20 69 6e 74 20 2a 29 28 28 63 61 64 64 72 5f 74 29 6f 70 20 2b 20 6f 70 2d 3e 6f 76 5f ┆ned int *)((caddr_t)op + op->ov_┆ 0x04f200…09e600 73 69 7a 65 20 2b 20 31 20 2d 20 52 53 4c 4f 50 29 20 3d 3d 20 52 4d 41 47 49 43 29 3b 0a 23 65 ┆size + 1 - RSLOP) == RMAGIC); #e┆ 0x04f200…09e600 6e 64 69 66 0a 20 20 20 20 41 53 53 45 52 54 28 6f 70 2d 3e 6f 76 5f 69 6e 64 65 78 20 3c 20 4e ┆ndif ASSERT(op->ov_index < N┆ 0x04f200…09e600 42 55 43 4b 45 54 53 29 3b 0a 20 20 20 20 73 69 7a 65 20 3d 20 6f 70 2d 3e 6f 76 5f 69 6e 64 65 ┆BUCKETS); size = op->ov_inde┆ 0x04f200…09e600 78 3b 0a 20 20 20 20 6f 70 2d 3e 6f 76 5f 6e 65 78 74 20 3d 20 6e 65 78 74 66 5b 73 69 7a 65 5d ┆x; op->ov_next = nextf[size]┆ 0x04f200…09e600 3b 0a 20 20 20 20 6e 65 78 74 66 5b 73 69 7a 65 5d 20 3d 20 6f 70 3b 0a 23 69 66 64 65 66 20 4d ┆; nextf[size] = op; #ifdef M┆ 0x04f200…09e600 53 54 41 54 53 0a 20 20 20 20 6e 6d 61 6c 6c 6f 63 5b 73 69 7a 65 5d 2d 2d 3b 0a 23 65 6e 64 69 ┆STATS nmalloc[size]--; #endi┆ 0x04f200…09e600 66 0a 7d 0a 0a 2f 2a 0a 20 2a 20 57 68 65 6e 20 61 20 70 72 6f 67 72 61 6d 20 61 74 74 65 6d 70 ┆f } /* * When a program attemp┆ 0x04f200…09e600 74 73 20 22 73 74 6f 72 61 67 65 20 63 6f 6d 70 61 63 74 69 6f 6e 22 20 61 73 20 6d 65 6e 74 69 ┆ts "storage compaction" as menti┆ 0x04f200…09e600 6f 6e 65 64 20 69 6e 20 74 68 65 0a 20 2a 20 6f 6c 64 20 6d 61 6c 6c 6f 63 20 6d 61 6e 20 70 61 ┆oned in the * old malloc man pa┆ 0x04f200…09e600 67 65 2c 20 69 74 20 72 65 61 6c 6c 6f 63 27 73 20 61 6e 20 61 6c 72 65 61 64 79 20 66 72 65 65 ┆ge, it realloc's an already free┆ 0x04f200…09e600 64 20 62 6c 6f 63 6b 2e 20 20 55 73 75 61 6c 6c 79 0a 20 2a 20 74 68 69 73 20 69 73 20 74 68 65 ┆d block. Usually * this is the┆ 0x04f200…09e600 20 6c 61 73 74 20 62 6c 6f 63 6b 20 69 74 20 66 72 65 65 64 3b 20 6f 63 63 61 73 69 6f 6e 61 6c ┆ last block it freed; occasional┆ 0x04f200…09e600 6c 79 20 69 74 20 6d 69 67 68 74 20 62 65 20 66 61 72 74 68 65 72 0a 20 2a 20 62 61 63 6b 2e 20 ┆ly it might be farther * back. ┆ 0x04f200…09e600 20 57 65 20 68 61 76 65 20 74 6f 20 73 65 61 72 63 68 20 61 6c 6c 20 74 68 65 20 66 72 65 65 20 ┆ We have to search all the free ┆ 0x04f200…09e600 6c 69 73 74 73 20 66 6f 72 20 74 68 65 20 62 6c 6f 63 6b 20 69 6e 20 6f 72 64 65 72 0a 20 2a 20 ┆lists for the block in order * ┆ 0x04f200…09e600 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 74 73 20 62 75 63 6b 65 74 3a 20 31 73 74 20 77 65 20 ┆to determine its bucket: 1st we ┆ 0x04f200…09e600 6d 61 6b 65 20 6f 6e 65 20 70 61 73 73 20 74 68 72 75 20 74 68 65 20 6c 69 73 74 73 0a 20 2a 20 ┆make one pass thru the lists * ┆ 0x04f200…09e600 63 68 65 63 6b 69 6e 67 20 6f 6e 6c 79 20 74 68 65 20 66 69 72 73 74 20 62 6c 6f 63 6b 20 69 6e ┆checking only the first block in┆ 0x04f200…09e600 20 65 61 63 68 3b 20 69 66 20 74 68 61 74 20 66 61 69 6c 73 20 77 65 20 73 65 61 72 63 68 0a 20 ┆ each; if that fails we search ┆ 0x04f200…09e600 2a 20 60 60 72 65 61 6c 6c 5f 73 72 63 68 6c 65 6e 27 27 20 62 6c 6f 63 6b 73 20 69 6e 20 65 61 ┆* ``reall_srchlen'' blocks in ea┆ 0x04f200…09e600 63 68 20 6c 69 73 74 20 66 6f 72 20 61 20 6d 61 74 63 68 20 28 74 68 65 20 76 61 72 69 61 62 6c ┆ch list for a match (the variabl┆ 0x04f200…09e600 65 0a 20 2a 20 69 73 20 65 78 74 65 72 6e 20 73 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 63 61 6e ┆e * is extern so the caller can┆ 0x04f200…09e600 20 6d 6f 64 69 66 79 20 69 74 29 2e 20 20 49 66 20 74 68 61 74 20 66 61 69 6c 73 20 77 65 20 6a ┆ modify it). If that fails we j┆ 0x04f200…09e600 75 73 74 20 63 6f 70 79 0a 20 2a 20 68 6f 77 65 76 65 72 20 6d 61 6e 79 20 62 79 74 65 73 20 77 ┆ust copy * however many bytes w┆ 0x04f200…09e600 61 73 20 67 69 76 65 6e 20 74 6f 20 72 65 61 6c 6c 6f 63 28 29 20 61 6e 64 20 68 6f 70 65 20 69 ┆as given to realloc() and hope i┆ 0x04f200…09e600 74 27 73 20 6e 6f 74 20 68 75 67 65 2e 0a 20 2a 2f 0a 69 6e 74 20 72 65 61 6c 6c 5f 73 72 63 68 ┆t's not huge. */ int reall_srch┆ 0x04f200…09e600 6c 65 6e 20 3d 20 34 3b 09 2f 2a 20 34 20 73 68 6f 75 6c 64 20 62 65 20 70 6c 65 6e 74 79 2c 20 ┆len = 4; /* 4 should be plenty, ┆ 0x04f200…09e600 2d 31 20 3d 3e 27 73 20 77 68 6f 6c 65 20 6c 69 73 74 20 2a 2f 0a 0a 70 75 62 6c 69 63 20 63 68 ┆-1 =>'s whole list */ public ch┆ 0x04f200…09e600 61 72 20 2a 72 65 61 6c 6c 6f 63 28 63 70 2c 20 6e 62 79 74 65 73 29 0a 63 68 61 72 20 2a 63 70 ┆ar *realloc(cp, nbytes) char *cp┆ 0x04f200…09e600 3b 20 0a 75 6e 73 69 67 6e 65 64 20 6e 62 79 74 65 73 3b 0a 7b 20 20 20 0a 20 20 20 20 72 65 67 ┆; unsigned nbytes; { reg┆ 0x04f200…09e600 69 73 74 65 72 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 6f 6e 62 3b 0a 20 20 20 20 75 6e 69 6f ┆ister unsigned int onb; unio┆ 0x04f200…09e600 6e 20 6f 76 65 72 68 65 61 64 20 2a 6f 70 3b 0a 20 20 20 20 63 68 61 72 20 2a 72 65 73 3b 0a 20 ┆n overhead *op; char *res; ┆ 0x04f200…09e600 20 20 20 72 65 67 69 73 74 65 72 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 77 61 73 5f 61 ┆ register int i; int was_a┆ 0x04f200…09e600 6c 6c 6f 63 65 64 20 3d 20 30 3b 0a 20 20 20 20 73 74 61 74 69 63 20 69 6e 74 20 66 69 6e 64 62 ┆lloced = 0; static int findb┆ 0x04f200…09e600 75 63 6b 65 74 28 29 3b 0a 20 20 20 20 0a 20 20 20 20 69 66 20 28 63 70 20 3d 3d 20 28 63 68 61 ┆ucket(); if (cp == (cha┆ 0x04f200…09e600 72 20 2a 29 4e 55 4c 4c 29 0a 09 72 65 74 75 72 6e 20 28 6d 61 6c 6c 6f 63 28 6e 62 79 74 65 73 ┆r *)NULL) return (malloc(nbytes┆ 0x04f200…09e600 29 29 3b 0a 20 20 20 20 6f 70 20 3d 20 28 75 6e 69 6f 6e 20 6f 76 65 72 68 65 61 64 20 2a 29 28 ┆)); op = (union overhead *)(┆ 0x04f200…09e600 28 63 61 64 64 72 5f 74 29 63 70 20 2d 20 73 69 7a 65 6f 66 20 28 75 6e 69 6f 6e 20 6f 76 65 72 ┆(caddr_t)cp - sizeof (union over┆ 0x04f200…09e600 68 65 61 64 29 29 3b 0a 20 20 20 20 69 66 20 28 6f 70 2d 3e 6f 76 5f 6d 61 67 69 63 20 3d 3d 20 ┆head)); if (op->ov_magic == ┆ 0x04f200…09e600 4d 41 47 49 43 29 0a 20 20 20 20 7b 0a 09 77 61 73 5f 61 6c 6c 6f 63 65 64 2b 2b 3b 0a 09 69 20 ┆MAGIC) { was_alloced++; i ┆ 0x04f200…09e600 3d 20 6f 70 2d 3e 6f 76 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 0a 20 ┆= op->ov_index; } else ┆ 0x04f200…09e600 20 20 20 7b 0a 09 2f 2a 0a 09 20 2a 20 41 6c 72 65 61 64 79 20 66 72 65 65 2c 20 64 6f 69 6e 67 ┆ { /* * Already free, doing┆ 0x04f200…09e600 20 22 63 6f 6d 70 61 63 74 69 6f 6e 22 2e 0a 09 20 2a 0a 09 20 2a 20 53 65 61 72 63 68 20 66 6f ┆ "compaction". * * Search fo┆ 0x04f200…09e600 72 20 74 68 65 20 6f 6c 64 20 62 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f 72 79 20 6f 6e 20 74 68 65 ┆r the old block of memory on the┆ 0x04f200…09e600 0a 09 20 2a 20 66 72 65 65 20 6c 69 73 74 2e 20 20 46 69 72 73 74 2c 20 63 68 65 63 6b 20 74 68 ┆ * free list. First, check th┆ 0x04f200…09e600 65 20 6d 6f 73 74 20 63 6f 6d 6d 6f 6e 0a 09 20 2a 20 63 61 73 65 20 28 6c 61 73 74 20 65 6c 65 ┆e most common * case (last ele┆ 0x04f200…09e600 6d 65 6e 74 20 66 72 65 65 27 64 29 2c 20 74 68 65 6e 20 28 74 68 69 73 20 66 61 69 6c 69 6e 67 ┆ment free'd), then (this failing┆ 0x04f200…09e600 29 0a 09 20 2a 20 74 68 65 20 6c 61 73 74 20 60 60 72 65 61 6c 6c 5f 73 72 63 68 6c 65 6e 27 27 ┆) * the last ``reall_srchlen''┆ 0x04f200…09e600 20 69 74 65 6d 73 20 66 72 65 65 27 64 2e 0a 09 20 2a 20 49 66 20 61 6c 6c 20 6c 6f 6f 6b 75 70 ┆ items free'd. * If all lookup┆ 0x04f200…09e600 73 20 66 61 69 6c 2c 20 74 68 65 6e 20 61 73 73 75 6d 65 20 74 68 65 20 73 69 7a 65 20 6f 66 0a ┆s fail, then assume the size of ┆ 0x04f200…09e600 09 20 2a 20 74 68 65 20 6d 65 6d 6f 72 79 20 62 6c 6f 63 6b 20 62 65 69 6e 67 20 72 65 61 6c 6c ┆ * the memory block being reall┆ 0x04f200…09e600 6f 63 27 64 20 69 73 20 74 68 65 0a 09 20 2a 20 73 6d 61 6c 6c 65 73 74 20 70 6f 73 73 69 62 6c ┆oc'd is the * smallest possibl┆ 0x04f200…09e600 65 2e 0a 09 20 2a 2f 0a 09 69 66 20 28 28 69 20 3d 20 66 69 6e 64 62 75 63 6b 65 74 28 6f 70 2c ┆e. */ if ((i = findbucket(op,┆ 0x04f200…09e600 20 31 29 29 20 3c 20 30 20 26 26 0a 09 20 20 20 20 28 69 20 3d 20 66 69 6e 64 62 75 63 6b 65 74 ┆ 1)) < 0 && (i = findbucket┆ 0x04f200…09e600 28 6f 70 2c 20 72 65 61 6c 6c 5f 73 72 63 68 6c 65 6e 29 29 20 3c 20 30 29 0a 09 20 20 20 20 69 ┆(op, reall_srchlen)) < 0) i┆ 0x04f200…09e600 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f 6e 62 20 3d 20 28 31 20 3c 3c 20 28 69 20 2b ┆ = 0; } onb = (1 << (i +┆ 0x04f200…09e600 20 33 29 29 20 2d 20 73 69 7a 65 6f 66 20 28 2a 6f 70 29 20 2d 20 52 53 4c 4f 50 3b 0a 20 20 20 ┆ 3)) - sizeof (*op) - RSLOP; ┆ 0x04f200…09e600 20 2f 2a 20 61 76 6f 69 64 20 74 68 65 20 63 6f 70 79 20 69 66 20 73 61 6d 65 20 73 69 7a 65 20 ┆ /* avoid the copy if same size ┆ 0x04f200…09e600 62 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 69 66 20 28 77 61 73 5f 61 6c 6c 6f 63 65 64 20 26 26 0a ┆block */ if (was_alloced && ┆ 0x04f200…09e600 09 6e 62 79 74 65 73 20 3c 3d 20 6f 6e 62 20 26 26 20 6e 62 79 74 65 73 20 3e 20 28 6f 6e 62 20 ┆ nbytes <= onb && nbytes > (onb ┆ 0x04f200…09e600 3e 3e 20 31 29 20 2d 20 73 69 7a 65 6f 66 28 2a 6f 70 29 20 2d 20 52 53 4c 4f 50 29 0a 09 72 65 ┆>> 1) - sizeof(*op) - RSLOP) re┆ 0x04f200…09e600 74 75 72 6e 28 63 70 29 3b 0a 20 20 20 20 69 66 20 28 28 72 65 73 20 3d 20 6d 61 6c 6c 6f 63 28 ┆turn(cp); if ((res = malloc(┆ 0x04f200…09e600 6e 62 79 74 65 73 29 29 20 3d 3d 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 0a 09 72 65 74 75 72 ┆nbytes)) == (char *)NULL) retur┆ 0x04f200…09e600 6e 20 28 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 70 20 21 3d 20 ┆n ((char *)NULL); if (cp != ┆ 0x04f200…09e600 72 65 73 29 09 09 09 2f 2a 20 63 6f 6d 6d 6f 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 2a 2f ┆res) /* common optimization */┆ 0x04f200…09e600 0a 09 6d 65 6d 63 70 79 28 72 65 73 2c 20 63 70 2c 20 28 6e 62 79 74 65 73 20 3c 20 6f 6e 62 29 ┆ memcpy(res, cp, (nbytes < onb)┆ 0x04f200…09e600 20 3f 20 6e 62 79 74 65 73 20 3a 20 6f 6e 62 29 3b 0a 20 20 20 20 69 66 20 28 77 61 73 5f 61 6c ┆ ? nbytes : onb); if (was_al┆ 0x04f200…09e600 6c 6f 63 65 64 29 0a 09 66 72 65 65 28 63 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 72 65 ┆loced) free(cp); return (re┆ 0x04f200…09e600 73 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 65 61 72 63 68 20 60 60 73 72 63 68 6c 65 6e 27 27 20 ┆s); } /* * Search ``srchlen'' ┆ 0x04f200…09e600 65 6c 65 6d 65 6e 74 73 20 6f 66 20 65 61 63 68 20 66 72 65 65 20 6c 69 73 74 20 66 6f 72 20 61 ┆elements of each free list for a┆ 0x04f200…09e600 20 62 6c 6f 63 6b 20 77 68 6f 73 65 0a 20 2a 20 68 65 61 64 65 72 20 73 74 61 72 74 73 20 61 74 ┆ block whose * header starts at┆ 0x04f200…09e600 20 60 60 66 72 65 65 70 27 27 2e 20 20 49 66 20 73 72 63 68 6c 65 6e 20 69 73 20 2d 31 20 73 65 ┆ ``freep''. If srchlen is -1 se┆ 0x04f200…09e600 61 72 63 68 20 74 68 65 20 77 68 6f 6c 65 20 6c 69 73 74 2e 0a 20 2a 20 52 65 74 75 72 6e 20 62 ┆arch the whole list. * Return b┆ 0x04f200…09e600 75 63 6b 65 74 20 6e 75 6d 62 65 72 2c 20 6f 72 20 2d 31 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 ┆ucket number, or -1 if not found┆ 0x04f200…09e600 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6e 64 62 75 63 6b 65 74 28 66 72 65 65 ┆. */ static int findbucket(free┆ 0x04f200…09e600 70 2c 20 73 72 63 68 6c 65 6e 29 0a 75 6e 69 6f 6e 20 6f 76 65 72 68 65 61 64 20 2a 66 72 65 65 ┆p, srchlen) union overhead *free┆ 0x04f200…09e600 70 3b 0a 69 6e 74 20 73 72 63 68 6c 65 6e 3b 0a 7b 0a 20 20 20 20 72 65 67 69 73 74 65 72 20 75 ┆p; int srchlen; { register u┆ 0x04f200…09e600 6e 69 6f 6e 20 6f 76 65 72 68 65 61 64 20 2a 70 3b 0a 20 20 20 20 72 65 67 69 73 74 65 72 20 69 ┆nion overhead *p; register i┆ 0x04f200…09e600 6e 74 20 69 2c 20 6a 3b 0a 0a 20 20 20 20 66 6f 72 20 28 69 20 3d 20 30 3b 20 69 20 3c 20 4e 42 ┆nt i, j; for (i = 0; i < NB┆ 0x04f200…09e600 55 43 4b 45 54 53 3b 20 69 2b 2b 29 0a 20 20 20 20 7b 0a 09 6a 20 3d 20 30 3b 0a 09 66 6f 72 20 ┆UCKETS; i++) { j = 0; for ┆ 0x04f200…09e600 28 70 20 3d 20 6e 65 78 74 66 5b 69 5d 3b 20 70 20 26 26 20 6a 20 21 3d 20 73 72 63 68 6c 65 6e ┆(p = nextf[i]; p && j != srchlen┆ 0x04f200…09e600 3b 20 70 20 3d 20 70 2d 3e 6f 76 5f 6e 65 78 74 29 20 7b 0a 09 20 20 20 20 69 66 20 28 70 20 3d ┆; p = p->ov_next) { if (p =┆ 0x04f200…09e600 3d 20 66 72 65 65 70 29 0a 09 09 72 65 74 75 72 6e 20 28 69 29 3b 0a 09 20 20 20 20 6a 2b 2b 3b ┆= freep) return (i); j++;┆ 0x04f200…09e600 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 28 2d 31 29 3b 0a 7d 0a 0a 23 69 ┆ } } return (-1); } #i┆ 0x04f200…09e600 66 64 65 66 20 4d 53 54 41 54 53 0a 2f 2a 0a 20 2a 20 6d 73 74 61 74 73 20 2d 20 70 72 69 6e 74 ┆fdef MSTATS /* * mstats - print┆ 0x04f200…09e600 20 6f 75 74 20 73 74 61 74 69 73 74 69 63 73 20 61 62 6f 75 74 20 6d 61 6c 6c 6f 63 0a 20 2a 20 ┆ out statistics about malloc * ┆ 0x04f200…09e600 0a 20 2a 20 50 72 69 6e 74 73 20 74 77 6f 20 6c 69 6e 65 73 20 6f 66 20 6e 75 6d 62 65 72 73 2c ┆ * Prints two lines of numbers,┆ 0x04f200…09e600 20 6f 6e 65 20 73 68 6f 77 69 6e 67 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 66 ┆ one showing the length of the f┆ 0x04f200…09e600 72 65 65 20 6c 69 73 74 0a 20 2a 20 66 6f 72 20 65 61 63 68 20 73 69 7a 65 20 63 61 74 65 67 6f ┆ree list * for each size catego┆ 0x04f200…09e600 72 79 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 73 68 6f 77 69 6e 67 20 74 68 65 20 6e 75 6d 62 65 ┆ry, the second showing the numbe┆ 0x04f200…09e600 72 20 6f 66 20 6d 61 6c 6c 6f 63 73 20 2d 0a 20 2a 20 66 72 65 65 73 20 66 6f 72 20 65 61 63 68 ┆r of mallocs - * frees for each┆ 0x04f200…09e600 20 73 69 7a 65 20 63 61 74 65 67 6f 72 79 2e 0a 20 2a 2f 0a 70 75 62 6c 69 63 20 6d 73 74 61 74 ┆ size category. */ public mstat┆ 0x04f200…09e600 73 28 73 29 0a 63 68 61 72 20 2a 73 3b 0a 7b 0a 20 20 20 20 72 65 67 69 73 74 65 72 20 69 6e 74 ┆s(s) char *s; { register int┆ 0x04f200…09e600 20 69 2c 20 6a 3b 0a 20 20 20 20 72 65 67 69 73 74 65 72 20 75 6e 69 6f 6e 20 6f 76 65 72 68 65 ┆ i, j; register union overhe┆ 0x04f200…09e600 61 64 20 2a 70 3b 0a 20 20 20 20 69 6e 74 20 74 6f 74 66 72 65 65 20 3d 20 30 2c 0a 20 20 20 20 ┆ad *p; int totfree = 0, ┆ 0x04f200…09e600 74 6f 74 75 73 65 64 20 3d 20 30 3b 0a 0a 20 20 20 20 28 76 6f 69 64 29 20 66 70 72 69 6e 74 66 ┆totused = 0; (void) fprintf┆ 0x04f200…09e600 28 73 74 64 65 72 72 2c 20 22 4d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 73 74 61 74 ┆(stderr, "Memory allocation stat┆ 0x04f200…09e600 69 73 74 69 63 73 20 25 73 5c 6e 66 72 65 65 3a 5c 74 22 2c 20 73 29 3b 0a 20 20 20 20 66 6f 72 ┆istics %s\nfree:\t", s); for┆ 0x04f200…09e600 20 28 69 20 3d 20 30 3b 20 69 20 3c 20 4e 42 55 43 4b 45 54 53 3b 20 69 2b 2b 29 20 7b 0a 09 66 ┆ (i = 0; i < NBUCKETS; i++) { f┆ 0x04f200…09e600 6f 72 20 28 6a 20 3d 20 30 2c 20 70 20 3d 20 6e 65 78 74 66 5b 69 5d 3b 20 70 3b 20 70 20 3d 20 ┆or (j = 0, p = nextf[i]; p; p = ┆ 0x04f200…09e600 70 2d 3e 6f 76 5f 6e 65 78 74 2c 20 6a 2b 2b 29 0a 09 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a ┆p->ov_next, j++) continue; ┆ 0x04f200…09e600 09 28 76 6f 69 64 29 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 20 25 64 22 2c 20 6a ┆ (void) fprintf(stderr, " %d", j┆ 0x04f200…09e600 29 3b 0a 09 74 6f 74 66 72 65 65 20 2b 3d 20 6a 20 2a 20 28 31 20 3c 3c 20 28 69 20 2b 20 33 29 ┆); totfree += j * (1 << (i + 3)┆ 0x04f200…09e600 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 28 76 6f 69 64 29 20 66 70 72 69 6e 74 66 28 73 74 64 65 ┆); } (void) fprintf(stde┆ 0x04f200…09e600 72 72 2c 20 22 5c 6e 75 73 65 64 3a 5c 74 22 29 3b 0a 20 20 20 20 66 6f 72 20 28 69 20 3d 20 30 ┆rr, "\nused:\t"); for (i = 0┆ 0x04f200…09e600 3b 20 69 20 3c 20 4e 42 55 43 4b 45 54 53 3b 20 69 2b 2b 29 0a 20 20 20 20 7b 0a 09 28 76 6f 69 ┆; i < NBUCKETS; i++) { (voi┆ 0x04f200…09e600 64 29 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 20 25 64 22 2c 20 6e 6d 61 6c 6c 6f ┆d) fprintf(stderr, " %d", nmallo┆ 0x04f200…09e600 63 5b 69 5d 29 3b 0a 09 74 6f 74 75 73 65 64 20 2b 3d 20 6e 6d 61 6c 6c 6f 63 5b 69 5d 20 2a 20 ┆c[i]); totused += nmalloc[i] * ┆ 0x04f200…09e600 28 31 20 3c 3c 20 28 69 20 2b 20 33 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 28 76 6f 69 64 29 ┆(1 << (i + 3)); } (void)┆ 0x04f200…09e600 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 5c 6e 5c 74 54 6f 74 61 6c 20 69 6e 20 75 ┆ fprintf(stderr, "\n\tTotal in u┆ 0x04f200…09e600 73 65 3a 20 25 64 2c 20 74 6f 74 61 6c 20 66 72 65 65 3a 20 25 64 5c 6e 22 2c 0a 09 20 20 20 20 ┆se: %d, total free: %d\n", ┆ 0x04f200…09e600 74 6f 74 75 73 65 64 2c 20 74 6f 74 66 72 65 65 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4d ┆totused, totfree); } #endif /* M┆ 0x04f200…09e600 53 54 41 54 53 20 2a 2f 0a 0a 2f 2a 0a 20 2a 09 57 65 20 63 61 6c 6c 20 72 65 61 6c 6c 6f 63 28 ┆STATS */ /* * We call realloc(┆ 0x04f200…09e600 29 20 77 69 74 68 20 63 61 6c 6c 6f 63 28 29 27 65 64 20 73 70 61 63 65 2c 20 73 6f 20 77 65 20 ┆) with calloc()'ed space, so we ┆ 0x04f200…09e600 68 61 64 20 62 65 74 74 65 72 0a 20 2a 09 73 75 70 70 6c 79 20 61 20 63 61 6c 6c 6f 63 28 29 20 ┆had better * supply a calloc() ┆ 0x04f200…09e600 74 68 61 74 20 77 65 20 75 6e 64 65 72 73 74 61 6e 64 2e 0a 20 2a 2f 0a 70 75 62 6c 69 63 20 63 ┆that we understand. */ public c┆ 0x04f200…09e600 68 61 72 20 2a 63 61 6c 6c 6f 63 28 6e 69 74 65 6d 73 2c 20 73 69 7a 65 29 0a 72 65 67 69 73 74 ┆har *calloc(nitems, size) regist┆ 0x04f200…09e600 65 72 20 75 6e 73 69 67 6e 65 64 20 6e 69 74 65 6d 73 2c 20 73 69 7a 65 3b 0a 7b 0a 20 20 20 20 ┆er unsigned nitems, size; { ┆ 0x04f200…09e600 63 68 61 72 20 2a 73 3b 0a 0a 20 20 20 20 73 69 7a 65 20 2a 3d 20 6e 69 74 65 6d 73 3b 0a 0a 20 ┆char *s; size *= nitems; ┆ 0x04f200…09e600 20 20 20 69 66 20 28 73 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 29 29 0a 09 28 76 6f 69 64 29 ┆ if (s = malloc(size)) (void)┆ 0x04f200…09e600 20 62 7a 65 72 6f 28 73 2c 20 73 69 7a 65 29 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 28 73 29 ┆ bzero(s, size); return (s)┆ 0x04f200…09e600 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 09 43 61 6c 6c 6f 63 28 29 27 65 64 20 73 70 61 63 65 20 69 73 20 ┆; } /* * Calloc()'ed space is ┆ 0x04f200…09e600 66 72 65 71 75 65 6e 74 6c 79 20 66 72 65 65 64 20 77 69 74 68 20 63 66 72 65 65 28 29 2e 0a 20 ┆frequently freed with cfree(). ┆ 0x04f200…09e600 2a 2f 0a 70 75 62 6c 69 63 20 76 6f 69 64 20 63 66 72 65 65 28 73 70 61 63 65 29 0a 72 65 67 69 ┆*/ public void cfree(space) regi┆ 0x04f200…09e600 73 74 65 72 20 63 68 61 72 20 2a 73 70 61 63 65 3b 0a 7b 0a 20 20 20 20 66 72 65 65 28 73 70 61 ┆ster char *space; { free(spa┆ 0x04f200…09e600 63 65 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 6c 69 6e 74 20 2a 2f 0a 0a 2f 2a 20 6d 61 ┆ce); } #endif /* !lint */ /* ma┆ 0x04f200…09e600 6c 6c 6f 63 2e 63 20 65 6e 64 73 20 68 65 72 65 20 2a 2f 0a 25 64 5c 6e 22 2c 0a 09 20 20 20 20 ┆lloc.c ends here */ %d\n", ┆ 0x04f200…09e600 74 6f 74 75 73 65 64 2c 20 74 6f 74 66 72 65 65 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4d ┆totused, totfree); } #endif /* M┆ 0x04f200…09e600 53 54 41 54 53 20 2a 2f 0a 0a 2f 2a 0a 20 2a 09 57 65 20 63 61 6c 6c 20 72 65 61 6c 6c 6f 63 28 ┆STATS */ /* * We call realloc(┆ 0x04f200…09e600 29 20 77 69 74 68 20 63 61 6c 6c 6f 63 28 29 27 65 73 72 63 2f 44 2e 70 6f 72 74 2f 6c 63 61 73 ┆) with calloc()'esrc/D.port/lcas┆ 0x04f200…09e600 65 2e 63 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆e.c ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆ ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 20 20 20 34 34 34 20 00 20 20 20 ┆ 444 ┆ 0x04f200…09e600 31 34 35 20 00 20 20 20 20 20 31 20 00 20 20 20 20 20 20 20 20 33 34 30 20 20 34 34 35 36 31 35 ┆145 1 340 445615┆ 0x04f200…09e600 34 30 35 30 20 20 20 37 32 32 36 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆4050 7226 ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆ ┆ […0x9…] 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 2f 2a 20 6c 63 61 73 65 2e 63 20 2d 2d 20 63 ┆ /* lcase.c -- c┆ 0x04f200…09e600 6f 6e 76 65 72 74 20 61 20 73 74 72 69 6e 67 20 74 6f 20 6c 6f 77 65 72 63 61 73 65 20 2a 2f 0a ┆onvert a string to lowercase */ ┆ 0x04f200…09e600 2f 2a 20 4c 49 4e 54 4c 49 42 52 41 52 59 20 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 6c 69 62 70 ┆/* LINTLIBRARY */ #include "libp┆ 0x04f200…09e600 6f 72 74 2e 68 22 0a 0a 76 6f 69 64 20 6c 63 61 73 65 28 73 29 0a 72 65 67 69 73 74 65 72 20 63 ┆ort.h" void lcase(s) register c┆ 0x04f200…09e600 68 61 72 20 2a 73 3b 0a 7b 0a 20 20 20 20 66 6f 72 20 28 3b 20 2a 73 3b 20 73 2b 2b 29 0a 09 69 ┆har *s; { for (; *s; s++) i┆ 0x04f200…09e600 66 20 28 69 73 61 73 63 69 69 28 2a 73 29 20 26 26 20 69 73 75 70 70 65 72 28 2a 73 29 29 0a 09 ┆f (isascii(*s) && isupper(*s)) ┆ 0x04f200…09e600 20 20 20 20 2a 73 20 3d 20 74 6f 6c 6f 77 65 72 28 2a 73 29 3b 0a 7d 0a 0a 2f 2a 20 6c 63 61 73 ┆ *s = tolower(*s); } /* lcas┆ 0x04f200…09e600 65 2e 63 20 65 6e 64 73 20 68 65 72 65 20 2a 2f 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 28 73 29 ┆e.c ends here */ return (s)┆ 0x04f200…09e600 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 09 43 61 6c 6c 6f 63 28 29 27 65 64 20 73 70 61 63 65 20 69 73 20 ┆; } /* * Calloc()'ed space is ┆ 0x04f200…09e600 66 72 65 71 75 65 6e 74 6c 79 20 66 72 65 65 64 20 77 69 74 68 20 63 66 72 65 65 28 29 2e 0a 20 ┆frequently freed with cfree(). ┆ 0x04f200…09e600 2a 2f 0a 70 75 62 6c 69 63 20 76 6f 69 64 20 63 66 72 65 65 28 73 70 61 63 65 29 0a 72 65 67 69 ┆*/ public void cfree(space) regi┆ 0x04f200…09e600 73 74 65 72 20 63 68 61 72 20 2a 73 70 61 63 65 3b 0a 7b 0a 20 20 20 20 66 72 65 65 28 73 70 61 ┆ster char *space; { free(spa┆ 0x04f200…09e600 63 65 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 6c 69 6e 74 20 2a 2f 0a 0a 2f 2a 20 6d 61 ┆ce); } #endif /* !lint */ /* ma┆ 0x04f200…09e600 6c 6c 6f 63 2e 63 20 65 6e 64 73 20 68 65 72 65 20 2a 2f 0a 25 64 5c 6e 22 2c 0a 09 20 20 20 20 ┆lloc.c ends here */ %d\n", ┆ 0x04f200…09e600 74 6f 74 75 73 65 64 2c 20 74 6f 74 66 72 65 65 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4d ┆totused, totfree); } #endif /* M┆ 0x04f200…09e600 53 54 41 54 53 20 2a 2f 0a 0a 2f 2a 0a 20 2a 09 57 65 20 63 61 6c 6c 20 72 65 61 6c 6c 6f 63 28 ┆STATS */ /* * We call realloc(┆ 0x04f200…09e600 29 20 77 69 74 68 20 63 61 6c 6c 6f 63 28 29 27 65 73 72 63 2f 44 2e 70 6f 72 74 2f 6c 69 62 70 ┆) with calloc()'esrc/D.port/libp┆ 0x04f200…09e600 6f 72 74 2e 68 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆ort.h ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆ ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 20 20 20 34 34 34 20 00 20 20 20 ┆ 444 ┆ 0x04f200…09e600 31 34 35 20 00 20 20 20 20 20 31 20 00 20 20 20 20 20 20 20 35 30 30 33 20 20 34 34 35 36 36 37 ┆145 1 5003 445667┆ 0x04f200…09e600 33 33 31 37 20 20 20 37 36 35 34 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆3317 7654 ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆ ┆ […0x9…] 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 2f 2a 20 6c 69 62 70 6f 72 74 2e 68 20 2d 2d ┆ /* libport.h --┆ 0x04f200…09e600 20 64 65 66 69 6e 69 74 69 6f 6e 73 20 66 6f 72 20 74 68 65 20 70 6f 72 74 61 62 69 6c 69 74 79 ┆ definitions for the portability┆ 0x04f200…09e600 20 6c 69 62 72 61 72 79 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 0a 23 69 6e 63 6c 75 64 65 20 ┆ library functions */ #include ┆ 0x04f200…09e600 22 73 79 73 74 65 6d 2e 68 22 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 53 54 44 43 5f 5f ┆"system.h" #if defined(__STDC__┆ 0x04f200…09e600 29 0a 0a 23 20 64 65 66 69 6e 65 20 50 28 73 29 09 09 73 0a 0a 23 65 6c 73 65 20 2f 2a 20 5f 5f ┆) # define P(s) s #else /* __┆ 0x04f200…09e600 53 54 44 43 5f 5f 20 2a 2f 0a 0a 23 64 65 66 69 6e 65 20 41 53 54 45 52 49 53 4b 09 2a 0a 23 69 ┆STDC__ */ #define ASTERISK * #i┆ 0x04f200…09e600 66 64 65 66 20 45 4e 43 4f 52 45 0a 23 20 64 65 66 69 6e 65 20 50 28 73 29 09 09 28 29 0a 23 65 ┆fdef ENCORE # define P(s) () #e┆ 0x04f200…09e600 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 50 28 73 29 09 09 28 2f 41 53 54 45 52 49 53 4b 20 73 20 ┆lse # define P(s) (/ASTERISK s ┆ 0x04f200…09e600 41 53 54 45 52 49 53 4b 2f 29 0a 23 65 6e 64 69 66 20 2f 2a 20 45 4e 43 4f 52 45 20 2a 2f 0a 23 ┆ASTERISK/) #endif /* ENCORE */ #┆ 0x04f200…09e600 75 6e 64 65 66 20 41 53 54 45 52 49 53 4b 0a 23 64 65 66 69 6e 65 20 63 6f 6e 73 74 0a 23 64 65 ┆undef ASTERISK #define const #de┆ 0x04f200…09e600 66 69 6e 65 20 73 69 67 6e 65 64 0a 23 64 65 66 69 6e 65 20 76 6f 6c 61 74 69 6c 65 0a 0a 23 65 ┆fine signed #define volatile #e┆ 0x04f200…09e600 6e 64 69 66 0a 0a 2f 2a 20 74 68 65 73 65 20 61 72 65 20 61 73 73 75 6d 65 64 20 62 79 20 74 68 ┆ndif /* these are assumed by th┆ 0x04f200…09e600 65 20 70 6f 72 74 6c 69 62 2e 61 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 23 64 65 66 69 6e 65 ┆e portlib.a functions */ #define┆ 0x04f200…09e600 09 53 55 43 43 45 45 44 09 30 09 2f 2a 20 66 75 6e 63 74 69 6f 6e 20 73 75 63 63 65 65 64 65 64 ┆ SUCCEED 0 /* function succeeded┆ 0x04f200…09e600 09 09 09 09 2a 2f 0a 23 64 65 66 69 6e 65 09 46 41 49 4c 09 2d 31 09 2f 2a 20 66 75 6e 63 74 69 ┆ */ #define FAIL -1 /* functi┆ 0x04f200…09e600 6f 6e 20 66 61 69 6c 65 64 09 09 09 09 2a 2f 0a 0a 2f 2a 0a 20 2a 20 57 65 20 75 73 65 20 74 68 ┆on failed */ /* * We use th┆ 0x04f200…09e600 69 73 20 74 6f 20 6c 61 62 65 6c 20 66 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 ┆is to label forward declarations┆ 0x04f200…09e600 20 6f 66 20 73 74 61 74 69 63 20 66 75 6e 63 74 69 6f 6e 73 20 28 6e 6f 6e 2d 73 74 61 74 69 63 ┆ of static functions (non-static┆ 0x04f200…09e600 73 0a 20 2a 20 61 72 65 2c 20 62 79 20 63 6f 6e 76 65 6e 74 69 6f 6e 2c 20 64 65 63 6c 61 72 65 ┆s * are, by convention, declare┆ 0x04f200…09e600 64 20 69 6e 20 74 68 65 20 6d 6f 64 75 6c 65 20 69 6e 74 65 72 66 61 63 65 20 66 69 6c 65 2c 20 ┆d in the module interface file, ┆ 0x04f200…09e600 77 68 69 63 68 20 74 68 65 20 6d 6f 64 75 6c 65 0a 20 2a 20 69 6e 76 61 72 69 61 62 6c 79 20 69 ┆which the module * invariably i┆ 0x04f200…09e600 6e 63 6c 75 64 65 73 29 2e 20 49 6e 20 61 6e 20 41 4e 53 49 20 43 20 65 6e 76 69 72 6f 6e 6d 65 ┆ncludes). In an ANSI C environme┆ 0x04f200…09e600 6e 74 20 74 68 69 73 20 6d 61 79 20 68 61 76 65 20 74 6f 20 62 65 63 6f 6d 65 0a 20 2a 20 27 73 ┆nt this may have to become * 's┆ 0x04f200…09e600 74 61 74 69 63 27 2c 20 62 75 74 20 73 6f 6d 65 20 70 72 65 73 65 6e 74 20 63 6f 6d 70 69 6c 65 ┆tatic', but some present compile┆ 0x04f200…09e600 72 73 20 77 6f 6e 27 74 20 61 63 63 65 70 74 20 74 68 69 73 2e 0a 20 2a 2f 0a 23 64 65 66 69 6e ┆rs won't accept this. */ #defin┆ 0x04f200…09e600 65 20 66 6f 72 77 61 72 64 09 09 2f 2a 20 74 68 69 73 20 73 70 61 63 65 20 69 6e 74 65 6e 74 69 ┆e forward /* this space intenti┆ 0x04f200…09e600 6f 6e 61 6c 6c 79 20 6c 65 66 74 20 62 6c 61 6e 6b 20 3a 2d 29 20 2a 2f 0a 0a 2f 2a 20 0a 20 2a ┆onally left blank :-) */ /* *┆ 0x04f200…09e600 20 44 65 66 69 6e 65 20 61 20 62 6f 6f 6c 20 74 79 70 65 20 66 6f 72 20 75 73 65 20 61 73 20 61 ┆ Define a bool type for use as a┆ 0x04f200…09e600 20 6c 6f 67 69 63 61 6c 20 76 61 6c 75 65 2e 20 54 68 65 20 23 69 66 6e 64 65 66 20 54 52 55 45 ┆ logical value. The #ifndef TRUE┆ 0x04f200…09e600 20 69 73 20 73 6f 20 77 65 0a 20 2a 20 63 61 6e 20 61 72 72 61 6e 67 65 20 6e 6f 74 20 74 6f 20 ┆ is so we * can arrange not to ┆ 0x04f200…09e600 63 6f 6c 6c 69 64 65 20 77 69 74 68 20 74 68 65 20 63 75 72 73 65 73 2e 68 20 64 65 66 69 6e 69 ┆collide with the curses.h defini┆ 0x04f200…09e600 74 69 6f 6e 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 54 52 55 45 0a 74 79 70 65 64 65 66 20 69 ┆tion. */ #ifndef TRUE typedef i┆ 0x04f200…09e600 6e 74 09 62 6f 6f 6c 3b 0a 23 64 65 66 69 6e 65 09 54 52 55 45 09 31 09 2f 2a 20 62 6f 6f 6c 65 ┆nt bool; #define TRUE 1 /* boole┆ 0x04f200…09e600 61 6e 20 74 72 75 65 09 09 09 09 09 2a 2f 0a 23 64 65 66 69 6e 65 09 46 41 4c 53 45 09 30 09 2f ┆an true */ #define FALSE 0 /┆ 0x04f200…09e600 2a 20 62 6f 6f 6c 65 61 6e 20 66 61 6c 73 65 09 09 09 09 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 ┆* boolean false */ #endif /* ┆ 0x04f200…09e600 54 52 55 45 20 2a 2f 0a 0a 2f 2a 0a 20 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 68 6f 72 ┆TRUE */ /* * the following hor┆ 0x04f200…09e600 72 69 62 6c 65 20 63 61 73 63 61 64 65 64 20 73 65 72 69 65 73 20 6f 66 20 6d 61 63 72 6f 20 64 ┆rible cascaded series of macro d┆ 0x04f200…09e600 65 66 69 6e 69 74 69 6f 6e 73 20 69 73 20 61 0a 20 2a 20 6b 6c 75 67 65 20 74 6f 20 67 65 74 20 ┆efinitions is a * kluge to get ┆ 0x04f200…09e600 61 72 6f 75 6e 64 20 74 68 65 20 6e 6f 6e 2d 70 6f 72 74 61 62 69 6c 69 74 79 20 6f 66 20 76 61 ┆around the non-portability of va┆ 0x04f200…09e600 72 61 72 67 73 0a 20 2a 2f 0a 65 78 74 65 72 6e 20 63 68 61 72 09 78 62 66 5b 5d 3b 0a 0a 23 69 ┆rargs */ extern char xbf[]; #i┆ 0x04f200…09e600 66 6e 64 65 66 20 6c 69 6e 74 0a 23 64 65 66 69 6e 65 20 76 30 28 6d 66 2c 66 29 09 09 28 76 6f ┆fndef lint #define v0(mf,f) (vo┆ 0x04f200…09e600 69 64 29 20 6d 66 28 66 29 0a 23 64 65 66 69 6e 65 20 76 31 28 6d 66 2c 66 2c 78 31 29 09 09 28 ┆id) mf(f) #define v1(mf,f,x1) (┆ 0x04f200…09e600 76 6f 69 64 29 20 28 73 70 72 69 6e 74 66 28 78 62 66 2c 20 66 2c 20 78 31 29 2c 6d 66 28 78 62 ┆void) (sprintf(xbf, f, x1),mf(xb┆ 0x04f200…09e600 66 29 29 0a 23 64 65 66 69 6e 65 20 76 32 28 6d 66 2c 66 2c 78 31 2c 78 32 29 09 09 28 76 6f 69 ┆f)) #define v2(mf,f,x1,x2) (voi┆ 0x04f200…09e600 64 29 20 28 73 70 72 69 6e 74 66 28 78 62 66 2c 20 66 2c 20 78 31 2c 78 32 29 2c 6d 66 28 78 62 ┆d) (sprintf(xbf, f, x1,x2),mf(xb┆ 0x04f200…09e600 66 29 29 0a 23 64 65 66 69 6e 65 20 76 33 28 6d 66 2c 66 2c 78 31 2c 78 32 2c 78 33 29 09 28 76 ┆f)) #define v3(mf,f,x1,x2,x3) (v┆ 0x04f200…09e600 6f 69 64 29 20 28 73 70 72 69 6e 74 66 28 78 62 66 2c 20 66 2c 20 78 31 2c 78 32 2c 78 33 29 2c ┆oid) (sprintf(xbf, f, x1,x2,x3),┆ 0x04f200…09e600 6d 66 28 78 62 66 29 29 0a 23 64 65 66 69 6e 65 20 76 34 28 6d 66 2c 66 2c 78 31 2c 78 32 2c 78 ┆mf(xbf)) #define v4(mf,f,x1,x2,x┆ 0x04f200…09e600 33 2c 78 34 29 09 28 76 6f 69 64 29 20 28 73 70 72 69 6e 74 66 28 78 62 66 2c 20 66 2c 20 78 31 ┆3,x4) (void) (sprintf(xbf, f, x1┆ 0x04f200…09e600 2c 78 32 2c 78 33 2c 78 34 29 2c 6d 66 28 78 62 66 29 29 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e ┆,x2,x3,x4),mf(xbf)) #else #defin┆ 0x04f200…09e600 65 20 76 30 28 6d 66 2c 66 29 09 09 28 76 6f 69 64 29 20 73 70 72 69 6e 74 66 28 78 62 66 2c 20 ┆e v0(mf,f) (void) sprintf(xbf, ┆ 0x04f200…09e600 66 29 0a 23 64 65 66 69 6e 65 20 76 31 28 6d 66 2c 66 2c 78 31 29 09 09 28 76 6f 69 64 29 20 73 ┆f) #define v1(mf,f,x1) (void) s┆ 0x04f200…09e600 70 72 69 6e 74 66 28 78 62 66 2c 20 66 2c 20 78 31 29 0a 23 64 65 66 69 6e 65 20 76 32 28 6d 66 ┆printf(xbf, f, x1) #define v2(mf┆ 0x04f200…09e600 2c 66 2c 78 31 2c 78 32 29 09 09 28 76 6f 69 64 29 20 73 70 72 69 6e 74 66 28 78 62 66 2c 20 66 ┆,f,x1,x2) (void) sprintf(xbf, f┆ 0x04f200…09e600 2c 20 78 31 2c 20 78 32 29 0a 23 64 65 66 69 6e 65 20 76 33 28 6d 66 2c 66 2c 78 31 2c 78 32 2c ┆, x1, x2) #define v3(mf,f,x1,x2,┆ 0x04f200…09e600 78 33 29 09 28 76 6f 69 64 29 20 73 70 72 69 6e 74 66 28 78 62 66 2c 20 66 2c 20 78 31 2c 20 78 ┆x3) (void) sprintf(xbf, f, x1, x┆ 0x04f200…09e600 32 2c 20 78 33 29 0a 23 64 65 66 69 6e 65 20 76 34 28 6d 66 2c 66 2c 78 31 2c 78 32 2c 78 33 2c ┆2, x3) #define v4(mf,f,x1,x2,x3,┆ 0x04f200…09e600 78 34 29 09 28 76 6f 69 64 29 20 73 70 72 69 6e 74 66 28 78 62 66 2c 20 66 2c 20 78 31 2c 20 78 ┆x4) (void) sprintf(xbf, f, x1, x┆ 0x04f200…09e600 32 2c 20 78 33 2c 20 78 34 29 0a 23 65 6e 64 69 66 20 2f 2a 20 6c 69 6e 74 20 2a 2f 0a 0a 65 78 ┆2, x3, x4) #endif /* lint */ ex┆ 0x04f200…09e600 74 65 72 6e 20 69 6e 74 20 78 65 72 72 6f 72 28 29 3b 0a 23 64 65 66 69 6e 65 20 78 65 72 72 6f ┆tern int xerror(); #define xerro┆ 0x04f200…09e600 72 30 28 66 29 09 09 76 30 28 78 65 72 72 6f 72 2c 20 66 29 0a 23 64 65 66 69 6e 65 20 78 65 72 ┆r0(f) v0(xerror, f) #define xer┆ 0x04f200…09e600 72 6f 72 31 28 66 2c 20 78 31 29 09 09 76 31 28 78 65 72 72 6f 72 2c 20 66 2c 20 78 31 29 0a 23 ┆ror1(f, x1) v1(xerror, f, x1) #┆ 0x04f200…09e600 64 65 66 69 6e 65 20 78 65 72 72 6f 72 32 28 66 2c 20 78 31 2c 20 78 32 29 09 76 32 28 78 65 72 ┆define xerror2(f, x1, x2) v2(xer┆ 0x04f200…09e600 72 6f 72 2c 20 66 2c 20 78 31 2c 20 78 32 29 0a 23 64 65 66 69 6e 65 20 78 65 72 72 6f 72 33 28 ┆ror, f, x1, x2) #define xerror3(┆ 0x04f200…09e600 66 2c 20 78 31 2c 20 78 32 2c 20 78 33 29 09 76 33 28 78 65 72 72 6f 72 2c 20 66 2c 20 78 31 2c ┆f, x1, x2, x3) v3(xerror, f, x1,┆ 0x04f200…09e600 20 78 32 2c 20 78 33 29 0a 0a 65 78 74 65 72 6e 09 69 6e 74 09 6d 6f 72 65 28 29 2c 20 70 65 63 ┆ x2, x3) extern int more(), pec┆ 0x04f200…09e600 6c 6f 73 65 28 29 3b 0a 65 78 74 65 72 6e 09 63 68 61 72 09 2a 61 72 70 61 64 61 74 65 28 29 2c ┆lose(); extern char *arpadate(),┆ 0x04f200…09e600 20 2a 73 61 76 65 73 74 72 28 29 2c 20 2a 65 72 72 6d 73 67 28 29 2c 20 2a 66 75 6c 6c 6e 61 6d ┆ *savestr(), *errmsg(), *fullnam┆ 0x04f200…09e600 65 28 29 2c 20 2a 62 61 63 6b 71 75 6f 74 65 28 29 3b 0a 65 78 74 65 72 6e 09 74 69 6d 65 5f 74 ┆e(), *backquote(); extern time_t┆ 0x04f200…09e600 09 6d 6f 64 74 69 6d 65 28 29 2c 20 67 65 74 64 61 74 65 28 29 2c 20 63 67 74 64 61 74 65 28 29 ┆ modtime(), getdate(), cgtdate()┆ 0x04f200…09e600 3b 0a 65 78 74 65 72 6e 09 76 6f 69 64 09 6c 63 61 73 65 28 29 2c 20 73 65 74 6d 6f 64 74 69 6d ┆; extern void lcase(), setmodtim┆ 0x04f200…09e600 65 28 29 3b 0a 65 78 74 65 72 6e 09 62 6f 6f 6c 09 65 78 69 73 74 73 28 29 2c 20 69 73 64 69 72 ┆e(); extern bool exists(), isdir┆ 0x04f200…09e600 28 29 2c 20 70 72 65 66 69 78 28 29 2c 20 62 69 74 62 75 63 6b 65 74 28 29 2c 20 73 65 74 65 6e ┆(), prefix(), bitbucket(), seten┆ 0x04f200…09e600 76 28 29 2c 20 64 65 6c 65 6e 76 28 29 3b 0a 65 78 74 65 72 6e 09 75 6c 6f 6e 67 09 63 68 65 63 ┆v(), delenv(); extern ulong chec┆ 0x04f200…09e600 6b 73 75 6d 28 29 2c 20 63 68 65 63 6b 73 74 72 69 6e 67 28 29 3b 0a 65 78 74 65 72 6e 09 6f 66 ┆ksum(), checkstring(); extern of┆ 0x04f200…09e600 66 5f 74 09 66 69 6c 65 73 69 7a 65 28 29 2c 20 64 66 28 29 3b 0a 65 78 74 65 72 6e 09 46 49 4c ┆f_t filesize(), df(); extern FIL┆ 0x04f200…09e600 45 09 2a 78 66 6f 70 65 6e 28 29 2c 20 2a 70 65 6f 70 65 6e 28 29 3b 0a 0a 2f 2a 20 65 61 63 68 ┆E *xfopen(), *peopen(); /* each┆ 0x04f200…09e600 20 6d 61 69 6e 28 29 2d 63 6f 6e 74 61 69 6e 69 6e 67 20 6d 6f 64 75 6c 65 20 74 68 61 74 20 75 ┆ main()-containing module that u┆ 0x04f200…09e600 73 65 73 20 78 65 72 72 6f 72 28 29 20 6d 75 73 74 20 64 65 63 6c 61 72 65 20 74 68 69 73 20 2a ┆ses xerror() must declare this *┆ 0x04f200…09e600 2f 0a 65 78 74 65 72 6e 09 63 68 61 72 09 2a 50 72 6f 67 6e 61 6d 65 3b 0a 0a 2f 2a 20 6c 69 62 ┆/ extern char *Progname; /* lib┆ 0x04f200…09e600 70 6f 72 74 2e 68 20 65 6e 64 73 20 68 65 72 65 20 2a 2f 0a 72 72 6f 72 2c 20 66 2c 20 78 31 2c ┆port.h ends here */ rror, f, x1,┆ 0x04f200…09e600 20 78 32 2c 20 78 33 29 0a 0a 65 78 74 65 72 6e 09 69 6e 74 09 6d 6f 72 65 28 29 2c 20 70 65 63 ┆ x2, x3) extern int more(), pec┆ 0x04f200…09e600 6c 6f 73 65 28 29 3b 0a 65 78 74 65 72 6e 09 63 68 61 72 09 2a 61 72 70 61 64 61 74 65 28 29 2c ┆lose(); extern char *arpadate(),┆ 0x04f200…09e600 20 2a 73 61 76 65 73 74 72 28 29 2c 20 2a 65 72 72 6d 73 67 28 29 2c 20 2a 66 75 6c 6c 6e 61 6d ┆ *savestr(), *errmsg(), *fullnam┆ 0x04f200…09e600 65 28 29 2c 20 2a 62 61 63 6b 71 75 6f 74 65 28 29 3b 0a 65 78 74 65 72 6e 09 74 69 6d 65 5f 74 ┆e(), *backquote(); extern time_t┆ 0x04f200…09e600 09 6d 6f 64 74 69 6d 65 28 29 2c 20 67 65 74 64 61 74 65 28 29 2c 20 63 67 74 64 61 74 65 28 29 ┆ modtime(), getdate(), cgtdate()┆ 0x04f200…09e600 3b 0a 65 78 74 65 72 6e 09 76 6f 69 64 09 6c 63 61 73 65 28 29 2c 20 73 65 74 6d 6f 64 74 69 6d ┆; extern void lcase(), setmodtim┆ 0x04f200…09e600 65 28 29 3b 0a 65 78 74 65 72 6e 09 62 6f 6f 6c 09 65 78 69 73 74 73 28 29 2c 20 69 73 64 69 72 ┆e(); extern bool exists(), isdir┆ 0x04f200…09e600 28 29 2c 20 70 72 65 66 69 78 28 29 2c 20 62 69 74 62 75 63 6b 65 74 28 29 2c 20 73 65 74 65 6e ┆(), prefix(), bitbucket(), seten┆ 0x04f200…09e600 76 28 29 2c 20 64 65 6c 65 6e 76 28 29 3b 0a 65 78 74 65 72 6e 09 75 6c 6f 6e 67 09 63 68 65 63 ┆v(), delenv(); extern ulong chec┆ 0x04f200…09e600 6b 73 75 6d 28 29 2c 20 63 68 65 63 6b 73 74 72 69 6e 67 28 29 3b 0a 65 78 74 65 72 6e 09 6f 66 ┆ksum(), checkstring(); extern of┆ 0x04f200…09e600 66 5f 74 09 66 69 6c 65 73 69 7a 65 28 29 2c 20 64 66 28 29 3b 0a 65 78 74 65 72 6e 09 46 49 4c ┆f_t filesize(), df(); extern FIL┆ 0x04f200…09e600 45 09 2a 78 66 6f 70 65 6e 28 29 2c 20 2a 70 65 6f 70 65 6e 28 29 3b 0a 0a 2f 2a 20 65 61 63 68 ┆E *xfopen(), *peopen(); /* each┆ 0x04f200…09e600 20 6d 61 69 6e 28 29 2d 63 6f 6e 74 61 69 6e 69 6e 67 20 6d 6f 64 75 6c 65 20 74 68 61 74 20 75 ┆ main()-containing module that u┆ 0x04f200…09e600 73 65 73 20 78 65 72 72 6f 72 28 29 20 6d 75 73 74 20 64 65 63 6c 61 72 65 20 74 68 69 73 20 2a ┆ses xerror() must declare this *┆ 0x04f200…09e600 2f 0a 65 78 74 65 72 6e 09 63 68 61 72 09 2a 50 72 6f 67 6e 61 6d 65 3b 0a 0a 2f 2a 20 6c 69 62 ┆/ extern char *Progname; /* lib┆ 0x04f200…09e600 70 6f 72 74 2e 68 20 65 6e 64 73 20 68 65 72 65 20 73 72 63 2f 44 2e 70 6f 72 74 2f 6c 69 6e 65 ┆port.h ends here src/D.port/line┆ 0x04f200…09e600 63 6f 75 6e 74 2e 63 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆count.c ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆ ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 20 20 20 34 34 34 20 00 20 20 20 ┆ 444 ┆ 0x04f200…09e600 31 34 35 20 00 20 20 20 20 20 31 20 00 20 20 20 20 20 20 20 31 31 32 33 20 20 34 34 35 36 31 35 ┆145 1 1123 445615┆ 0x04f200…09e600 34 30 35 34 20 20 31 30 31 36 33 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆4054 10163 ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆ ┆ […0x9…] 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 2f 2a 20 6c 69 6e 65 63 6f 75 6e 74 2e 63 0a ┆ /* linecount.c ┆ 0x04f200…09e600 20 2a 0a 20 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 6d 61 69 6e ┆ * * Count the number of remain┆ 0x04f200…09e600 69 6e 67 20 6c 69 6e 65 73 20 69 6e 20 66 69 6c 65 20 66 70 2c 0a 20 2a 20 6f 75 74 20 74 6f 20 ┆ing lines in file fp, * out to ┆ 0x04f200…09e600 61 20 6d 61 78 69 6d 75 6d 20 67 69 76 65 6e 20 62 79 20 6d 61 78 6f 66 66 73 2e 0a 20 2a 20 44 ┆a maximum given by maxoffs. * D┆ 0x04f200…09e600 6f 20 6e 6f 74 20 6d 6f 76 65 20 74 68 65 20 66 69 6c 65 20 70 6f 69 6e 74 65 72 2e 0a 20 2a 2f ┆o not move the file pointer. */┆ 0x04f200…09e600 0a 2f 2a 4c 49 4e 54 4c 49 42 52 41 52 59 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 6c 69 62 70 6f ┆ /*LINTLIBRARY*/ #include "libpo┆ 0x04f200…09e600 72 74 2e 68 22 0a 0a 69 6e 74 20 6c 69 6e 65 63 6f 75 6e 74 28 66 70 2c 20 6d 61 78 6f 66 66 73 ┆rt.h" int linecount(fp, maxoffs┆ 0x04f200…09e600 29 0a 46 49 4c 45 20 2a 66 70 3b 0a 6f 66 66 5f 74 20 6d 61 78 6f 66 66 73 3b 0a 7b 0a 20 20 20 ┆) FILE *fp; off_t maxoffs; { ┆ 0x04f200…09e600 20 6f 66 66 5f 74 09 63 75 72 70 6f 73 2c 20 63 68 63 3b 0a 20 20 20 20 72 65 67 69 73 74 65 72 ┆ off_t curpos, chc; register┆ 0x04f200…09e600 20 69 6e 74 09 6e 6c 69 6e 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 65 67 69 73 74 65 72 20 69 6e ┆ int nlines = 0; register in┆ 0x04f200…09e600 74 09 63 3b 0a 0a 20 20 20 20 69 66 20 28 66 70 20 3d 3d 20 28 46 49 4c 45 20 2a 29 4e 55 4c 4c ┆t c; if (fp == (FILE *)NULL┆ 0x04f200…09e600 29 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a 20 20 20 20 63 75 72 70 6f 73 20 3d 20 66 74 65 6c 6c ┆) return(0); curpos = ftell┆ 0x04f200…09e600 28 66 70 29 3b 0a 20 20 20 20 63 68 63 20 3d 20 6d 61 78 6f 66 66 73 20 2d 20 63 75 72 70 6f 73 ┆(fp); chc = maxoffs - curpos┆ 0x04f200…09e600 3b 0a 20 20 20 20 77 68 69 6c 65 20 28 28 63 20 3d 20 67 65 74 63 28 66 70 29 29 20 21 3d 20 45 ┆; while ((c = getc(fp)) != E┆ 0x04f200…09e600 4f 46 20 26 26 20 28 6d 61 78 6f 66 66 73 20 3d 3d 20 30 20 7c 7c 20 63 68 63 2d 2d 20 3e 20 30 ┆OF && (maxoffs == 0 || chc-- > 0┆ 0x04f200…09e600 29 29 0a 09 69 66 20 28 63 20 3d 3d 20 27 5c 6e 27 29 0a 09 20 20 20 20 6e 6c 69 6e 65 73 2b 2b ┆)) if (c == '\n') nlines++┆ 0x04f200…09e600 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 66 73 65 65 6b 28 66 70 2c 20 28 6f 66 66 5f 74 29 63 75 ┆; (void) fseek(fp, (off_t)cu┆ 0x04f200…09e600 72 70 6f 73 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 28 6e 6c 69 6e ┆rpos, SEEK_SET); return(nlin┆ 0x04f200…09e600 65 73 29 3b 0a 7d 0a 0a 2f 2a 20 6c 69 6e 65 63 6f 75 6e 74 2e 63 20 65 6e 64 73 20 68 65 72 65 ┆es); } /* linecount.c ends here┆ 0x04f200…09e600 20 2a 2f 0a 78 69 6d 75 6d 20 67 69 76 65 6e 20 62 79 20 6d 61 78 6f 66 66 73 2e 0a 20 2a 20 44 ┆ */ ximum given by maxoffs. * D┆ 0x04f200…09e600 6f 20 6e 6f 74 20 6d 6f 76 65 20 74 68 65 20 66 69 6c 65 20 70 6f 69 6e 74 65 72 2e 0a 20 2a 2f ┆o not move the file pointer. */┆ 0x04f200…09e600 0a 2f 2a 4c 49 4e 54 4c 49 42 52 41 52 59 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 6c 69 62 70 6f ┆ /*LINTLIBRARY*/ #include "libpo┆ 0x04f200…09e600 72 74 2e 68 22 0a 0a 69 6e 74 20 6c 69 6e 65 63 6f 75 6e 74 28 66 70 2c 20 6d 61 78 6f 66 66 73 ┆rt.h" int linecount(fp, maxoffs┆ 0x04f200…09e600 29 0a 46 49 4c 45 20 2a 66 70 3b 0a 6f 66 66 5f 74 20 6d 61 78 6f 66 66 73 3b 0a 7b 0a 20 20 20 ┆) FILE *fp; off_t maxoffs; { ┆ 0x04f200…09e600 20 6f 66 66 5f 74 09 63 75 72 70 6f 73 2c 20 63 68 63 3b 0a 20 20 20 20 72 65 67 69 73 74 65 72 ┆ off_t curpos, chc; register┆ 0x04f200…09e600 20 69 6e 74 09 6e 6c 69 6e 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 65 67 69 73 74 65 72 20 69 6e ┆ int nlines = 0; register in┆ 0x04f200…09e600 74 09 63 3b 0a 0a 20 20 20 20 69 66 20 28 66 70 20 3d 3d 20 28 46 49 4c 45 20 2a 29 4e 55 4c 4c ┆t c; if (fp == (FILE *)NULL┆ 0x04f200…09e600 29 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a 20 20 20 20 63 75 72 70 6f 73 20 3d 20 66 74 65 6c 6c ┆) return(0); curpos = ftell┆ 0x04f200…09e600 28 66 70 29 3b 0a 20 20 20 20 63 68 63 20 3d 20 6d 61 78 6f 66 66 73 20 2d 20 63 75 72 70 6f 73 ┆(fp); chc = maxoffs - curpos┆ 0x04f200…09e600 3b 0a 20 20 20 20 77 68 69 6c 65 20 28 28 63 20 3d 20 67 65 74 63 28 66 70 29 29 20 21 3d 20 45 ┆; while ((c = getc(fp)) != E┆ 0x04f200…09e600 4f 46 20 26 26 20 28 6d 61 78 6f 66 66 73 20 3d 3d 20 30 20 7c 7c 20 63 68 63 2d 2d 20 3e 20 30 ┆OF && (maxoffs == 0 || chc-- > 0┆ 0x04f200…09e600 29 29 0a 09 69 66 20 28 63 20 3d 3d 20 27 5c 6e 27 29 0a 09 20 20 20 20 6e 6c 69 6e 65 73 2b 2b ┆)) if (c == '\n') nlines++┆ 0x04f200…09e600 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 66 73 65 65 73 72 63 2f 44 2e 70 6f 72 74 2f 6c 6f 63 6b ┆; (void) fseesrc/D.port/lock┆ 0x04f200…09e600 66 2e 63 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆f.c ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆ ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 20 20 20 34 34 34 20 00 20 20 20 ┆ 444 ┆ 0x04f200…09e600 31 34 35 20 00 20 20 20 20 20 31 20 00 20 20 20 20 20 20 20 32 34 35 30 20 20 34 34 35 36 31 35 ┆145 1 2450 445615┆ 0x04f200…09e600 34 30 35 34 20 20 20 37 32 36 35 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆4054 7265 ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆ ┆ […0x9…] 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆ /**************┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆********************************┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 0a 4e 41 4d 45 0a 20 ┆************************ NAME ┆ 0x04f200…09e600 20 20 6c 6f 63 6b 66 2e 63 20 2d 2d 20 58 65 6e 69 78 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f ┆ lockf.c -- Xenix implementatio┆ 0x04f200…09e600 6e 20 6f 66 20 6c 6f 63 6b 66 28 29 0a 0a 53 59 4e 4f 50 53 49 53 0a 20 20 20 69 6e 74 20 6c 6f ┆n of lockf() SYNOPSIS int lo┆ 0x04f200…09e600 63 6b 66 28 66 64 2c 20 66 75 6e 63 2c 20 6c 65 6e 67 74 68 29 0a 0a 44 45 53 43 52 49 50 54 49 ┆ckf(fd, func, length) DESCRIPTI┆ 0x04f200…09e600 4f 4e 0a 20 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 6f 6d 70 61 74 69 62 6c 65 ┆ON This routine is compatible┆ 0x04f200…09e600 20 77 69 74 68 20 74 68 65 20 2f 75 73 72 2f 67 72 6f 75 70 20 73 79 73 74 65 6d 20 63 61 6c 6c ┆ with the /usr/group system call┆ 0x04f200…09e600 20 6c 6f 63 6b 66 28 29 2e 0a 49 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 6c 6f 63 6b ┆ lockf(). It implements the lock┆ 0x04f200…09e600 66 28 29 20 73 65 6d 61 6e 74 69 63 73 20 75 73 69 6e 67 20 74 68 65 20 58 65 6e 69 78 20 6c 6f ┆f() semantics using the Xenix lo┆ 0x04f200…09e600 63 6b 69 6e 67 28 29 20 63 61 6c 6c 2e 0a 0a 4e 4f 54 45 0a 20 20 20 54 68 69 73 20 72 6f 75 74 ┆cking() call. NOTE This rout┆ 0x04f200…09e600 69 6e 65 20 69 73 20 61 6c 73 6f 20 75 73 65 66 75 6c 20 66 6f 72 20 74 68 65 20 41 54 26 54 20 ┆ine is also useful for the AT&T ┆ 0x04f200…09e600 55 4e 49 58 20 50 43 2c 20 77 68 69 63 68 20 66 6f 72 20 73 6f 6d 65 20 62 69 7a 61 72 72 65 0a ┆UNIX PC, which for some bizarre ┆ 0x04f200…09e600 72 65 61 73 6f 6e 20 69 6d 70 6c 65 6d 65 6e 74 73 20 6c 6f 63 6b 69 6e 67 28 29 20 62 75 74 20 ┆reason implements locking() but ┆ 0x04f200…09e600 6e 6f 74 20 6c 6f 63 6b 66 28 29 2e 0a 0a 41 55 54 48 4f 52 0a 20 20 20 43 68 69 70 20 53 61 6c ┆not lockf(). AUTHOR Chip Sal┆ 0x04f200…09e600 7a 65 6e 62 65 72 67 20 28 63 68 69 70 40 61 74 65 6e 67 29 2e 0a 20 20 20 54 68 69 73 20 73 6f ┆zenberg (chip@ateng). This so┆ 0x04f200…09e600 66 74 77 61 72 65 20 69 73 20 43 6f 70 79 72 69 67 68 74 20 28 43 29 20 31 39 38 39 20 62 79 20 ┆ftware is Copyright (C) 1989 by ┆ 0x04f200…09e600 45 72 69 63 20 53 2e 20 52 61 79 6d 6f 6e 64 20 66 6f 72 20 74 68 65 20 73 6f 6c 65 20 70 75 72 ┆Eric S. Raymond for the sole pur┆ 0x04f200…09e600 70 6f 73 65 0a 6f 66 20 70 72 6f 74 65 63 74 69 6e 67 20 66 72 65 65 20 72 65 64 69 73 74 72 69 ┆pose of protecting free redistri┆ 0x04f200…09e600 62 75 74 69 6f 6e 3b 20 73 65 65 20 74 68 65 20 4c 49 43 45 4e 53 45 20 66 69 6c 65 20 66 6f 72 ┆bution; see the LICENSE file for┆ 0x04f200…09e600 20 64 65 74 61 69 6c 73 2e 0a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆ details. *********************┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆********************************┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 4c 49 4e 54 4c 49 42 52 41 ┆*******************/ /*LINTLIBRA┆ 0x04f200…09e600 52 59 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 6c 69 62 70 6f 72 74 2e 68 22 0a 0a 23 69 66 64 65 ┆RY*/ #include "libport.h" #ifde┆ 0x04f200…09e600 66 20 4d 5f 58 45 4e 49 58 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 6c 6f 63 6b 69 6e 67 2e ┆f M_XENIX #include <sys/locking.┆ 0x04f200…09e600 68 3e 0a 23 65 6c 73 65 0a 2f 2a 20 67 6f 64 64 65 73 73 20 68 65 6c 70 20 75 73 20 69 66 20 74 ┆h> #else /* goddess help us if t┆ 0x04f200…09e600 68 65 79 20 65 76 65 72 20 63 68 61 6e 67 65 20 74 68 65 73 65 20 6f 6e 20 74 68 65 20 33 42 31 ┆hey ever change these on the 3B1┆ 0x04f200…09e600 2e 2e 2e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4c 4b 5f 55 4e 4c 43 4b 09 30 09 2f 2a 20 72 65 6c ┆... */ #define LK_UNLCK 0 /* rel┆ 0x04f200…09e600 65 61 73 65 20 6c 6f 63 6b 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4c 4b 5f 4c 4f 43 4b 09 09 31 09 ┆ease lock */ #define LK_LOCK 1 ┆ 0x04f200…09e600 2f 2a 20 6d 61 6e 64 61 74 6f 72 79 20 6c 6f 63 6b 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4c 4b 5f ┆/* mandatory lock */ #define LK_┆ 0x04f200…09e600 4e 42 4c 43 4b 09 32 09 2f 2a 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 20 2a 2f 0a 23 65 6e 64 ┆NBLCK 2 /* advisory lock */ #end┆ 0x04f200…09e600 69 66 20 2f 2a 20 4d 5f 58 45 4e 49 58 20 2a 2f 0a 0a 69 6e 74 20 6c 6f 63 6b 66 28 66 64 2c 20 ┆if /* M_XENIX */ int lockf(fd, ┆ 0x04f200…09e600 66 75 6e 63 2c 20 6c 65 6e 67 74 68 29 0a 69 6e 74 20 66 64 2c 20 66 75 6e 63 3b 0a 6c 6f 6e 67 ┆func, length) int fd, func; long┆ 0x04f200…09e600 20 6c 65 6e 67 74 68 3b 0a 7b 0a 20 20 20 20 73 77 69 74 63 68 20 28 66 75 6e 63 29 0a 20 20 20 ┆ length; { switch (func) ┆ 0x04f200…09e600 20 7b 0a 20 20 20 20 63 61 73 65 20 46 5f 55 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 28 6c 6f 63 6b ┆ { case F_ULOCK: return(lock┆ 0x04f200…09e600 69 6e 67 28 66 64 2c 20 4c 4b 5f 55 4e 4c 43 4b 2c 20 6c 65 6e 67 74 68 29 29 3b 0a 20 20 20 20 ┆ing(fd, LK_UNLCK, length)); ┆ 0x04f200…09e600 63 61 73 65 20 46 5f 4c 4f 43 4b 3a 20 20 72 65 74 75 72 6e 28 6c 6f 63 6b 69 6e 67 28 66 64 2c ┆case F_LOCK: return(locking(fd,┆ 0x04f200…09e600 20 4c 4b 5f 4c 4f 43 4b 2c 20 6c 65 6e 67 74 68 29 29 3b 0a 20 20 20 20 63 61 73 65 20 46 5f 54 ┆ LK_LOCK, length)); case F_T┆ 0x04f200…09e600 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 28 6c 6f 63 6b 69 6e 67 28 66 64 2c 20 4c 4b 5f 4e 42 4c 43 ┆LOCK: return(locking(fd, LK_NBLC┆ 0x04f200…09e600 4b 2c 20 6c 65 6e 67 74 68 29 29 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 65 72 72 6e 6f 20 ┆K, length)); default: errno ┆ 0x04f200…09e600 3d 20 45 49 4e 56 41 4c 3b 20 72 65 74 75 72 6e 28 46 41 49 4c 29 3b 0a 20 20 20 20 7d 0a 7d 0a ┆= EINVAL; return(FAIL); } } ┆ 0x04f200…09e600 0a 2f 2a 20 6c 6f 63 6b 66 2e 63 20 65 6e 64 73 20 68 65 72 65 20 2a 2f 0a 75 73 20 69 66 20 74 ┆ /* lockf.c ends here */ us if t┆ 0x04f200…09e600 68 65 79 20 65 76 65 72 20 63 68 61 6e 67 65 20 74 68 65 73 65 20 6f 6e 20 74 68 65 20 33 42 31 ┆hey ever change these on the 3B1┆ 0x04f200…09e600 2e 2e 2e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4c 4b 5f 55 4e 4c 43 4b 09 30 09 2f 2a 20 72 65 6c ┆... */ #define LK_UNLCK 0 /* rel┆ 0x04f200…09e600 65 61 73 65 20 6c 6f 63 6b 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4c 4b 5f 4c 4f 43 4b 09 09 31 09 ┆ease lock */ #define LK_LOCK 1 ┆ 0x04f200…09e600 2f 2a 20 6d 61 6e 64 61 74 6f 72 79 20 6c 6f 63 6b 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4c 4b 5f ┆/* mandatory lock */ #define LK_┆ 0x04f200…09e600 4e 42 4c 43 4b 09 32 09 2f 2a 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 20 2a 2f 0a 23 65 6e 64 ┆NBLCK 2 /* advisory lock */ #end┆ 0x04f200…09e600 69 66 20 2f 2a 20 4d 5f 58 45 4e 49 58 20 2a 2f 0a 0a 69 6e 74 20 6c 6f 63 6b 66 28 66 64 2c 20 ┆if /* M_XENIX */ int lockf(fd, ┆ 0x04f200…09e600 66 75 6e 63 2c 20 6c 65 6e 67 74 68 29 0a 69 6e 74 73 72 63 2f 44 2e 70 6f 72 74 2f 6d 6b 62 72 ┆func, length) intsrc/D.port/mkbr┆ 0x04f200…09e600 61 6e 63 68 2e 63 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆anch.c ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆ ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 20 20 20 34 34 34 20 00 20 20 20 ┆ 444 ┆ 0x04f200…09e600 31 34 35 20 00 20 20 20 20 20 31 20 00 20 20 20 20 20 20 20 34 34 37 31 20 20 34 34 36 35 33 30 ┆145 1 4471 446530┆ 0x04f200…09e600 35 35 31 30 20 20 20 37 37 35 34 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆5510 7754 ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆ ┆ […0x9…] 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆ /**************┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆********************************┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 0a ┆****************************** ┆ 0x04f200…09e600 4e 41 4d 45 0a 20 20 20 6d 6b 62 72 61 6e 63 68 2e 63 20 2d 2d 20 64 69 72 65 63 74 6f 72 79 2d ┆NAME mkbranch.c -- directory-┆ 0x04f200…09e600 6d 61 6b 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73 0a 0a 53 59 4e 4f 50 53 49 53 0a 20 20 20 23 69 ┆making functions SYNOPSIS #i┆ 0x04f200…09e600 6e 63 6c 75 64 65 20 22 6c 69 62 70 6f 72 74 2e 68 22 0a 0a 20 20 20 69 6e 74 20 6d 6b 62 72 61 ┆nclude "libport.h" int mkbra┆ 0x04f200…09e600 6e 63 68 28 70 61 74 68 2c 20 70 65 72 6d 29 20 2d 2d 20 72 65 63 75 72 73 69 76 65 6c 79 20 6d ┆nch(path, perm) -- recursively m┆ 0x04f200…09e600 61 6b 65 20 61 20 62 72 61 6e 63 68 20 77 69 74 68 20 6d 6b 64 69 72 28 29 0a 20 20 20 63 68 61 ┆ake a branch with mkdir() cha┆ 0x04f200…09e600 72 20 2a 70 61 74 68 3b 20 69 6e 74 20 70 65 72 6d 3b 0a 0a 44 45 53 43 52 49 50 54 49 4f 4e 0a ┆r *path; int perm; DESCRIPTION ┆ 0x04f200…09e600 20 20 20 4d 6b 64 69 72 28 29 20 63 61 6e 20 6f 6e 6c 79 20 6d 61 6b 65 20 6f 6e 65 20 64 69 72 ┆ Mkdir() can only make one dir┆ 0x04f200…09e600 65 63 74 6f 72 79 20 61 74 20 61 20 74 69 6d 65 2e 20 4d 6b 62 72 61 6e 63 68 28 29 20 77 69 6c ┆ectory at a time. Mkbranch() wil┆ 0x04f200…09e600 6c 20 74 61 6b 65 20 61 6e 0a 61 72 62 69 74 72 61 72 79 20 70 61 74 68 20 72 6f 6f 74 65 64 20 ┆l take an arbitrary path rooted ┆ 0x04f200…09e600 69 6e 20 61 6e 20 61 63 63 65 73 73 69 62 6c 65 20 64 69 72 65 63 74 6f 72 79 20 61 6e 64 20 6d ┆in an accessible directory and m┆ 0x04f200…09e600 61 6b 65 20 61 6c 6c 20 64 69 72 65 63 74 6f 72 69 65 73 0a 6e 65 63 65 73 73 61 72 79 20 74 6f ┆ake all directories necessary to┆ 0x04f200…09e600 20 63 72 65 61 74 65 20 74 68 65 20 62 6f 74 74 6f 6d 6d 6f 73 74 20 6f 6e 65 2e 0a 0a 42 55 47 ┆ create the bottommost one. BUG┆ 0x04f200…09e600 53 0a 20 20 20 49 74 20 73 63 72 69 62 62 6c 65 73 20 6f 6e 20 69 74 73 20 61 72 67 75 6d 65 6e ┆S It scribbles on its argumen┆ 0x04f200…09e600 74 2e 0a 0a 4e 4f 54 45 0a 20 20 20 49 66 20 79 6f 75 20 63 6f 6d 70 69 6c 65 20 74 68 69 73 20 ┆t. NOTE If you compile this ┆ 0x04f200…09e600 77 69 74 68 20 2d 44 4d 41 49 4e 20 69 74 20 77 69 6c 6c 20 67 65 6e 65 72 61 74 65 20 61 6e 20 ┆with -DMAIN it will generate an ┆ 0x04f200…09e600 69 6e 74 65 72 61 63 74 69 76 65 20 74 65 73 74 65 72 0a 66 6f 72 20 6d 6b 62 72 61 6e 63 68 28 ┆interactive tester for mkbranch(┆ 0x04f200…09e600 29 2c 20 73 65 65 20 74 68 65 20 63 6f 64 65 20 62 65 6c 6f 77 2e 0a 0a 52 45 56 49 53 45 44 20 ┆), see the code below. REVISED ┆ 0x04f200…09e600 42 59 0a 20 20 20 45 72 69 63 20 53 2e 20 52 61 79 6d 6f 6e 64 0a 20 20 20 54 68 69 73 20 73 6f ┆BY Eric S. Raymond This so┆ 0x04f200…09e600 66 74 77 61 72 65 20 69 73 20 43 6f 70 79 72 69 67 68 74 20 28 43 29 20 31 39 38 39 20 62 79 20 ┆ftware is Copyright (C) 1989 by ┆ 0x04f200…09e600 45 72 69 63 20 53 2e 20 52 61 79 6d 6f 6e 64 20 66 6f 72 20 74 68 65 20 73 6f 6c 65 20 70 75 72 ┆Eric S. Raymond for the sole pur┆ 0x04f200…09e600 70 6f 73 65 0a 6f 66 20 70 72 6f 74 65 63 74 69 6e 67 20 66 72 65 65 20 72 65 64 69 73 74 72 69 ┆pose of protecting free redistri┆ 0x04f200…09e600 62 75 74 69 6f 6e 3b 20 73 65 65 20 74 68 65 20 4c 49 43 45 4e 53 45 20 66 69 6c 65 20 66 6f 72 ┆bution; see the LICENSE file for┆ 0x04f200…09e600 20 64 65 74 61 69 6c 73 2e 0a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆ details. *********************┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆********************************┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 20 4c 49 4e 54 ┆***********************/ /* LINT┆ 0x04f200…09e600 4c 49 42 52 41 52 59 20 2a 2f 0a 0a 23 69 6e 63 6c 75 64 65 20 22 6c 69 62 70 6f 72 74 2e 68 22 ┆LIBRARY */ #include "libport.h"┆ 0x04f200…09e600 0a 0a 69 6e 74 20 6d 6b 62 72 61 6e 63 68 28 70 61 74 68 2c 20 70 65 72 6d 29 0a 2f 2a 0a 20 2a ┆ int mkbranch(path, perm) /* *┆ 0x04f200…09e600 20 6d 61 6b 65 20 61 20 63 68 61 69 6e 20 6f 66 20 64 69 72 65 63 74 6f 72 69 65 73 20 65 6e 64 ┆ make a chain of directories end┆ 0x04f200…09e600 69 6e 67 20 69 6e 20 74 68 65 20 67 69 76 65 6e 20 66 75 6c 6c 20 70 61 74 68 2c 20 61 6e 64 20 ┆ing in the given full path, and ┆ 0x04f200…09e600 73 65 74 20 61 6c 6c 0a 20 2a 20 73 75 63 68 20 64 69 72 65 63 74 6f 72 69 65 73 20 74 6f 20 62 ┆set all * such directories to b┆ 0x04f200…09e600 65 20 6f 77 6e 65 64 20 62 79 20 63 61 6c 6c 65 72 27 73 20 65 66 66 65 63 74 69 76 65 20 75 69 ┆e owned by caller's effective ui┆ 0x04f200…09e600 64 20 61 6e 64 20 67 69 64 2e 0a 20 2a 2f 0a 63 68 61 72 20 2a 70 61 74 68 3b 0a 69 6e 74 20 70 ┆d and gid. */ char *path; int p┆ 0x04f200…09e600 65 72 6d 3b 0a 7b 0a 20 20 20 20 72 65 67 69 73 74 65 72 20 63 68 61 72 20 20 20 2a 74 68 69 73 ┆erm; { register char *this┆ 0x04f200…09e600 2c 20 2a 73 6c 61 73 68 2c 20 63 3b 0a 20 20 20 20 69 6e 74 09 09 20 20 20 20 73 65 67 63 6f 75 ┆, *slash, c; int segcou┆ 0x04f200…09e600 6e 74 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 6d 61 6b 65 20 74 68 65 20 64 69 72 65 63 74 6f ┆nt = 0; /* make the directo┆ 0x04f200…09e600 72 69 65 73 20 2a 2f 0a 20 20 20 20 66 6f 72 20 28 74 68 69 73 20 3d 20 70 61 74 68 3b 20 2a 74 ┆ries */ for (this = path; *t┆ 0x04f200…09e600 68 69 73 20 21 3d 20 27 5c 30 27 3b 20 74 68 69 73 20 3d 20 73 6c 61 73 68 29 0a 20 20 20 20 7b ┆his != '\0'; this = slash) {┆ 0x04f200…09e600 0a 09 77 68 69 6c 65 20 28 2a 74 68 69 73 20 3d 3d 20 27 2f 27 29 0a 09 09 74 68 69 73 2b 2b 3b ┆ while (*this == '/') this++;┆ 0x04f200…09e600 0a 09 66 6f 72 20 28 73 6c 61 73 68 20 3d 20 74 68 69 73 3b 20 28 63 20 3d 20 2a 73 6c 61 73 68 ┆ for (slash = this; (c = *slash┆ 0x04f200…09e600 29 20 21 3d 20 27 5c 30 27 20 26 26 20 63 20 21 3d 20 27 2f 27 3b 20 73 6c 61 73 68 2b 2b 29 0a ┆) != '\0' && c != '/'; slash++) ┆ 0x04f200…09e600 09 09 3b 0a 09 73 65 67 63 6f 75 6e 74 2b 2b 3b 0a 09 2a 73 6c 61 73 68 20 3d 20 27 5c 30 27 3b ┆ ; segcount++; *slash = '\0';┆ 0x04f200…09e600 0a 0a 23 69 66 64 65 66 20 4d 41 49 4e 0a 09 28 76 6f 69 64 29 20 66 70 72 69 6e 74 66 28 73 74 ┆ #ifdef MAIN (void) fprintf(st┆ 0x04f200…09e600 64 65 72 72 2c 20 22 43 68 65 63 6b 69 6e 67 20 62 72 61 6e 63 68 20 25 73 5c 6e 22 2c 20 70 61 ┆derr, "Checking branch %s\n", pa┆ 0x04f200…09e600 74 68 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 4d 41 49 4e 20 2a 2f 0a 0a 09 69 66 20 28 6d 6b 64 ┆th); #endif /* MAIN */ if (mkd┆ 0x04f200…09e600 69 72 28 70 61 74 68 2c 20 70 65 72 6d 29 20 3d 3d 20 46 41 49 4c 20 26 26 20 65 72 72 6e 6f 20 ┆ir(path, perm) == FAIL && errno ┆ 0x04f200…09e600 21 3d 20 45 45 58 49 53 54 29 0a 09 7b 0a 09 20 20 20 20 2a 73 6c 61 73 68 20 3d 20 63 3b 0a 09 ┆!= EEXIST) { *slash = c; ┆ 0x04f200…09e600 20 20 20 20 72 65 74 75 72 6e 28 73 65 67 63 6f 75 6e 74 29 3b 0a 09 7d 0a 09 65 6c 73 65 0a 09 ┆ return(segcount); } else ┆ 0x04f200…09e600 20 20 20 20 2a 73 6c 61 73 68 20 3d 20 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 65 74 75 72 ┆ *slash = c; } retur┆ 0x04f200…09e600 6e 28 53 55 43 43 45 45 44 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 4d 41 49 4e 0a 6d 61 69 6e 28 ┆n(SUCCEED); } #ifdef MAIN main(┆ 0x04f200…09e600 61 72 67 63 2c 20 61 72 67 76 29 0a 69 6e 74 09 61 72 67 63 3b 0a 63 68 61 72 09 2a 61 72 67 76 ┆argc, argv) int argc; char *argv┆ 0x04f200…09e600 5b 5d 3b 0a 7b 0a 20 20 20 20 69 6e 74 20 64 73 74 61 74 2c 20 70 65 72 6d 73 3b 0a 0a 20 20 20 ┆[]; { int dstat, perms; ┆ 0x04f200…09e600 20 2f 2a 20 67 69 76 65 20 75 73 65 72 20 61 20 63 68 61 6e 63 65 20 74 6f 20 73 65 74 20 74 68 ┆ /* give user a chance to set th┆ 0x04f200…09e600 65 20 75 6d 61 73 6b 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20 61 20 6d 6b 62 72 ┆e umask before attempting a mkbr┆ 0x04f200…09e600 61 6e 63 68 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 72 6e 63 6d 70 28 61 72 67 76 5b 31 5d 2c ┆anch */ if (strncmp(argv[1],┆ 0x04f200…09e600 20 22 2d 75 22 2c 20 32 29 20 3d 3d 20 53 55 43 43 45 45 44 29 0a 20 20 20 20 7b 0a 09 28 76 6f ┆ "-u", 2) == SUCCEED) { (vo┆ 0x04f200…09e600 69 64 29 20 73 73 63 61 6e 66 28 61 72 67 76 5b 31 5d 20 2b 20 32 2c 20 22 25 6f 22 2c 20 26 70 ┆id) sscanf(argv[1] + 2, "%o", &p┆ 0x04f200…09e600 65 72 6d 73 29 3b 0a 09 28 76 6f 69 64 29 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 ┆erms); (void) fprintf(stderr, "┆ 0x04f200…09e600 6d 61 69 6e 3a 20 73 65 74 74 69 6e 67 20 75 6d 61 73 6b 20 74 6f 20 25 6f 5c 6e 22 2c 20 70 65 ┆main: setting umask to %o\n", pe┆ 0x04f200…09e600 72 6d 73 29 3b 0a 09 28 76 6f 69 64 29 20 75 6d 61 73 6b 28 70 65 72 6d 73 29 3b 0a 09 2b 2b 61 ┆rms); (void) umask(perms); ++a┆ 0x04f200…09e600 72 67 76 3b 20 2d 2d 61 72 67 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 61 72 67 63 ┆rgv; --argc; } if (argc┆ 0x04f200…09e600 20 3e 20 32 29 0a 09 28 76 6f 69 64 29 20 73 73 63 61 6e 66 28 61 72 67 76 5b 32 5d 2c 20 22 25 ┆ > 2) (void) sscanf(argv[2], "%┆ 0x04f200…09e600 6f 22 2c 20 26 70 65 72 6d 73 29 3b 0a 20 20 20 20 65 6c 73 65 0a 09 70 65 72 6d 73 20 3d 20 30 ┆o", &perms); else perms = 0┆ 0x04f200…09e600 37 37 37 3b 0a 0a 20 20 20 20 69 66 20 28 64 73 74 61 74 20 3d 20 6d 6b 62 72 61 6e 63 68 28 61 ┆777; if (dstat = mkbranch(a┆ 0x04f200…09e600 72 67 76 5b 31 5d 2c 20 70 65 72 6d 73 29 29 0a 20 20 20 20 7b 0a 09 28 76 6f 69 64 29 20 66 70 ┆rgv[1], perms)) { (void) fp┆ 0x04f200…09e600 72 69 6e 74 66 28 73 74 64 65 72 72 2c 0a 09 09 20 20 20 20 22 6d 6b 62 72 61 6e 63 68 3a 20 63 ┆rintf(stderr, "mkbranch: c┆ 0x04f200…09e600 61 6e 6e 6f 74 20 6d 6b 62 72 61 6e 63 68 20 25 73 3a 20 65 72 72 6e 6f 20 3d 20 25 64 20 6f 6e ┆annot mkbranch %s: errno = %d on┆ 0x04f200…09e600 20 73 65 67 20 25 64 5c 6e 22 2c 0a 09 09 20 20 20 20 61 72 67 76 5b 31 5d 2c 20 65 72 72 6e 6f ┆ seg %d\n", argv[1], errno┆ 0x04f200…09e600 2c 20 64 73 74 61 74 29 3b 0a 09 65 78 69 74 28 64 73 74 61 74 29 3b 0a 20 20 20 20 7d 0a 7d 0a ┆, dstat); exit(dstat); } } ┆ 0x04f200…09e600 0a 69 6e 74 20 6c 6f 67 65 72 72 28 6d 29 20 63 68 61 72 20 2a 6d 3b 20 7b 20 28 76 6f 69 64 29 ┆ int logerr(m) char *m; { (void)┆ 0x04f200…09e600 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25 73 5c 6e 22 29 3b 20 7d 0a 23 65 6e 64 ┆ fprintf(stderr, "%s\n"); } #end┆ 0x04f200…09e600 69 66 20 2f 2a 20 4d 41 49 4e 20 2a 2f 0a 0a 2f 2a 20 6d 6b 62 72 61 6e 63 68 2e 63 20 65 6e 64 ┆if /* MAIN */ /* mkbranch.c end┆ 0x04f200…09e600 73 20 68 65 72 65 20 2a 2f 0a 28 61 72 67 76 5b 31 5d 20 2b 20 32 2c 20 22 25 6f 22 2c 20 26 70 ┆s here */ (argv[1] + 2, "%o", &p┆ 0x04f200…09e600 65 72 6d 73 29 3b 0a 09 28 76 6f 69 64 29 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 ┆erms); (void) fprintf(stderr, "┆ 0x04f200…09e600 6d 61 69 6e 3a 20 73 65 74 74 69 6e 67 20 75 6d 61 73 6b 20 74 6f 20 25 6f 5c 6e 22 2c 20 70 65 ┆main: setting umask to %o\n", pe┆ 0x04f200…09e600 72 6d 73 29 3b 0a 09 28 76 6f 69 64 29 20 75 6d 61 73 6b 28 70 65 72 6d 73 29 3b 0a 09 2b 2b 61 ┆rms); (void) umask(perms); ++a┆ 0x04f200…09e600 72 67 76 3b 20 2d 2d 61 72 67 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 61 72 67 63 ┆rgv; --argc; } if (argc┆ 0x04f200…09e600 20 3e 20 32 29 0a 09 28 76 6f 69 64 29 20 73 73 63 61 6e 66 28 61 72 67 76 5b 32 5d 2c 20 22 25 ┆ > 2) (void) sscanf(argv[2], "%┆ 0x04f200…09e600 6f 22 2c 20 26 70 65 72 6d 73 29 3b 0a 20 20 20 20 73 72 63 2f 44 2e 70 6f 72 74 2f 6d 6f 72 65 ┆o", &perms); src/D.port/more┆ 0x04f200…09e600 2e 63 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆.c ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆ ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 20 20 20 34 34 34 20 00 20 20 20 ┆ 444 ┆ 0x04f200…09e600 31 34 35 20 00 20 20 20 20 20 31 20 00 20 20 20 20 20 20 20 34 31 33 31 20 20 34 34 35 36 31 35 ┆145 1 4131 445615┆ 0x04f200…09e600 34 30 35 37 20 20 20 37 31 33 32 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆4057 7132 ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆ ┆ […0x9…] 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆ /**************┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆********************************┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a ┆******************************* ┆ 0x04f200…09e600 0a 4e 41 4d 45 0a 20 20 20 6d 6f 72 65 2e 63 20 2d 2d 20 64 69 73 70 6c 61 79 20 61 20 66 69 6c ┆ NAME more.c -- display a fil┆ 0x04f200…09e600 65 20 74 68 72 6f 75 67 68 20 74 68 65 20 70 61 67 65 72 0a 0a 53 59 4e 4f 50 53 49 53 0a 20 20 ┆e through the pager SYNOPSIS ┆ 0x04f200…09e600 20 69 6e 74 20 6d 6f 72 65 28 66 69 6c 65 2c 20 69 66 70 2c 20 6c 69 6e 65 73 29 09 2d 2d 20 70 ┆ int more(file, ifp, lines) -- p┆ 0x04f200…09e600 61 67 65 20 74 68 65 20 66 69 6c 65 0a 20 20 20 63 68 61 72 20 2a 66 69 6c 65 3b 20 46 49 4c 45 ┆age the file char *file; FILE┆ 0x04f200…09e600 20 2a 69 66 70 3b 20 69 6e 74 20 6c 69 6e 65 73 3b 0a 0a 44 45 53 43 52 49 50 54 49 4f 4e 0a 20 ┆ *ifp; int lines; DESCRIPTION ┆ 0x04f200…09e600 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 70 72 6f 67 ┆ This function invokes the prog┆ 0x04f200…09e600 72 61 6d 20 6e 61 6d 65 64 20 69 6e 20 74 68 65 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72 ┆ram named in the environment var┆ 0x04f200…09e600 69 61 62 6c 65 20 50 41 47 45 52 0a 28 69 66 20 69 74 27 73 20 73 65 74 29 2c 20 6f 72 20 74 68 ┆iable PAGER (if it's set), or th┆ 0x04f200…09e600 65 20 73 79 73 74 65 6d 20 64 65 66 61 75 6c 74 20 70 61 67 65 72 20 28 75 73 75 61 6c 6c 79 20 ┆e system default pager (usually ┆ 0x04f200…09e600 6d 6f 72 65 28 31 29 20 6f 72 20 70 67 28 31 29 29 2e 20 49 66 20 74 68 65 0a 74 68 69 72 64 20 ┆more(1) or pg(1)). If the third ┆ 0x04f200…09e600 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 7a 65 72 6f 20 61 6e 64 20 6c 65 73 73 20 74 68 61 ┆argument is nonzero and less tha┆ 0x04f200…09e600 6e 20 74 68 65 20 50 41 47 45 4d 49 4e 20 63 6f 6e 73 74 61 6e 74 20 28 75 73 75 61 6c 6c 79 20 ┆n the PAGEMIN constant (usually ┆ 0x04f200…09e600 32 33 29 0a 6c 69 6e 65 73 20 6c 6f 6e 67 2c 20 74 68 65 20 66 69 6c 65 20 77 69 6c 6c 20 73 69 ┆23) lines long, the file will si┆ 0x04f200…09e600 6d 70 6c 79 20 62 65 20 63 6f 70 69 65 64 20 74 6f 20 73 74 64 6f 75 74 2c 20 61 76 6f 69 64 69 ┆mply be copied to stdout, avoidi┆ 0x04f200…09e600 6e 67 20 74 68 65 20 70 72 6f 63 65 73 73 0a 73 70 61 77 6e 20 6f 76 65 72 68 65 61 64 2e 0a 0a ┆ng the process spawn overhead. ┆ 0x04f200…09e600 20 20 20 49 6e 20 74 68 65 20 6c 61 74 74 65 72 20 63 61 73 65 2c 20 69 66 20 6d 6f 72 65 28 29 ┆ In the latter case, if more()┆ 0x04f200…09e600 20 63 61 6e 20 64 65 74 65 63 74 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20 62 65 69 6e 67 ┆ can detect that the pager being┆ 0x04f200…09e600 20 69 6e 76 6f 6b 65 64 0a 72 65 61 6c 6c 79 20 69 73 20 6d 6f 72 65 28 31 29 2c 20 69 74 20 77 ┆ invoked really is more(1), it w┆ 0x04f200…09e600 69 6c 6c 20 65 6d 69 74 20 61 20 74 72 61 69 6c 69 6e 67 20 66 6f 72 6d 20 66 65 65 64 20 74 6f ┆ill emit a trailing form feed to┆ 0x04f200…09e600 20 70 61 75 73 65 20 69 74 2e 20 54 68 69 73 20 69 73 0a 61 20 68 6f 72 72 69 62 6c 65 20 68 61 ┆ pause it. This is a horrible ha┆ 0x04f200…09e600 63 6b 20 74 68 61 74 20 77 69 6c 6c 20 70 72 6f 62 61 62 6c 79 20 66 61 69 6c 20 6f 66 66 20 55 ┆ck that will probably fail off U┆ 0x04f200…09e600 4e 49 58 20 73 79 73 74 65 6d 73 2e 0a 0a 41 55 54 48 4f 52 0a 20 20 20 45 72 69 63 20 53 2e 20 ┆NIX systems. AUTHOR Eric S. ┆ 0x04f200…09e600 52 61 79 6d 6f 6e 64 0a 20 20 20 54 68 69 73 20 73 6f 66 74 77 61 72 65 20 69 73 20 43 6f 70 79 ┆Raymond This software is Copy┆ 0x04f200…09e600 72 69 67 68 74 20 28 43 29 20 31 39 38 39 20 62 79 20 45 72 69 63 20 53 2e 20 52 61 79 6d 6f 6e ┆right (C) 1989 by Eric S. Raymon┆ 0x04f200…09e600 64 20 66 6f 72 20 74 68 65 20 73 6f 6c 65 20 70 75 72 70 6f 73 65 0a 6f 66 20 70 72 6f 74 65 63 ┆d for the sole purpose of protec┆ 0x04f200…09e600 74 69 6e 67 20 66 72 65 65 20 72 65 64 69 73 74 72 69 62 75 74 69 6f 6e 3b 20 73 65 65 20 74 68 ┆ting free redistribution; see th┆ 0x04f200…09e600 65 20 4c 49 43 45 4e 53 45 20 66 69 6c 65 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2a 2a 2a ┆e LICENSE file for details. ****┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆********************************┆ […0x1…] 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 20 4c 49 4e 54 4c 49 42 52 41 52 59 20 2a 2f 0a 23 69 6e ┆*********/ /* LINTLIBRARY */ #in┆ 0x04f200…09e600 63 6c 75 64 65 20 22 6c 69 62 70 6f 72 74 2e 68 22 09 2f 2a 20 66 6f 72 20 74 68 65 20 50 41 47 ┆clude "libport.h" /* for the PAG┆ 0x04f200…09e600 45 20 23 64 65 66 69 6e 65 20 2a 2f 0a 0a 23 64 65 66 69 6e 65 20 50 41 47 45 4d 49 4e 09 09 32 ┆E #define */ #define PAGEMIN 2┆ 0x04f200…09e600 33 09 2f 2a 20 61 6c 6c 6f 77 20 66 6f 72 20 32 34 74 68 20 6c 69 6e 65 20 6f 66 20 6d 6f 72 65 ┆3 /* allow for 24th line of more┆ 0x04f200…09e600 28 31 29 20 70 72 6f 6d 70 74 20 2a 2f 0a 0a 69 6e 74 20 6d 6f 72 65 28 66 69 6c 65 2c 20 69 66 ┆(1) prompt */ int more(file, if┆ 0x04f200…09e600 70 2c 20 6c 69 6e 65 73 29 0a 63 68 61 72 20 2a 66 69 6c 65 3b 0a 46 49 4c 45 20 2a 69 66 70 3b ┆p, lines) char *file; FILE *ifp;┆ 0x04f200…09e600 0a 69 6e 74 20 20 6c 69 6e 65 73 3b 0a 7b 0a 20 20 20 20 63 68 61 72 20 62 66 72 5b 42 55 46 53 ┆ int lines; { char bfr[BUFS┆ 0x04f200…09e600 49 5a 5d 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63 68 61 72 20 2a 70 61 67 65 72 20 3d 20 28 63 ┆IZ]; static char *pager = (c┆ 0x04f200…09e600 68 61 72 20 2a 29 4e 55 4c 4c 3b 0a 0a 20 20 20 20 69 66 20 28 70 61 67 65 72 20 3d 3d 20 28 63 ┆har *)NULL; if (pager == (c┆ 0x04f200…09e600 68 61 72 20 2a 29 4e 55 4c 4c 29 0a 09 69 66 20 28 28 70 61 67 65 72 20 3d 20 67 65 74 65 6e 76 ┆har *)NULL) if ((pager = getenv┆ 0x04f200…09e600 28 22 50 41 47 45 52 22 29 29 20 3d 3d 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 0a 09 20 20 20 ┆("PAGER")) == (char *)NULL) ┆ 0x04f200…09e600 20 70 61 67 65 72 20 3d 20 50 41 47 45 3b 0a 0a 20 20 20 20 69 66 20 28 66 69 6c 65 20 21 3d 20 ┆ pager = PAGE; if (file != ┆ 0x04f200…09e600 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 09 09 2f 2a 20 63 61 6c 6c 65 72 20 67 61 76 65 20 61 20 ┆(char *)NULL) /* caller gave a ┆ 0x04f200…09e600 66 69 6c 65 6e 61 6d 65 3f 20 2a 2f 0a 20 20 20 20 7b 0a 09 69 66 20 28 28 69 66 70 20 3d 20 66 ┆filename? */ { if ((ifp = f┆ 0x04f200…09e600 6f 70 65 6e 28 66 69 6c 65 2c 20 22 72 22 29 29 20 3d 3d 20 28 46 49 4c 45 20 2a 29 4e 55 4c 4c ┆open(file, "r")) == (FILE *)NULL┆ 0x04f200…09e600 29 0a 09 20 20 20 20 72 65 74 75 72 6e 28 46 41 49 4c 29 3b 0a 09 28 76 6f 69 64 29 20 73 70 72 ┆) return(FAIL); (void) spr┆ 0x04f200…09e600 69 6e 74 66 28 62 66 72 2c 20 22 65 78 65 63 20 25 73 20 25 73 22 2c 20 70 61 67 65 72 2c 20 66 ┆intf(bfr, "exec %s %s", pager, f┆ 0x04f200…09e600 69 6c 65 29 3b 0a 09 72 65 74 75 72 6e 28 73 79 73 74 65 6d 28 62 66 72 29 29 3b 20 0a 20 20 20 ┆ile); return(system(bfr)); ┆ 0x04f200…09e600 20 7d 0a 20 20 20 20 65 6c 73 65 20 69 66 20 28 69 66 70 20 21 3d 20 28 46 49 4c 45 20 2a 29 4e ┆ } else if (ifp != (FILE *)N┆ 0x04f200…09e600 55 4c 4c 29 09 2f 2a 20 63 61 6c 6c 65 72 20 67 61 76 65 20 61 20 66 69 6c 65 20 70 6f 69 6e 74 ┆ULL) /* caller gave a file point┆ 0x04f200…09e600 65 72 3f 20 2a 2f 0a 20 20 20 20 7b 0a 09 46 49 4c 45 20 20 20 20 2a 70 66 70 20 3d 20 73 74 64 ┆er? */ { FILE *pfp = std┆ 0x04f200…09e600 6f 75 74 3b 0a 0a 09 2f 2a 20 64 6f 6e 27 74 20 70 75 74 20 75 73 20 74 68 72 6f 75 67 68 20 74 ┆out; /* don't put us through t┆ 0x04f200…09e600 68 65 20 70 61 67 65 72 20 75 6e 6c 65 73 73 20 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a 09 69 66 ┆he pager unless necessary */ if┆ 0x04f200…09e600 20 28 2a 70 61 67 65 72 20 26 26 20 6c 69 6e 65 73 20 3d 3d 20 30 20 7c 7c 20 6c 69 6e 65 73 20 ┆ (*pager && lines == 0 || lines ┆ 0x04f200…09e600 3e 20 50 41 47 45 4d 49 4e 29 0a 09 20 20 20 20 69 66 20 28 28 70 66 70 20 3d 20 70 6f 70 65 6e ┆> PAGEMIN) if ((pfp = popen┆ 0x04f200…09e600 28 70 61 67 65 72 2c 20 22 77 22 29 29 20 3d 3d 20 28 46 49 4c 45 20 2a 29 4e 55 4c 4c 29 0a 09 ┆(pager, "w")) == (FILE *)NULL) ┆ 0x04f200…09e600 09 70 66 70 20 3d 20 73 74 64 6f 75 74 3b 0a 0a 09 77 68 69 6c 65 20 28 66 67 65 74 73 28 62 66 ┆ pfp = stdout; while (fgets(bf┆ 0x04f200…09e600 72 2c 20 73 69 7a 65 6f 66 28 62 66 72 29 2c 20 69 66 70 29 29 0a 09 20 20 20 20 28 76 6f 69 64 ┆r, sizeof(bfr), ifp)) (void┆ 0x04f200…09e600 29 20 66 70 75 74 73 28 62 66 72 2c 20 70 66 70 29 3b 0a 0a 09 69 66 20 28 73 74 72 6e 63 6d 70 ┆) fputs(bfr, pfp); if (strncmp┆ 0x04f200…09e600 28 70 61 67 65 72 2c 20 22 6d 6f 72 65 22 2c 20 34 29 20 3d 3d 20 30 29 09 2f 2a 20 67 61 77 64 ┆(pager, "more", 4) == 0) /* gawd┆ 0x04f200…09e600 2c 20 77 68 61 74 20 61 20 6b 6c 75 67 65 21 20 2a 2f 0a 09 20 20 20 20 28 76 6f 69 64 29 20 66 ┆, what a kluge! */ (void) f┆ 0x04f200…09e600 70 75 74 63 28 27 5c 66 27 2c 20 70 66 70 29 3b 0a 0a 09 69 66 20 28 70 66 70 20 21 3d 20 73 74 ┆putc('\f', pfp); if (pfp != st┆ 0x04f200…09e600 64 6f 75 74 29 0a 09 20 20 20 20 28 76 6f 69 64 29 20 70 63 6c 6f 73 65 28 70 66 70 29 3b 09 0a ┆dout) (void) pclose(pfp); ┆ 0x04f200…09e600 09 72 65 74 75 72 6e 28 53 55 43 43 45 45 44 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 ┆ return(SUCCEED); } else┆ 0x04f200…09e600 0a 09 72 65 74 75 72 6e 28 46 41 49 4c 29 3b 0a 7d 0a 0a 2f 2a 20 6d 6f 72 65 2e 63 20 65 6e 64 ┆ return(FAIL); } /* more.c end┆ 0x04f200…09e600 73 20 68 65 72 65 20 2a 2f 0a 6c 6c 65 72 20 67 61 76 65 20 61 20 66 69 6c 65 20 70 6f 69 6e 74 ┆s here */ ller gave a file point┆ 0x04f200…09e600 65 72 3f 20 2a 2f 0a 20 20 20 20 7b 0a 09 46 49 4c 45 20 20 20 20 2a 70 66 70 20 3d 20 73 74 64 ┆er? */ { FILE *pfp = std┆ 0x04f200…09e600 6f 75 74 3b 0a 0a 09 2f 2a 20 64 6f 6e 27 74 20 70 75 74 20 75 73 20 74 68 72 6f 75 67 68 20 74 ┆out; /* don't put us through t┆ 0x04f200…09e600 68 65 20 70 61 67 65 72 20 75 6e 6c 65 73 73 20 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a 09 69 66 ┆he pager unless necessary */ if┆ 0x04f200…09e600 20 28 2a 70 61 67 65 72 20 26 26 20 6c 69 6e 65 73 20 3d 3d 20 30 20 7c 7c 20 6c 69 6e 65 73 20 ┆ (*pager && lines == 0 || lines ┆ 0x04f200…09e600 3e 20 50 41 47 45 4d 49 4e 29 0a 09 20 20 20 20 69 66 20 28 28 70 66 70 20 3d 20 70 6f 70 65 6e ┆> PAGEMIN) if ((pfp = popen┆ 0x04f200…09e600 28 70 61 67 65 72 2c 20 22 77 22 29 29 20 3d 3d 20 28 46 49 4c 45 20 2a 29 4e 55 4c 4c 29 0a 09 ┆(pager, "w")) == (FILE *)NULL) ┆ 0x04f200…09e600 09 70 66 70 20 3d 20 73 74 64 6f 75 74 3b 0a 0a 09 77 68 69 6c 65 20 28 66 67 65 74 73 28 62 66 ┆ pfp = stdout; while (fgets(bf┆ 0x04f200…09e600 72 2c 20 73 69 7a 65 6f 66 28 62 66 72 29 2c 20 69 66 70 29 29 0a 09 20 20 20 20 28 76 6f 69 64 ┆r, sizeof(bfr), ifp)) (void┆ 0x04f200…09e600 29 20 66 70 75 74 73 28 62 66 72 2c 20 70 66 70 29 3b 0a 0a 09 69 66 20 28 73 74 72 6e 63 6d 70 ┆) fputs(bfr, pfp); if (strncmp┆ 0x04f200…09e600 28 70 61 67 65 72 2c 20 22 6d 6f 72 65 22 2c 20 34 29 20 3d 3d 20 30 29 09 2f 2a 20 67 61 77 64 ┆(pager, "more", 4) == 0) /* gawd┆ 0x04f200…09e600 2c 20 77 68 61 74 20 61 20 6b 6c 75 67 65 21 20 2a 2f 0a 09 20 20 20 20 28 76 6f 69 64 29 20 66 ┆, what a kluge! */ (void) f┆ 0x04f200…09e600 70 75 74 63 28 27 5c 66 27 2c 20 70 66 70 29 3b 0a 0a 09 69 66 20 28 70 66 70 20 21 3d 20 73 74 ┆putc('\f', pfp); if (pfp != st┆ 0x04f200…09e600 64 6f 75 74 29 0a 09 20 20 20 20 28 76 6f 69 64 29 73 72 63 2f 44 2e 70 6f 72 74 2f 6e 6d 61 6c ┆dout) (void)src/D.port/nmal┆ 0x04f200…09e600 6c 6f 63 2e 63 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆loc.c ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆ ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 20 20 20 34 34 34 20 00 20 20 20 ┆ 444 ┆ 0x04f200…09e600 31 34 35 20 00 20 20 20 20 20 31 20 00 20 20 20 20 20 20 36 36 34 37 35 20 20 34 34 35 36 31 37 ┆145 1 66475 445617┆ 0x04f200…09e600 33 31 34 36 20 20 20 37 36 36 30 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆3146 7660 ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆ ┆ […0x9…] 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 23 64 65 66 69 6e 65 20 73 63 72 69 62 62 6c ┆ #define scribbl┆ 0x04f200…09e600 65 63 68 65 63 6b 0a 23 64 65 66 69 6e 65 20 70 75 62 6c 69 63 0a 23 64 65 66 69 6e 65 20 72 63 ┆echeck #define public #define rc┆ 0x04f200…09e600 68 65 63 6b 0a 23 64 65 66 69 6e 65 20 4e 42 55 43 4b 45 54 53 20 33 30 0a 0a 23 69 6e 63 6c 75 ┆heck #define NBUCKETS 30 #inclu┆ 0x04f200…09e600 64 65 20 3c 73 74 64 69 6f 2e 68 3e 0a 23 69 66 64 65 66 20 4d 41 4c 4c 4f 43 5f 44 45 42 55 47 ┆de <stdio.h> #ifdef MALLOC_DEBUG┆ 0x04f200…09e600 0a 23 64 65 66 69 6e 65 20 72 65 67 69 73 74 65 72 0a 23 65 6e 64 69 66 20 4d 41 4c 4c 4f 43 5f ┆ #define register #endif MALLOC_┆ 0x04f200…09e600 44 45 42 55 47 0a 6d 61 6c 6c 6f 63 5f 77 61 72 6e 69 6e 67 28 73 29 0a 20 20 20 20 20 63 68 61 ┆DEBUG malloc_warning(s) cha┆ 0x04f200…09e600 72 20 2a 73 3b 0a 7b 0a 20 20 70 72 69 6e 74 66 28 22 4d 61 6c 6c 6f 63 20 77 61 72 6e 69 6e 67 ┆r *s; { printf("Malloc warning┆ 0x04f200…09e600 3a 20 25 73 5c 6e 22 2c 73 29 3b 0a 7d 0a 0a 62 6f 74 63 68 28 73 29 0a 20 20 20 20 20 63 68 61 ┆: %s\n",s); } botch(s) cha┆ 0x04f200…09e600 72 20 2a 73 3b 0a 7b 0a 20 20 65 78 74 65 72 6e 20 63 68 61 72 20 2a 50 72 6f 67 6e 61 6d 65 3b ┆r *s; { extern char *Progname;┆ 0x04f200…09e600 0a 09 0a 20 20 70 72 69 6e 74 66 28 22 42 6f 74 63 68 3a 20 3c 25 73 3e 20 64 75 6d 70 69 6e 67 ┆ printf("Botch: <%s> dumping┆ 0x04f200…09e600 20 63 6f 72 65 2e 2e 2e 5c 6e 22 2c 73 29 3b 0a 20 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29 ┆ core...\n",s); fflush(stdout)┆ 0x04f200…09e600 3b 0a 20 20 66 66 6c 75 73 68 28 73 74 64 65 72 72 29 3b 0a 20 20 69 66 20 28 21 63 68 64 69 72 ┆; fflush(stderr); if (!chdir┆ 0x04f200…09e600 28 22 2f 75 73 72 2f 73 70 6f 6f 6c 2f 6e 65 77 73 2f 2e 62 61 64 22 29 29 20 7b 0a 09 28 76 6f ┆("/usr/spool/news/.bad")) { (vo┆ 0x04f200…09e600 69 64 29 20 6d 6b 64 69 72 28 50 72 6f 67 6e 61 6d 65 2c 20 30 37 37 37 29 3b 09 2f 2a 20 50 75 ┆id) mkdir(Progname, 0777); /* Pu┆ 0x04f200…09e600 74 20 73 6f 6d 65 20 73 74 72 75 63 74 75 72 65 20 69 6e 74 6f 20 74 68 69 6e 67 73 21 20 2a 2f ┆t some structure into things! */┆ 0x04f200…09e600 0a 09 28 76 6f 69 64 29 20 63 68 64 69 72 28 50 72 6f 67 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a ┆ (void) chdir(Progname); } ┆ 0x04f200…09e600 20 20 61 62 6f 72 74 28 29 3b 0a 7d 0a 0a 2f 2a 20 20 20 43 6f 70 79 72 69 67 68 74 20 28 43 29 ┆ abort(); } /* Copyright (C)┆ 0x04f200…09e600 20 31 39 38 35 20 52 69 63 68 61 72 64 20 4d 2e 20 53 74 61 6c 6c 6d 61 6e 2c 0a 20 20 20 20 62 ┆ 1985 Richard M. Stallman, b┆ 0x04f200…09e600 61 73 65 64 20 6d 6f 73 74 6c 79 20 6f 6e 20 74 68 65 20 70 75 62 6c 69 63 20 64 6f 6d 61 69 6e ┆ased mostly on the public domain┆ 0x04f200…09e600 20 77 6f 72 6b 20 6f 66 20 6f 74 68 65 72 73 2e 0a 0a 54 68 69 73 20 70 72 6f 67 72 61 6d 20 69 ┆ work of others. This program i┆ 0x04f200…09e600 73 20 64 69 73 74 72 69 62 75 74 65 64 20 69 6e 20 74 68 65 20 68 6f 70 65 20 74 68 61 74 20 69 ┆s distributed in the hope that i┆ 0x04f200…09e600 74 20 77 69 6c 6c 20 62 65 20 75 73 65 66 75 6c 2c 0a 62 75 74 20 77 69 74 68 6f 75 74 20 61 6e ┆t will be useful, but without an┆ 0x04f200…09e600 79 20 77 61 72 72 61 6e 74 79 2e 20 20 4e 6f 20 61 75 74 68 6f 72 20 6f 72 20 64 69 73 74 72 69 ┆y warranty. No author or distri┆ 0x04f200…09e600 62 75 74 6f 72 0a 61 63 63 65 70 74 73 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 74 6f 20 ┆butor accepts responsibility to ┆ 0x04f200…09e600 61 6e 79 6f 6e 65 20 66 6f 72 20 74 68 65 20 63 6f 6e 73 65 71 75 65 6e 63 65 73 20 6f 66 20 75 ┆anyone for the consequences of u┆ 0x04f200…09e600 73 69 6e 67 20 69 74 0a 6f 72 20 66 6f 72 20 77 68 65 74 68 65 72 20 69 74 20 73 65 72 76 65 73 ┆sing it or for whether it serves┆ 0x04f200…09e600 20 61 6e 79 20 70 61 72 74 69 63 75 6c 61 72 20 70 75 72 70 6f 73 65 20 6f 72 20 77 6f 72 6b 73 ┆ any particular purpose or works┆ 0x04f200…09e600 20 61 74 20 61 6c 6c 2c 0a 75 6e 6c 65 73 73 20 68 65 20 73 61 79 73 20 73 6f 20 69 6e 20 77 72 ┆ at all, unless he says so in wr┆ 0x04f200…09e600 69 74 69 6e 67 2e 0a 0a 20 20 20 50 65 72 6d 69 73 73 69 6f 6e 20 69 73 20 67 72 61 6e 74 65 64 ┆iting. Permission is granted┆ 0x04f200…09e600 20 74 6f 20 61 6e 79 6f 6e 65 20 74 6f 20 64 69 73 74 72 69 62 75 74 65 20 76 65 72 62 61 74 69 ┆ to anyone to distribute verbati┆ 0x04f200…09e600 6d 20 63 6f 70 69 65 73 0a 20 20 20 6f 66 20 74 68 69 73 20 70 72 6f 67 72 61 6d 27 73 20 73 6f ┆m copies of this program's so┆ 0x04f200…09e600 75 72 63 65 20 63 6f 64 65 20 61 73 20 72 65 63 65 69 76 65 64 2c 20 69 6e 20 61 6e 79 20 6d 65 ┆urce code as received, in any me┆ 0x04f200…09e600 64 69 75 6d 2c 20 70 72 6f 76 69 64 65 64 20 74 68 61 74 0a 20 20 20 74 68 65 20 63 6f 70 79 72 ┆dium, provided that the copyr┆ 0x04f200…09e600 69 67 68 74 20 6e 6f 74 69 63 65 2c 20 74 68 65 20 6e 6f 6e 77 61 72 72 61 74 79 20 6e 6f 74 69 ┆ight notice, the nonwarraty noti┆ 0x04f200…09e600 63 65 20 61 62 6f 76 65 0a 20 20 20 61 6e 64 20 74 68 69 73 20 70 65 72 6d 69 73 73 69 6f 6e 20 ┆ce above and this permission ┆ 0x04f200…09e600 6e 6f 74 69 63 65 20 61 72 65 20 70 72 65 73 65 72 76 65 64 2c 0a 20 20 20 61 6e 64 20 74 68 61 ┆notice are preserved, and tha┆ 0x04f200…09e600 74 20 74 68 65 20 64 69 73 74 72 69 62 75 74 6f 72 20 67 72 61 6e 74 73 20 74 68 65 20 72 65 63 ┆t the distributor grants the rec┆ 0x04f200…09e600 69 70 69 65 6e 74 20 61 6c 6c 20 72 69 67 68 74 73 0a 20 20 20 66 6f 72 20 66 75 72 74 68 65 72 ┆ipient all rights for further┆ 0x04f200…09e600 20 72 65 64 69 73 74 72 69 62 75 74 69 6f 6e 20 61 73 20 70 65 72 6d 69 74 74 65 64 20 62 79 20 ┆ redistribution as permitted by ┆ 0x04f200…09e600 74 68 69 73 20 6e 6f 74 69 63 65 2c 0a 20 20 20 61 6e 64 20 69 6e 66 6f 72 6d 73 20 68 69 6d 20 ┆this notice, and informs him ┆ 0x04f200…09e600 6f 66 20 74 68 65 73 65 20 72 69 67 68 74 73 2e 0a 0a 20 20 20 50 65 72 6d 69 73 73 69 6f 6e 20 ┆of these rights. Permission ┆ 0x04f200…09e600 69 73 20 67 72 61 6e 74 65 64 20 74 6f 20 64 69 73 74 72 69 62 75 74 65 20 6d 6f 64 69 66 69 65 ┆is granted to distribute modifie┆ 0x04f200…09e600 64 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 69 73 0a 20 20 20 70 72 6f 67 72 61 6d 27 73 20 ┆d versions of this program's ┆ 0x04f200…09e600 73 6f 75 72 63 65 20 63 6f 64 65 2c 20 6f 72 20 6f 66 20 70 6f 72 74 69 6f 6e 73 20 6f 66 20 69 ┆source code, or of portions of i┆ 0x04f200…09e600 74 2c 20 75 6e 64 65 72 20 74 68 65 20 61 62 6f 76 65 0a 20 20 20 63 6f 6e 64 69 74 69 6f 6e 73 ┆t, under the above conditions┆ 0x04f200…09e600 2c 20 70 6c 75 73 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 74 68 61 74 20 61 6c 6c 20 63 ┆, plus the conditions that all c┆ 0x04f200…09e600 68 61 6e 67 65 64 20 66 69 6c 65 73 20 63 61 72 72 79 0a 20 20 20 70 72 6f 6d 69 6e 65 6e 74 20 ┆hanged files carry prominent ┆ 0x04f200…09e600 6e 6f 74 69 63 65 73 20 73 74 61 74 69 6e 67 20 77 68 6f 20 6c 61 73 74 20 63 68 61 6e 67 65 64 ┆notices stating who last changed┆ 0x04f200…09e600 20 74 68 65 6d 20 61 6e 64 20 74 68 61 74 20 74 68 65 0a 20 20 20 64 65 72 69 76 65 64 20 6d 61 ┆ them and that the derived ma┆ 0x04f200…09e600 74 65 72 69 61 6c 2c 20 69 6e 63 6c 75 64 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 70 61 63 6b 61 ┆terial, including anything packa┆ 0x04f200…09e600 67 65 64 20 74 6f 67 65 74 68 65 72 20 77 69 74 68 20 69 74 20 61 6e 64 0a 20 20 20 63 6f 6e 63 ┆ged together with it and conc┆ 0x04f200…09e600 65 70 74 75 61 6c 6c 79 20 66 75 6e 63 74 69 6f 6e 69 6e 67 20 61 73 20 61 20 6d 6f 64 69 66 69 ┆eptually functioning as a modifi┆ 0x04f200…09e600 63 61 74 69 6f 6e 20 6f 66 20 69 74 20 72 61 74 68 65 72 20 74 68 61 6e 20 61 6e 0a 20 20 20 61 ┆cation of it rather than an a┆ 0x04f200…09e600 70 70 6c 69 63 61 74 69 6f 6e 20 6f 66 20 69 74 2c 20 69 73 20 69 6e 20 69 74 73 20 65 6e 74 69 ┆pplication of it, is in its enti┆ 0x04f200…09e600 72 65 74 79 20 73 75 62 6a 65 63 74 20 74 6f 20 61 20 70 65 72 6d 69 73 73 69 6f 6e 0a 20 20 20 ┆rety subject to a permission ┆ 0x04f200…09e600 6e 6f 74 69 63 65 20 69 64 65 6e 74 69 63 61 6c 20 74 6f 20 74 68 69 73 20 6f 6e 65 2e 0a 0a 20 ┆notice identical to this one. ┆ 0x04f200…09e600 20 20 50 65 72 6d 69 73 73 69 6f 6e 20 69 73 20 67 72 61 6e 74 65 64 20 74 6f 20 64 69 73 74 72 ┆ Permission is granted to distr┆ 0x04f200…09e600 69 62 75 74 65 20 74 68 69 73 20 70 72 6f 67 72 61 6d 20 28 76 65 72 62 61 74 69 6d 20 6f 72 0a ┆ibute this program (verbatim or ┆ 0x04f200…09e600 20 20 20 61 73 20 6d 6f 64 69 66 69 65 64 29 20 69 6e 20 63 6f 6d 70 69 6c 65 64 20 6f 72 20 65 ┆ as modified) in compiled or e┆ 0x04f200…09e600 78 65 63 75 74 61 62 6c 65 20 66 6f 72 6d 2c 20 70 72 6f 76 69 64 65 64 20 76 65 72 62 61 74 69 ┆xecutable form, provided verbati┆ 0x04f200…09e600 6d 0a 20 20 20 72 65 64 69 73 74 72 69 62 75 74 69 6f 6e 20 69 73 20 70 65 72 6d 69 74 74 65 64 ┆m redistribution is permitted┆ 0x04f200…09e600 20 61 73 20 73 74 61 74 65 64 20 61 62 6f 76 65 20 66 6f 72 20 73 6f 75 72 63 65 20 63 6f 64 65 ┆ as stated above for source code┆ 0x04f200…09e600 2c 20 61 6e 64 0a 20 20 20 20 41 2e 20 20 69 74 20 69 73 20 61 63 63 6f 6d 70 61 6e 69 65 64 20 ┆, and A. it is accompanied ┆ 0x04f200…09e600 62 79 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 6d 61 63 68 69 6e 65 2d 72 65 61 ┆by the corresponding machine-rea┆ 0x04f200…09e600 64 61 62 6c 65 0a 20 20 20 20 20 20 73 6f 75 72 63 65 20 63 6f 64 65 2c 20 75 6e 64 65 72 20 74 ┆dable source code, under t┆ 0x04f200…09e600 68 65 20 61 62 6f 76 65 20 63 6f 6e 64 69 74 69 6f 6e 73 2c 20 6f 72 0a 20 20 20 20 42 2e 20 20 ┆he above conditions, or B. ┆ 0x04f200…09e600 69 74 20 69 73 20 61 63 63 6f 6d 70 61 6e 69 65 64 20 62 79 20 61 20 77 72 69 74 74 65 6e 20 6f ┆it is accompanied by a written o┆ 0x04f200…09e600 66 66 65 72 2c 20 77 69 74 68 20 6e 6f 20 74 69 6d 65 20 6c 69 6d 69 74 2c 0a 20 20 20 20 20 20 ┆ffer, with no time limit, ┆ 0x04f200…09e600 74 6f 20 64 69 73 74 72 69 62 75 74 65 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 ┆to distribute the corresponding ┆ 0x04f200…09e600 6d 61 63 68 69 6e 65 2d 72 65 61 64 61 62 6c 65 20 73 6f 75 72 63 65 20 63 6f 64 65 2c 0a 20 20 ┆machine-readable source code, ┆ 0x04f200…09e600 20 20 20 20 75 6e 64 65 72 20 74 68 65 20 61 62 6f 76 65 20 63 6f 6e 64 69 74 69 6f 6e 73 2c 20 ┆ under the above conditions, ┆ 0x04f200…09e600 74 6f 20 61 6e 79 20 6f 6e 65 2c 20 69 6e 20 72 65 74 75 72 6e 20 66 6f 72 20 72 65 69 6d 62 75 ┆to any one, in return for reimbu┆ 0x04f200…09e600 72 73 65 6d 65 6e 74 0a 20 20 20 20 20 20 6f 66 20 74 68 65 20 63 6f 73 74 20 6f 66 20 64 69 73 ┆rsement of the cost of dis┆ 0x04f200…09e600 74 72 69 62 75 74 69 6f 6e 2e 20 20 20 56 65 72 62 61 74 69 6d 20 72 65 64 69 73 74 72 69 62 75 ┆tribution. Verbatim redistribu┆ 0x04f200…09e600 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 77 72 69 74 74 65 6e 20 6f 66 66 65 72 20 ┆tion of the written offer ┆ 0x04f200…09e600 6d 75 73 74 20 62 65 20 70 65 72 6d 69 74 74 65 64 2e 20 20 4f 72 2c 0a 20 20 20 20 43 2e 20 20 ┆must be permitted. Or, C. ┆ 0x04f200…09e600 69 74 20 69 73 20 64 69 73 74 72 69 62 75 74 65 64 20 62 79 20 73 6f 6d 65 6f 6e 65 20 77 68 6f ┆it is distributed by someone who┆ 0x04f200…09e600 20 72 65 63 65 69 76 65 64 20 6f 6e 6c 79 20 74 68 65 0a 20 20 20 20 20 20 63 6f 6d 70 69 6c 65 ┆ received only the compile┆ 0x04f200…09e600 64 20 6f 72 20 65 78 65 63 75 74 61 62 6c 65 20 66 6f 72 6d 2c 20 61 6e 64 20 69 73 20 61 63 63 ┆d or executable form, and is acc┆ 0x04f200…09e600 6f 6d 70 61 6e 69 65 64 20 62 79 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 ┆ompanied by a copy of the ┆ 0x04f200…09e600 77 72 69 74 74 65 6e 20 6f 66 66 65 72 20 6f 66 20 73 6f 75 72 63 65 20 63 6f 64 65 20 77 68 69 ┆written offer of source code whi┆ 0x04f200…09e600 63 68 20 68 65 20 72 65 63 65 69 76 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 69 74 2e 0a 0a 20 ┆ch he received along with it. ┆ 0x04f200…09e600 20 20 50 65 72 6d 69 73 73 69 6f 6e 20 69 73 20 67 72 61 6e 74 65 64 20 74 6f 20 64 69 73 74 72 ┆ Permission is granted to distr┆ 0x04f200…09e600 69 62 75 74 65 20 74 68 69 73 20 70 72 6f 67 72 61 6d 20 28 76 65 72 62 61 74 69 6d 20 6f 72 20 ┆ibute this program (verbatim or ┆ 0x04f200…09e600 61 73 20 6d 6f 64 69 66 69 65 64 29 0a 20 20 20 69 6e 20 65 78 65 63 75 74 61 62 6c 65 20 66 6f ┆as modified) in executable fo┆ 0x04f200…09e600 72 6d 20 61 73 20 70 61 72 74 20 6f 66 20 61 20 6c 61 72 67 65 72 20 73 79 73 74 65 6d 20 70 72 ┆rm as part of a larger system pr┆ 0x04f200…09e600 6f 76 69 64 65 64 20 74 68 61 74 20 74 68 65 20 73 6f 75 72 63 65 0a 20 20 20 63 6f 64 65 20 66 ┆ovided that the source code f┆ 0x04f200…09e600 6f 72 20 74 68 69 73 20 70 72 6f 67 72 61 6d 2c 20 69 6e 63 6c 75 64 69 6e 67 20 61 6e 79 20 6d ┆or this program, including any m┆ 0x04f200…09e600 6f 64 69 66 69 63 61 74 69 6f 6e 73 20 75 73 65 64 2c 0a 20 20 20 69 73 20 61 6c 73 6f 20 64 69 ┆odifications used, is also di┆ 0x04f200…09e600 73 74 72 69 62 75 74 65 64 20 6f 72 20 6f 66 66 65 72 65 64 20 61 73 20 73 74 61 74 65 64 20 69 ┆stributed or offered as stated i┆ 0x04f200…09e600 6e 20 74 68 65 20 70 72 65 63 65 64 69 6e 67 20 70 61 72 61 67 72 61 70 68 2e 0a 0a 49 6e 20 6f ┆n the preceding paragraph. In o┆ 0x04f200…09e600 74 68 65 72 20 77 6f 72 64 73 2c 20 79 6f 75 20 61 72 65 20 77 65 6c 63 6f 6d 65 20 74 6f 20 75 ┆ther words, you are welcome to u┆ 0x04f200…09e600 73 65 2c 20 73 68 61 72 65 20 61 6e 64 20 69 6d 70 72 6f 76 65 20 74 68 69 73 20 70 72 6f 67 72 ┆se, share and improve this progr┆ 0x04f200…09e600 61 6d 2e 0a 59 6f 75 20 61 72 65 20 66 6f 72 62 69 64 64 65 6e 20 74 6f 20 66 6f 72 62 69 64 20 ┆am. You are forbidden to forbid ┆ 0x04f200…09e600 61 6e 79 6f 6e 65 20 65 6c 73 65 20 74 6f 20 75 73 65 2c 20 73 68 61 72 65 20 61 6e 64 20 69 6d ┆anyone else to use, share and im┆ 0x04f200…09e600 70 72 6f 76 65 0a 77 68 61 74 20 79 6f 75 20 67 69 76 65 20 74 68 65 6d 2e 20 20 20 48 65 6c 70 ┆prove what you give them. Help┆ 0x04f200…09e600 20 73 74 61 6d 70 20 6f 75 74 20 73 6f 66 74 77 61 72 65 2d 68 6f 61 72 64 69 6e 67 21 20 20 2a ┆ stamp out software-hoarding! *┆ 0x04f200…09e600 2f 0a 0c 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆/ /***************************┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆********************************┆ 0x04f200…09e600 2a 2a 2a 2a 2a 0a 20 2a 09 09 09 09 09 09 09 09 2a 0a 20 2a 09 09 48 65 6c 70 66 75 6c 20 68 69 ┆***** * * * Helpful hi┆ 0x04f200…09e600 73 74 6f 72 69 63 61 6c 20 63 6f 6d 6d 65 6e 74 73 09 09 09 2a 0a 20 2a 09 09 09 09 09 09 09 09 ┆storical comments * * ┆ 0x04f200…09e600 2a 0a 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆* *****************************┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆********************************┆ 0x04f200…09e600 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 20 40 28 23 29 6e 6d 61 6c 6c 6f 63 2e 63 20 31 20 28 43 61 6c ┆***/ /* * @(#)nmalloc.c 1 (Cal┆ 0x04f200…09e600 74 65 63 68 29 20 32 2f 32 31 2f 38 32 0a 20 2a 0a 20 2a 09 55 20 6f 66 20 4d 20 4d 6f 64 69 66 ┆tech) 2/21/82 * * U of M Modif┆ 0x04f200…09e600 69 65 64 3a 20 32 30 20 4a 75 6e 20 31 39 38 33 20 41 43 54 3a 20 73 74 72 61 6e 67 65 20 68 61 ┆ied: 20 Jun 1983 ACT: strange ha┆ 0x04f200…09e600 63 6b 73 20 66 6f 72 20 45 6d 61 63 73 0a 20 2a 0a 20 2a 09 4e 6f 76 20 31 39 38 33 2c 20 4d 69 ┆cks for Emacs * * Nov 1983, Mi┆ 0x04f200…09e600 6b 65 40 42 52 4c 2c 20 41 64 64 65 64 20 73 75 70 70 6f 72 74 20 66 6f 72 20 34 2e 31 43 2f 34 ┆ke@BRL, Added support for 4.1C/4┆ 0x04f200…09e600 2e 32 20 42 53 44 2e 0a 20 2a 0a 20 2a 20 54 68 69 73 20 69 73 20 61 20 76 65 72 79 20 66 61 73 ┆.2 BSD. * * This is a very fas┆ 0x04f200…09e600 74 20 73 74 6f 72 61 67 65 20 61 6c 6c 6f 63 61 74 6f 72 2e 20 20 49 74 20 61 6c 6c 6f 63 61 74 ┆t storage allocator. It allocat┆ 0x04f200…09e600 65 73 20 62 6c 6f 63 6b 73 20 6f 66 20 61 20 73 6d 61 6c 6c 20 0a 20 2a 20 6e 75 6d 62 65 72 20 ┆es blocks of a small * number ┆ 0x04f200…09e600 6f 66 20 64 69 66 66 65 72 65 6e 74 20 73 69 7a 65 73 2c 20 61 6e 64 20 6b 65 65 70 73 20 66 72 ┆of different sizes, and keeps fr┆ 0x04f200…09e600 65 65 20 6c 69 73 74 73 20 6f 66 20 65 61 63 68 20 73 69 7a 65 2e 20 20 42 6c 6f 63 6b 73 0a 20 ┆ee lists of each size. Blocks ┆ 0x04f200…09e600 2a 20 74 68 61 74 20 64 6f 6e 27 74 20 65 78 61 63 74 6c 79 20 66 69 74 20 61 72 65 20 70 61 73 ┆* that don't exactly fit are pas┆ 0x04f200…09e600 73 65 64 20 75 70 20 74 6f 20 74 68 65 20 6e 65 78 74 20 6c 61 72 67 65 72 20 73 69 7a 65 2e 20 ┆sed up to the next larger size. ┆ 0x04f200…09e600 20 49 6e 20 74 68 69 73 20 0a 20 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2c 20 74 68 65 ┆ In this * implementation, the┆ 0x04f200…09e600 20 61 76 61 69 6c 61 62 6c 65 20 73 69 7a 65 73 20 61 72 65 20 28 32 5e 6e 29 2d 34 20 28 6f 72 ┆ available sizes are (2^n)-4 (or┆ 0x04f200…09e600 20 2d 31 36 29 20 62 79 74 65 73 20 6c 6f 6e 67 2e 0a 20 2a 20 54 68 69 73 20 69 73 20 64 65 73 ┆ -16) bytes long. * This is des┆ 0x04f200…09e600 69 67 6e 65 64 20 66 6f 72 20 75 73 65 20 69 6e 20 61 20 70 72 6f 67 72 61 6d 20 74 68 61 74 20 ┆igned for use in a program that ┆ 0x04f200…09e600 75 73 65 73 20 76 61 73 74 20 71 75 61 6e 74 69 74 69 65 73 20 6f 66 0a 20 2a 20 6d 65 6d 6f 72 ┆uses vast quantities of * memor┆ 0x04f200…09e600 79 2c 20 62 75 74 20 62 6f 6d 62 73 20 77 68 65 6e 20 69 74 20 72 75 6e 73 20 6f 75 74 2e 20 20 ┆y, but bombs when it runs out. ┆ 0x04f200…09e600 54 6f 20 6d 61 6b 65 20 69 74 20 61 20 6c 69 74 74 6c 65 20 62 65 74 74 65 72 2c 20 69 74 0a 20 ┆To make it a little better, it ┆ 0x04f200…09e600 2a 20 77 61 72 6e 73 20 74 68 65 20 75 73 65 72 20 77 68 65 6e 20 68 65 20 73 74 61 72 74 73 20 ┆* warns the user when he starts ┆ 0x04f200…09e600 74 6f 20 67 65 74 20 6e 65 61 72 20 74 68 65 20 65 6e 64 2e 0a 20 2a 0a 20 2a 20 4a 75 6e 65 20 ┆to get near the end. * * June ┆ 0x04f200…09e600 38 34 2c 20 41 43 54 3a 20 6d 6f 64 69 66 69 65 64 20 72 63 68 65 63 6b 20 63 6f 64 65 20 74 6f ┆84, ACT: modified rcheck code to┆ 0x04f200…09e600 20 63 68 65 63 6b 20 74 68 65 20 72 61 6e 67 65 20 67 69 76 65 6e 20 74 6f 20 6d 61 6c 6c 6f 63 ┆ check the range given to malloc┆ 0x04f200…09e600 2c 0a 20 2a 20 72 61 74 68 65 72 20 74 68 61 6e 20 74 68 65 20 72 61 6e 67 65 20 64 65 74 65 72 ┆, * rather than the range deter┆ 0x04f200…09e600 6d 69 6e 65 64 20 62 79 20 74 68 65 20 32 2d 70 6f 77 65 72 20 75 73 65 64 2e 0a 20 2a 0a 20 2a ┆mined by the 2-power used. * *┆ 0x04f200…09e600 20 4a 61 6e 20 38 35 2c 20 52 4d 53 3a 20 63 61 6c 6c 73 20 6d 61 6c 6c 6f 63 5f 77 61 72 6e 69 ┆ Jan 85, RMS: calls malloc_warni┆ 0x04f200…09e600 6e 67 20 74 6f 20 69 73 73 75 65 20 77 61 72 6e 69 6e 67 20 6f 6e 20 6e 65 61 72 6c 79 20 66 75 ┆ng to issue warning on nearly fu┆ 0x04f200…09e600 6c 6c 2e 0a 20 2a 20 4e 6f 20 6c 6f 6e 67 65 72 20 45 6d 61 63 73 2d 73 70 65 63 69 66 69 63 3b ┆ll. * No longer Emacs-specific;┆ 0x04f200…09e600 20 63 61 6e 20 73 65 72 76 65 20 61 73 20 61 6c 6c 2d 70 75 72 70 6f 73 65 20 6d 61 6c 6c 6f 63 ┆ can serve as all-purpose malloc┆ 0x04f200…09e600 20 66 6f 72 20 47 4e 55 2e 0a 20 2a 20 59 6f 75 20 73 68 6f 75 6c 64 20 63 61 6c 6c 20 6d 61 6c ┆ for GNU. * You should call mal┆ 0x04f200…09e600 6c 6f 63 5f 69 6e 69 74 20 74 6f 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 20 61 66 74 65 72 20 6c ┆loc_init to reinitialize after l┆ 0x04f200…09e600 6f 61 64 69 6e 67 20 64 75 6d 70 65 64 20 45 6d 61 63 73 2e 0a 20 2a 20 43 61 6c 6c 20 6d 61 6c ┆oading dumped Emacs. * Call mal┆ 0x04f200…09e600 6c 6f 63 5f 73 74 61 74 73 20 74 6f 20 67 65 74 20 69 6e 66 6f 20 6f 6e 20 6d 65 6d 6f 72 79 20 ┆loc_stats to get info on memory ┆ 0x04f200…09e600 73 74 61 74 73 20 69 66 20 4d 53 54 41 54 53 20 74 75 72 6e 65 64 20 6f 6e 2e 0a 20 2a 20 72 65 ┆stats if MSTATS turned on. * re┆ 0x04f200…09e600 61 6c 6c 6f 63 20 6b 6e 6f 77 73 20 68 6f 77 20 74 6f 20 72 65 74 75 72 6e 20 73 61 6d 65 20 62 ┆alloc knows how to return same b┆ 0x04f200…09e600 6c 6f 63 6b 20 67 69 76 65 6e 2c 20 6a 75 73 74 20 63 68 61 6e 67 69 6e 67 20 69 74 73 20 73 69 ┆lock given, just changing its si┆ 0x04f200…09e600 7a 65 2c 0a 20 2a 20 69 66 20 74 68 65 20 70 6f 77 65 72 20 6f 66 20 32 20 69 73 20 63 6f 72 72 ┆ze, * if the power of 2 is corr┆ 0x04f200…09e600 65 63 74 2e 0a 20 2a 0a 20 2a 20 4a 61 6e 20 38 36 2c 20 57 44 43 3a 20 52 65 6d 6f 76 65 64 20 ┆ect. * * Jan 86, WDC: Removed ┆ 0x04f200…09e600 45 6d 61 63 73 20 73 70 65 63 69 66 69 63 20 73 74 75 66 66 2c 20 61 6e 64 20 6e 65 61 74 65 6e ┆Emacs specific stuff, and neaten┆ 0x04f200…09e600 65 64 20 61 20 66 65 77 20 63 6f 6d 6d 65 6e 74 73 2e 0a 20 2a 0a 20 2a 20 4d 61 72 63 68 20 38 ┆ed a few comments. * * March 8┆ 0x04f200…09e600 36 20 57 44 43 3a 20 41 64 64 65 64 20 69 6e 20 63 6f 64 65 20 62 79 20 45 69 63 68 69 6e 20 66 ┆6 WDC: Added in code by Eichin f┆ 0x04f200…09e600 6f 72 20 53 63 72 69 62 62 6c 65 20 63 68 65 63 6b 69 6e 67 20 6f 66 20 62 6c 6f 63 6b 73 0a 20 ┆or Scribble checking of blocks ┆ 0x04f200…09e600 2a 20 53 63 72 69 62 62 6c 65 20 63 68 65 63 6b 20 77 72 69 74 65 73 20 61 20 6b 6e 6f 77 6e 20 ┆* Scribble check writes a known ┆ 0x04f200…09e600 70 61 74 74 65 72 6e 20 69 6e 74 6f 20 74 68 65 20 66 72 65 65 20 62 6c 6f 63 6b 73 2c 20 63 68 ┆pattern into the free blocks, ch┆ 0x04f200…09e600 65 63 6b 73 20 69 74 0a 20 2a 20 74 6f 20 73 65 65 20 69 66 20 69 74 20 69 73 20 73 74 69 6c 6c ┆ecks it * to see if it is still┆ 0x04f200…09e600 20 75 6e 64 61 6d 61 67 65 64 20 62 65 66 6f 72 65 20 61 6c 6c 6f 63 61 74 69 6e 67 20 69 74 2e ┆ undamaged before allocating it.┆ 0x04f200…09e600 20 20 49 74 20 77 72 69 74 65 73 20 61 0a 20 2a 20 64 69 66 66 65 72 65 6e 74 20 70 61 74 74 65 ┆ It writes a * different patte┆ 0x04f200…09e600 72 6e 20 69 6e 74 6f 20 74 68 65 20 73 70 61 63 65 20 62 65 79 6f 6e 64 20 74 68 65 20 65 6e 64 ┆rn into the space beyond the end┆ 0x04f200…09e600 20 6f 66 20 61 6e 20 61 6c 6c 6f 63 61 74 65 64 20 62 6c 6f 63 6b 2c 0a 20 2a 20 61 6e 64 20 74 ┆ of an allocated block, * and t┆ 0x04f200…09e600 65 73 74 73 20 69 74 20 66 6f 72 20 64 61 6d 61 67 65 20 77 68 65 6e 20 65 78 70 61 6e 64 69 6e ┆ests it for damage when expandin┆ 0x04f200…09e600 67 20 74 68 65 20 62 6c 6f 63 6b 27 73 20 62 6f 75 6e 64 73 20 69 6e 20 72 65 61 6c 6c 6f 63 2e ┆g the block's bounds in realloc.┆ 0x04f200…09e600 0a 20 2a 20 4e 6f 74 65 2c 20 74 68 69 73 20 63 68 65 63 6b 20 74 61 6b 65 73 20 2a 54 49 4d 45 ┆ * Note, this check takes *TIME┆ 0x04f200…09e600 2a 20 61 6e 64 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63 6f 6d 70 69 6c 65 64 20 69 6e 20 ┆* and should not be compiled in ┆ 0x04f200…09e600 62 79 20 64 65 66 61 75 6c 74 2e 0a 20 2a 0a 20 2a 20 41 75 67 20 31 38 20 31 39 38 36 2c 20 4d ┆by default. * * Aug 18 1986, M┆ 0x04f200…09e600 57 45 3a 20 61 64 64 65 64 20 27 70 75 62 6c 69 63 27 20 73 74 75 66 66 20 74 6f 20 61 6c 6c 6f ┆WE: added 'public' stuff to allo┆ 0x04f200…09e600 77 20 6d 61 6b 65 64 65 63 6c 20 74 6f 20 67 65 6e 65 72 61 74 65 0a 20 2a 20 61 20 6d 61 6c 6c ┆w makedecl to generate * a mall┆ 0x04f200…09e600 6f 63 2e 68 20 66 69 6c 65 2e 0a 20 2a 20 0a 20 2a 20 42 65 72 6b 65 6c 65 79 20 55 4e 49 58 20 ┆oc.h file. * * Berkeley UNIX ┆ 0x04f200…09e600 34 2e 33 20 68 61 73 20 61 20 73 74 6f 72 61 67 65 20 61 6c 6c 6f 63 61 74 6f 72 20 74 68 61 74 ┆4.3 has a storage allocator that┆ 0x04f200…09e600 20 73 68 61 72 65 73 20 61 20 63 6f 6d 6d 6f 6e 0a 20 2a 20 61 6e 63 65 73 74 6f 72 20 77 69 74 ┆ shares a common * ancestor wit┆ 0x04f200…09e600 68 20 74 68 69 73 20 6f 6e 65 2e 20 20 49 74 20 68 61 6e 64 6c 65 73 20 72 65 61 6c 6c 6f 63 20 ┆h this one. It handles realloc ┆ 0x04f200…09e600 63 6f 6d 70 61 74 69 62 6c 79 20 77 69 74 68 20 74 68 65 0a 20 2a 20 61 72 63 68 61 69 63 20 75 ┆compatibly with the * archaic u┆ 0x04f200…09e600 73 65 20 6f 66 20 72 65 61 6c 6c 6f 63 20 6f 6e 20 61 6e 20 61 6c 72 65 61 64 79 20 66 72 65 65 ┆se of realloc on an already free┆ 0x04f200…09e600 64 20 62 6c 6f 63 6b 20 74 6f 20 22 63 6f 6d 70 61 63 74 22 0a 20 2a 20 73 74 6f 72 61 67 65 2e ┆d block to "compact" * storage.┆ 0x04f200…09e600 20 20 49 74 20 75 73 65 73 20 61 20 70 61 67 65 73 69 7a 65 20 73 79 73 74 65 6d 20 63 61 6c 6c ┆ It uses a pagesize system call┆ 0x04f200…09e600 20 72 61 74 68 65 72 20 74 68 61 6e 20 61 73 73 75 6d 69 6e 67 20 74 68 65 0a 20 2a 20 70 61 67 ┆ rather than assuming the * pag┆ 0x04f200…09e600 65 20 73 69 7a 65 20 69 73 20 31 30 32 34 20 62 79 74 65 73 2e 20 20 46 69 6e 61 6c 6c 79 20 69 ┆e size is 1024 bytes. Finally i┆ 0x04f200…09e600 74 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 61 74 20 61 20 66 72 65 65 64 20 62 6c 6f 63 6b 0a ┆t guarantees that a freed block ┆ 0x04f200…09e600 20 2a 20 69 73 20 6e 6f 74 20 6d 75 6e 67 65 64 20 62 79 20 74 68 65 20 61 6c 6c 6f 63 61 74 6f ┆ * is not munged by the allocato┆ 0x04f200…09e600 72 20 69 74 73 65 6c 66 2c 20 69 6e 63 61 73 65 20 73 6f 6d 65 6f 6e 65 20 77 61 6e 74 73 20 74 ┆r itself, incase someone wants t┆ 0x04f200…09e600 6f 20 66 69 64 64 6c 65 0a 20 2a 20 77 69 74 68 20 66 72 65 65 64 20 73 70 61 63 65 20 61 66 74 ┆o fiddle * with freed space aft┆ 0x04f200…09e600 65 72 20 66 72 65 65 69 6e 67 20 69 74 20 62 75 74 20 62 65 66 6f 72 65 20 61 6c 6c 6f 63 61 74 ┆er freeing it but before allocat┆ 0x04f200…09e600 69 6e 67 20 6d 6f 72 65 2e 0a 20 2a 0a 20 2a 20 54 68 69 73 20 70 61 72 74 69 63 75 6c 61 72 20 ┆ing more. * * This particular ┆ 0x04f200…09e600 73 74 6f 72 61 67 65 20 61 6c 6c 6f 63 61 74 6f 72 20 77 6f 75 6c 64 20 62 65 6e 65 66 69 74 20 ┆storage allocator would benefit ┆ 0x04f200…09e600 66 72 6f 6d 20 68 61 76 69 6e 67 20 61 0a 20 2a 20 6e 6f 6e 2d 68 61 72 64 77 69 72 65 64 20 70 ┆from having a * non-hardwired p┆ 0x04f200…09e600 61 67 65 73 69 7a 65 2e 20 20 42 75 74 20 62 65 63 61 75 73 65 20 6f 66 20 74 68 65 20 73 63 72 ┆agesize. But because of the scr┆ 0x04f200…09e600 69 62 62 6c 65 20 63 68 65 63 6b 20 69 74 20 77 6f 75 6c 64 0a 20 2a 20 6e 6f 74 20 62 65 20 75 ┆ibble check it would * not be u┆ 0x04f200…09e600 73 65 66 75 6c 20 74 6f 20 6b 65 65 70 20 74 68 65 20 66 72 65 65 20 70 6f 69 6e 74 65 72 20 69 ┆seful to keep the free pointer i┆ 0x04f200…09e600 6e 20 74 68 65 20 68 65 61 64 65 72 2e 20 20 53 4f 3a 20 57 68 65 6e 20 79 6f 75 0a 20 2a 20 66 ┆n the header. SO: When you * f┆ 0x04f200…09e600 72 65 65 20 73 6f 6d 65 74 68 69 6e 67 20 61 6c 6c 6f 63 61 74 65 64 20 77 69 74 68 20 74 68 69 ┆ree something allocated with thi┆ 0x04f200…09e600 73 20 61 6c 6c 6f 63 61 74 6f 72 2c 20 44 4f 4e 54 20 54 52 59 20 54 4f 20 55 53 45 20 49 54 2e ┆s allocator, DONT TRY TO USE IT.┆ 0x04f200…09e600 0a 20 2a 20 49 74 20 69 73 20 47 55 41 52 41 4e 54 45 45 44 20 74 6f 20 62 65 20 64 61 6d 61 67 ┆ * It is GUARANTEED to be damag┆ 0x04f200…09e600 65 64 20 62 79 20 74 68 65 20 66 72 65 65 69 6e 67 20 70 72 6f 63 65 73 73 2e 0a 20 2a 0a 20 2a ┆ed by the freeing process. * *┆ 0x04f200…09e600 20 46 6f 72 20 69 6e 74 65 72 66 61 63 69 6e 67 20 74 6f 20 73 79 73 74 65 6d 73 20 74 68 61 74 ┆ For interfacing to systems that┆ 0x04f200…09e600 20 77 61 6e 74 20 74 6f 20 62 65 20 61 62 6c 65 20 74 6f 20 61 73 6b 20 74 68 65 20 73 69 7a 65 ┆ want to be able to ask the size┆ 0x04f200…09e600 20 6f 66 0a 20 2a 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 62 6c 6f 63 6b 2c 20 72 61 74 68 ┆ of * the allocated block, rath┆ 0x04f200…09e600 65 72 20 74 68 61 6e 20 72 65 6d 65 6d 62 65 72 69 6e 67 20 69 74 2c 20 74 68 65 20 6d 5f 62 6c ┆er than remembering it, the m_bl┆ 0x04f200…09e600 6f 63 6b 73 69 7a 65 0a 20 2a 20 66 75 6e 63 74 69 6f 6e 2c 20 72 69 70 73 20 6f 70 65 6e 20 74 ┆ocksize * function, rips open t┆ 0x04f200…09e600 68 65 20 62 6c 6f 63 6b 20 61 6e 64 20 74 65 6c 6c 73 20 79 6f 75 20 68 6f 77 20 62 69 67 20 69 ┆he block and tells you how big i┆ 0x04f200…09e600 74 20 69 73 2e 20 20 54 68 65 20 73 69 7a 65 0a 20 2a 20 72 65 74 75 72 6e 65 64 20 69 73 20 6e ┆t is. The size * returned is n┆ 0x04f200…09e600 62 79 74 65 73 2c 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61 73 6b 65 64 ┆bytes, the number of bytes asked┆ 0x04f200…09e600 20 66 6f 72 2c 20 4e 4f 54 20 74 68 65 20 61 63 74 75 61 6c 0a 20 2a 20 61 6d 6f 75 6e 74 20 6f ┆ for, NOT the actual * amount o┆ 0x04f200…09e600 66 20 73 70 61 63 65 20 69 6e 20 74 68 65 20 62 6c 6f 63 6b 2e 0a 20 2a 0a 20 2a 20 54 68 69 73 ┆f space in the block. * * This┆ 0x04f200…09e600 20 6d 61 6c 6c 6f 63 20 61 6c 73 6f 20 68 61 73 20 61 20 68 6f 72 72 69 62 6c 65 20 62 75 74 20 ┆ malloc also has a horrible but ┆ 0x04f200…09e600 76 65 72 79 20 75 73 65 66 75 6c 20 68 61 63 6b 20 77 68 69 63 68 20 63 61 6e 20 62 65 0a 20 2a ┆very useful hack which can be *┆ 0x04f200…09e600 20 65 6e 61 62 6c 65 64 20 62 79 20 64 65 66 69 6e 65 64 20 4d 41 4c 4c 4f 43 5f 44 45 42 55 47 ┆ enabled by defined MALLOC_DEBUG┆ 0x04f200…09e600 2e 20 20 54 68 69 73 20 63 61 75 73 65 73 20 6d 61 6c 6c 6f 63 20 74 6f 20 6b 65 65 70 20 74 72 ┆. This causes malloc to keep tr┆ 0x04f200…09e600 61 63 6b 0a 20 2a 20 6f 66 20 77 68 6f 20 72 65 71 75 65 73 74 65 64 20 61 20 70 61 72 74 69 63 ┆ack * of who requested a partic┆ 0x04f200…09e600 75 6c 61 72 20 62 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f 72 79 20 74 6f 20 62 65 20 6d 61 6c 6c 6f ┆ular block of memory to be mallo┆ 0x04f200…09e600 63 27 65 64 20 6f 72 0a 20 2a 20 66 72 65 65 27 65 64 2e 20 20 41 20 64 75 6d 70 20 66 75 6e 63 ┆c'ed or * free'ed. A dump func┆ 0x04f200…09e600 74 69 6f 6e 20 28 77 68 69 63 68 20 69 73 20 75 73 75 61 6c 6c 79 20 63 61 6c 6c 65 64 20 66 72 ┆tion (which is usually called fr┆ 0x04f200…09e600 6f 6d 20 61 20 73 69 67 6e 61 6c 0a 20 2a 20 68 61 6e 64 6c 65 72 29 20 77 69 6c 6c 20 74 68 65 ┆om a signal * handler) will the┆ 0x04f200…09e600 6e 20 70 72 69 6e 74 20 6f 75 74 20 77 68 61 74 20 61 6c 6c 20 74 68 65 20 62 6c 6f 63 6b 73 20 ┆n print out what all the blocks ┆ 0x04f200…09e600 6f 66 20 6d 65 6d 6f 72 79 20 61 6e 64 20 77 68 6f 0a 20 2a 20 6c 61 73 74 20 6d 61 6c 6c 6f 63 ┆of memory and who * last malloc┆ 0x04f200…09e600 27 65 64 20 6f 72 20 66 72 65 65 27 65 64 20 69 74 2e 20 20 49 74 20 61 63 63 6f 6d 70 6c 69 73 ┆'ed or free'ed it. It accomplis┆ 0x04f200…09e600 68 65 73 20 74 68 69 73 20 66 65 61 74 20 62 79 20 6f 70 65 6e 69 6e 67 0a 20 2a 20 74 68 65 20 ┆hes this feat by opening * the ┆ 0x04f200…09e600 62 69 6e 61 72 79 20 61 6e 64 20 67 72 6f 76 65 6c 69 6e 67 20 6f 76 65 72 20 74 68 65 20 73 79 ┆binary and groveling over the sy┆ 0x04f200…09e600 6d 62 6f 6c 20 74 61 62 6c 65 2e 20 20 54 68 75 73 2c 20 74 68 69 73 20 69 73 20 6e 6f 74 0a 20 ┆mbol table. Thus, this is not ┆ 0x04f200…09e600 2a 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 77 6f 72 6b 20 61 63 72 6f 73 73 20 61 6c 6c 20 ┆* guaranteed to work across all ┆ 0x04f200…09e600 73 79 73 74 65 6d 73 2e 20 20 49 74 20 77 69 6c 6c 20 77 6f 72 6b 20 6f 6e 20 42 53 44 20 34 2e ┆systems. It will work on BSD 4.┆ 0x04f200…09e600 5b 32 33 5d 0a 20 2a 20 73 79 73 74 65 6d 73 2c 20 68 6f 77 65 76 65 72 2e 0a 20 2a 2f 0a 0c 0a ┆[23] * systems, however. */ ┆ 0x04f200…09e600 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆/*******************************┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆********************************┆ 0x04f200…09e600 2a 0a 20 2a 09 09 09 09 09 09 09 09 2a 0a 20 2a 09 20 49 6e 63 6c 75 64 65 73 2c 20 64 65 63 6c ┆* * * * Includes, decl┆ 0x04f200…09e600 61 72 61 74 69 6f 6e 73 2c 20 61 6e 64 20 64 65 66 69 6e 69 74 69 6f 6e 73 09 09 2a 0a 20 2a 09 ┆arations, and definitions * * ┆ 0x04f200…09e600 09 09 09 09 09 09 09 2a 0a 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆ * **********************┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆********************************┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 6e 6d 61 6c 6c 6f 63 2e 68 22 ┆**********/ #include "nmalloc.h"┆ 0x04f200…09e600 0a 23 69 66 6e 64 65 66 20 70 75 62 6c 69 63 0a 23 64 65 66 69 6e 65 20 4e 65 77 28 54 59 50 45 ┆ #ifndef public #define New(TYPE┆ 0x04f200…09e600 29 20 28 28 54 59 50 45 20 2a 29 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 54 59 50 45 29 29 29 ┆) ((TYPE *)malloc(sizeof(TYPE)))┆ 0x04f200…09e600 0a 23 65 6e 64 69 66 20 70 75 62 6c 69 63 0a 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 77 68 69 63 ┆ #endif public /* Determine whic┆ 0x04f200…09e600 68 20 6b 69 6e 64 20 6f 66 20 73 79 73 74 65 6d 20 74 68 69 73 20 69 73 2e 20 20 2a 2f 0a 23 69 ┆h kind of system this is. */ #i┆ 0x04f200…09e600 6e 63 6c 75 64 65 20 3c 73 69 67 6e 61 6c 2e 68 3e 0a 23 69 66 6e 64 65 66 20 53 49 47 54 53 54 ┆nclude <signal.h> #ifndef SIGTST┆ 0x04f200…09e600 50 0a 23 64 65 66 69 6e 65 20 55 53 47 0a 23 65 6c 73 65 20 2f 2a 20 53 49 47 54 53 54 50 20 2a ┆P #define USG #else /* SIGTSTP *┆ 0x04f200…09e600 2f 0a 23 69 66 64 65 66 20 53 49 47 49 4f 0a 23 64 65 66 69 6e 65 20 42 53 44 34 32 0a 23 65 6e ┆/ #ifdef SIGIO #define BSD42 #en┆ 0x04f200…09e600 64 69 66 20 2f 2a 20 53 49 47 49 4f 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 53 49 47 54 53 54 ┆dif /* SIGIO */ #endif /* SIGTST┆ 0x04f200…09e600 50 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 42 53 44 34 32 0a 23 69 66 6e 64 65 66 20 55 53 47 0a ┆P */ #ifndef BSD42 #ifndef USG ┆ 0x04f200…09e600 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 76 6c 69 6d 69 74 2e 68 3e 09 09 2f 2a 20 77 61 72 6e ┆#include <sys/vlimit.h> /* warn┆ 0x04f200…09e600 20 74 68 65 20 75 73 65 72 20 77 68 65 6e 20 6e 65 61 72 20 74 68 65 20 65 6e 64 20 2a 2f 0a 23 ┆ the user when near the end */ #┆ 0x04f200…09e600 65 6e 64 69 66 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 42 53 44 34 32 20 2a 2f 0a 23 69 6e 63 6c ┆endif #else /* if BSD42 */ #incl┆ 0x04f200…09e600 75 64 65 20 3c 73 79 73 2f 74 69 6d 65 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 72 ┆ude <sys/time.h> #include <sys/r┆ 0x04f200…09e600 65 73 6f 75 72 63 65 2e 68 3e 0a 23 65 6e 64 69 66 20 2f 2a 20 42 53 44 34 32 20 2a 2f 0a 0a 23 ┆esource.h> #endif /* BSD42 */ #┆ 0x04f200…09e600 69 66 64 65 66 20 73 63 72 69 62 62 6c 65 63 68 65 63 6b 0a 23 64 65 66 69 6e 65 20 72 63 68 65 ┆ifdef scribblecheck #define rche┆ 0x04f200…09e600 63 6b 0a 23 65 6e 64 69 66 20 2f 2a 20 77 65 20 6e 65 65 64 20 74 6f 20 68 61 76 65 20 72 61 6e ┆ck #endif /* we need to have ran┆ 0x04f200…09e600 67 65 20 64 61 74 61 20 74 6f 20 75 73 65 20 62 6c 6f 63 6b 20 62 6f 75 6e 64 61 72 79 20 63 68 ┆ge data to use block boundary ch┆ 0x04f200…09e600 65 63 6b 69 6e 67 20 2a 2f 0a 0a 23 69 66 64 65 66 20 72 63 68 65 63 6b 0a 2f 2a 0a 20 2a 20 54 ┆ecking */ #ifdef rcheck /* * T┆ 0x04f200…09e600 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 72 61 6e 67 65 20 63 68 65 63 6b 69 6e 67 2c 20 77 65 20 77 ┆o implement range checking, we w┆ 0x04f200…09e600 72 69 74 65 20 6d 61 67 69 63 20 76 61 6c 75 65 73 20 69 6e 20 61 74 20 74 68 65 0a 20 2a 20 62 ┆rite magic values in at the * b┆ 0x04f200…09e600 65 67 69 6e 6e 69 6e 67 20 61 6e 64 20 65 6e 64 20 6f 66 20 65 61 63 68 20 61 6c 6c 6f 63 61 74 ┆eginning and end of each allocat┆ 0x04f200…09e600 65 64 20 62 6c 6f 63 6b 2c 20 61 6e 64 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 79 0a 20 2a 20 ┆ed block, and make sure they * ┆ 0x04f200…09e600 61 72 65 20 75 6e 64 69 73 74 75 72 62 65 64 20 77 68 65 6e 65 76 65 72 20 61 20 66 72 65 65 20 ┆are undisturbed whenever a free ┆ 0x04f200…09e600 6f 72 20 61 20 72 65 61 6c 6c 6f 63 20 6f 63 63 75 72 73 2e 0a 20 2a 2f 0a 0a 2f 2a 20 57 72 69 ┆or a realloc occurs. */ /* Wri┆ 0x04f200…09e600 74 74 65 6e 20 69 6e 20 65 61 63 68 20 6f 66 20 74 68 65 20 34 20 62 79 74 65 73 20 66 6f 6c 6c ┆tten in each of the 4 bytes foll┆ 0x04f200…09e600 6f 77 69 6e 67 20 74 68 65 20 62 6c 6f 63 6b 27 73 20 72 65 61 6c 20 73 70 61 63 65 20 2a 2f 0a ┆owing the block's real space */ ┆ 0x04f200…09e600 23 64 65 66 69 6e 65 20 4d 41 47 49 43 31 20 30 78 35 35 0a 23 64 65 66 69 6e 65 20 4d 41 47 49 ┆#define MAGIC1 0x55 #define MAGI┆ 0x04f200…09e600 43 46 52 45 45 20 30 78 36 39 09 09 2f 2a 20 30 31 31 30 20 31 30 30 31 20 4d 61 67 69 63 20 76 ┆CFREE 0x69 /* 0110 1001 Magic v┆ 0x04f200…09e600 61 6c 75 65 20 66 6f 72 20 46 72 65 65 20 62 6c 6f 63 6b 73 20 2a 2f 0a 0a 2f 2a 20 57 72 69 74 ┆alue for Free blocks */ /* Writ┆ 0x04f200…09e600 74 65 6e 20 69 6e 20 74 68 65 20 34 20 62 79 74 65 73 20 62 65 66 6f 72 65 20 74 68 65 20 62 6c ┆ten in the 4 bytes before the bl┆ 0x04f200…09e600 6f 63 6b 27 73 20 72 65 61 6c 20 73 70 61 63 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 41 47 49 ┆ock's real space */ #define MAGI┆ 0x04f200…09e600 43 34 20 30 78 35 35 35 35 35 35 35 35 0a 23 64 65 66 69 6e 65 20 4d 41 47 49 43 46 52 45 45 34 ┆C4 0x55555555 #define MAGICFREE4┆ 0x04f200…09e600 20 30 78 36 39 36 39 36 39 36 39 0a 0a 23 64 65 66 69 6e 65 20 41 53 53 45 52 54 28 70 29 20 69 ┆ 0x69696969 #define ASSERT(p) i┆ 0x04f200…09e600 66 20 28 21 28 70 29 29 20 62 6f 74 63 68 28 22 70 22 29 3b 20 65 6c 73 65 0a 23 64 65 66 69 6e ┆f (!(p)) botch("p"); else #defin┆ 0x04f200…09e600 65 20 45 58 54 52 41 20 20 34 09 09 2f 2a 20 34 20 62 79 74 65 73 20 65 78 74 72 61 20 66 6f 72 ┆e EXTRA 4 /* 4 bytes extra for┆ 0x04f200…09e600 20 4d 41 47 49 43 31 73 20 2a 2f 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 41 53 53 45 52 54 ┆ MAGIC1s */ #else #define ASSERT┆ 0x04f200…09e600 28 70 29 0a 23 64 65 66 69 6e 65 20 45 58 54 52 41 20 20 30 0a 23 65 6e 64 69 66 20 2f 2a 20 72 ┆(p) #define EXTRA 0 #endif /* r┆ 0x04f200…09e600 63 68 65 63 6b 20 2a 2f 0a 0a 23 64 65 66 69 6e 65 20 49 53 41 4c 4c 4f 43 20 28 28 63 68 61 72 ┆check */ #define ISALLOC ((char┆ 0x04f200…09e600 29 20 30 78 66 37 29 09 2f 2a 20 6d 61 67 69 63 20 62 79 74 65 20 74 68 61 74 20 69 6d 70 6c 69 ┆) 0xf7) /* magic byte that impli┆ 0x04f200…09e600 65 73 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 49 53 46 52 45 45 20 ┆es allocation */ #define ISFREE ┆ 0x04f200…09e600 28 28 63 68 61 72 29 20 30 78 35 34 29 09 2f 2a 20 6d 61 67 69 63 20 62 79 74 65 20 74 68 61 74 ┆((char) 0x54) /* magic byte that┆ 0x04f200…09e600 20 69 6d 70 6c 69 65 73 20 66 72 65 65 20 62 6c 6f 63 6b 20 2a 2f 0a 09 09 09 09 2f 2a 20 74 68 ┆ implies free block */ /* th┆ 0x04f200…09e600 69 73 20 69 73 20 66 6f 72 20 65 72 72 6f 72 20 63 68 65 63 6b 69 6e 67 20 6f 6e 6c 79 20 2a 2f ┆is is for error checking only */┆ 0x04f200…09e600 0a 0a 2f 2a 20 49 66 20 72 61 6e 67 65 20 63 68 65 63 6b 69 6e 67 20 69 73 20 6e 6f 74 20 74 75 ┆ /* If range checking is not tu┆ 0x04f200…09e600 72 6e 65 64 20 6f 6e 2c 20 61 6c 6c 20 77 65 20 68 61 76 65 20 69 73 20 61 20 66 6c 61 67 0a 20 ┆rned on, all we have is a flag ┆ 0x04f200…09e600 2a 20 69 6e 64 69 63 61 74 69 6e 67 20 77 68 65 74 68 65 72 20 6d 65 6d 6f 72 79 20 69 73 20 61 ┆* indicating whether memory is a┆ 0x04f200…09e600 6c 6c 6f 63 61 74 65 64 2c 20 61 6e 20 69 6e 64 65 78 20 69 6e 20 6e 65 78 74 66 5b 5d 2c 0a 20 ┆llocated, an index in nextf[], ┆ 0x04f200…09e600 2a 20 61 6e 64 20 61 20 66 69 65 6c 64 20 74 68 61 74 20 74 65 6c 6c 73 20 68 6f 77 20 6d 61 6e ┆* and a field that tells how man┆ 0x04f200…09e600 79 20 62 79 74 65 73 2e 0a 20 2a 20 54 6f 20 72 65 61 6c 6c 6f 63 28 29 20 6d 65 6d 6f 72 79 20 ┆y bytes. * To realloc() memory ┆ 0x04f200…09e600 77 65 20 63 6f 70 79 20 6e 62 79 74 65 73 2e 0a 20 2a 20 31 36 20 62 69 74 73 20 6f 66 20 68 65 ┆we copy nbytes. * 16 bits of he┆ 0x04f200…09e600 61 64 65 72 20 73 70 61 63 65 20 69 73 20 75 6e 75 73 65 64 2e 0a 20 2a 2f 0a 73 74 72 75 63 74 ┆ader space is unused. */ struct┆ 0x04f200…09e600 20 6d 68 65 61 64 20 7b 0a 09 63 68 61 72 20 20 20 20 20 6d 68 5f 61 6c 6c 6f 63 3b 09 2f 2a 20 ┆ mhead { char mh_alloc; /* ┆ 0x04f200…09e600 49 53 41 4c 4c 4f 43 20 6f 72 20 49 53 46 52 45 45 20 2a 2f 0a 09 63 68 61 72 20 20 20 20 20 6d ┆ISALLOC or ISFREE */ char m┆ 0x04f200…09e600 68 5f 69 6e 64 65 78 3b 09 2f 2a 20 69 6e 64 65 78 20 69 6e 20 6e 65 78 74 66 5b 5d 20 2a 2f 0a ┆h_index; /* index in nextf[] */ ┆ 0x04f200…09e600 09 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 6d 68 5f 65 78 74 72 61 3b 2f 2a 20 43 75 72 72 ┆ unsigned short mh_extra;/* Curr┆ 0x04f200…09e600 65 6e 74 6c 79 20 77 61 73 74 65 64 20 31 36 20 62 69 74 73 20 2a 2f 0a 2f 2a 20 52 65 6d 61 69 ┆ently wasted 16 bits */ /* Remai┆ 0x04f200…09e600 6e 64 65 72 20 61 72 65 20 76 61 6c 69 64 20 6f 6e 6c 79 20 77 68 65 6e 20 62 6c 6f 63 6b 20 69 ┆nder are valid only when block i┆ 0x04f200…09e600 73 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 09 75 6e 73 69 67 6e 65 64 20 6d 68 5f 6e 62 79 74 ┆s allocated */ unsigned mh_nbyt┆ 0x04f200…09e600 65 73 3b 09 2f 2a 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 ┆es; /* number of bytes allocated┆ 0x04f200…09e600 20 2a 2f 0a 23 69 66 64 65 66 20 4d 41 4c 4c 4f 43 5f 44 45 42 55 47 0a 09 63 68 61 72 09 2a 6d ┆ */ #ifdef MALLOC_DEBUG char *m┆ 0x04f200…09e600 68 5f 70 61 72 65 6e 74 3b 09 2f 2a 20 73 65 74 20 74 6f 20 63 61 6c 6c 65 72 20 6f 66 20 6d 61 ┆h_parent; /* set to caller of ma┆ 0x04f200…09e600 6c 6c 6f 63 2f 72 65 61 6c 6c 6f 63 20 2a 2f 0a 09 73 74 72 75 63 74 20 6d 68 65 61 64 20 2a 6d ┆lloc/realloc */ struct mhead *m┆ 0x04f200…09e600 68 5f 6c 69 6e 6b 3b 09 2f 2a 20 73 65 74 20 74 6f 20 6e 65 78 74 20 62 6c 6f 63 6b 20 6f 72 20 ┆h_link; /* set to next block or ┆ 0x04f200…09e600 4e 55 4c 4c 20 2a 2f 0a 23 65 6e 64 69 66 20 4d 41 4c 4c 4f 43 5f 44 45 42 55 47 0a 23 69 66 64 ┆NULL */ #endif MALLOC_DEBUG #ifd┆ 0x04f200…09e600 65 66 20 72 63 68 65 63 6b 0a 09 69 6e 74 20 20 20 20 20 20 6d 68 5f 6d 61 67 69 63 34 3b 09 2f ┆ef rcheck int mh_magic4; /┆ 0x04f200…09e600 2a 20 73 68 6f 75 6c 64 20 62 65 20 3d 3d 20 4d 41 47 49 43 34 20 2a 2f 0a 23 65 6e 64 69 66 20 ┆* should be == MAGIC4 */ #endif ┆ 0x04f200…09e600 2f 2a 20 72 63 68 65 63 6b 20 2a 2f 0a 7d 3b 0a 0a 23 69 66 64 65 66 20 4d 41 4c 4c 4f 43 5f 44 ┆/* rcheck */ }; #ifdef MALLOC_D┆ 0x04f200…09e600 45 42 55 47 0a 73 74 72 75 63 74 20 6d 68 65 61 64 20 2a 62 61 73 65 6c 69 6e 6b 3d 4e 55 4c 4c ┆EBUG struct mhead *baselink=NULL┆ 0x04f200…09e600 3b 0a 73 74 72 75 63 74 20 6d 68 65 61 64 20 2a 65 6e 64 6c 69 6e 6b 3d 4e 55 4c 4c 3b 0a 23 65 ┆; struct mhead *endlink=NULL; #e┆ 0x04f200…09e600 6e 64 69 66 20 4d 41 4c 4c 4f 43 5f 44 45 42 55 47 0a 0a 2f 2a 0a 20 2a 20 41 63 63 65 73 73 20 ┆ndif MALLOC_DEBUG /* * Access ┆ 0x04f200…09e600 66 72 65 65 2d 6c 69 73 74 20 70 6f 69 6e 74 65 72 20 6f 66 20 61 20 62 6c 6f 63 6b 2e 0a 20 2a ┆free-list pointer of a block. *┆ 0x04f200…09e600 20 49 74 20 69 73 20 73 74 6f 72 65 64 20 61 74 20 62 6c 6f 63 6b 20 2b 20 34 2e 0a 20 2a 20 54 ┆ It is stored at block + 4. * T┆ 0x04f200…09e600 68 69 73 20 69 73 20 6e 6f 74 20 61 20 66 69 65 6c 64 20 69 6e 20 74 68 65 20 6d 68 65 61 64 20 ┆his is not a field in the mhead ┆ 0x04f200…09e600 73 74 72 75 63 74 75 72 65 20 62 65 63 61 75 73 65 20 77 65 20 77 61 6e 74 0a 20 2a 20 73 69 7a ┆structure because we want * siz┆ 0x04f200…09e600 65 6f 66 20 28 73 74 72 75 63 74 20 6d 68 65 61 64 29 20 74 6f 20 64 65 73 63 72 69 62 65 20 74 ┆eof (struct mhead) to describe t┆ 0x04f200…09e600 68 65 20 6f 76 65 72 68 65 61 64 20 66 6f 72 20 77 68 65 6e 20 74 68 65 0a 20 2a 20 62 6c 6f 63 ┆he overhead for when the * bloc┆ 0x04f200…09e600 6b 20 69 73 20 69 6e 20 75 73 65 2c 20 61 6e 64 20 77 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20 ┆k is in use, and we do not want ┆ 0x04f200…09e600 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 70 6f 69 6e 74 65 72 0a 20 2a 20 74 6f 20 63 6f 75 6e ┆the free-list pointer * to coun┆ 0x04f200…09e600 74 20 69 6e 20 74 68 61 74 2e 0a 20 2a 2f 0a 23 64 65 66 69 6e 65 20 43 48 41 49 4e 28 61 29 20 ┆t in that. */ #define CHAIN(a) ┆ 0x04f200…09e600 5c 0a 20 20 28 2a 28 73 74 72 75 63 74 20 6d 68 65 61 64 20 2a 2a 29 20 28 73 69 7a 65 6f 66 20 ┆\ (*(struct mhead **) (sizeof ┆ 0x04f200…09e600 28 63 68 61 72 20 2a 29 20 2b 20 28 63 68 61 72 20 2a 29 20 28 61 29 29 29 0a 0a 0c 0a 2f 2a 2a ┆(char *) + (char *) (a))) /**┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆********************************┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 20 ┆****************************** ┆ 0x04f200…09e600 2a 09 09 09 09 09 09 09 09 2a 0a 20 2a 09 09 56 61 72 69 61 62 6c 65 20 43 72 65 61 74 69 6f 6e ┆* * * Variable Creation┆ 0x04f200…09e600 73 09 09 09 09 2a 0a 20 2a 09 09 09 09 09 09 09 09 2a 0a 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆s * * * ************┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆********************************┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 65 78 74 65 72 6e 20 63 68 ┆********************/ extern ch┆ 0x04f200…09e600 61 72 20 65 74 65 78 74 3b 0a 65 78 74 65 72 6e 20 63 68 61 72 20 2a 73 74 61 72 74 5f 6f 66 5f ┆ar etext; extern char *start_of_┆ 0x04f200…09e600 64 61 74 61 20 28 29 3b 20 20 2f 2a 20 54 68 69 73 20 73 65 65 6d 73 20 6e 65 63 65 73 73 61 72 ┆data (); /* This seems necessar┆ 0x04f200…09e600 79 20 66 6f 72 20 55 53 47 20 2a 2f 0a 0a 2f 2a 20 54 68 65 73 65 20 74 77 6f 20 61 72 65 20 66 ┆y for USG */ /* These two are f┆ 0x04f200…09e600 6f 72 20 75 73 65 72 20 70 72 6f 67 72 61 6d 73 20 74 6f 20 6c 6f 6f 6b 20 61 74 2c 20 77 68 65 ┆or user programs to look at, whe┆ 0x04f200…09e600 6e 20 74 68 65 79 20 61 72 65 20 69 6e 74 65 72 65 73 74 65 64 2e 20 20 2a 2f 0a 0a 69 6e 74 20 ┆n they are interested. */ int ┆ 0x04f200…09e600 6d 61 6c 6c 6f 63 5f 73 62 72 6b 5f 75 73 65 64 3b 20 20 20 20 20 20 20 2f 2a 20 61 6d 6f 75 6e ┆malloc_sbrk_used; /* amoun┆ 0x04f200…09e600 74 20 6f 66 20 64 61 74 61 20 73 70 61 63 65 20 75 73 65 64 20 6e 6f 77 20 2a 2f 0a 69 6e 74 20 ┆t of data space used now */ int ┆ 0x04f200…09e600 6d 61 6c 6c 6f 63 5f 73 62 72 6b 5f 75 6e 75 73 65 64 3b 20 20 20 20 20 2f 2a 20 61 6d 6f 75 6e ┆malloc_sbrk_unused; /* amoun┆ 0x04f200…09e600 74 20 6d 6f 72 65 20 77 65 20 63 61 6e 20 68 61 76 65 20 2a 2f 0a 0a 2f 2a 20 73 74 61 72 74 20 ┆t more we can have */ /* start ┆ 0x04f200…09e600 6f 66 20 64 61 74 61 20 73 70 61 63 65 3b 20 63 61 6e 20 62 65 20 63 68 61 6e 67 65 64 20 62 79 ┆of data space; can be changed by┆ 0x04f200…09e600 20 63 61 6c 6c 69 6e 67 20 69 6e 69 74 5f 6d 61 6c 6c 6f 63 20 2a 2f 0a 73 74 61 74 69 63 20 63 ┆ calling init_malloc */ static c┆ 0x04f200…09e600 68 61 72 20 2a 64 61 74 61 5f 73 70 61 63 65 5f 73 74 61 72 74 20 3d 20 30 3b 0a 0a 23 69 66 64 ┆har *data_space_start = 0; #ifd┆ 0x04f200…09e600 65 66 20 4d 53 54 41 54 53 0a 2f 2a 0a 20 2a 20 6e 6d 61 6c 6c 6f 63 5b 69 5d 20 69 73 20 74 68 ┆ef MSTATS /* * nmalloc[i] is th┆ 0x04f200…09e600 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 ┆e difference between the number ┆ 0x04f200…09e600 6f 66 20 6d 61 6c 6c 6f 63 73 20 61 6e 64 20 66 72 65 65 73 0a 20 2a 20 66 6f 72 20 61 20 67 69 ┆of mallocs and frees * for a gi┆ 0x04f200…09e600 76 65 6e 20 62 6c 6f 63 6b 20 73 69 7a 65 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e ┆ven block size. */ static int n┆ 0x04f200…09e600 6d 61 6c 6c 6f 63 5b 4e 42 55 43 4b 45 54 53 5d 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6d 61 ┆malloc[NBUCKETS]; static int nma┆ 0x04f200…09e600 6c 2c 20 6e 66 72 65 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 4d 53 54 41 54 53 20 2a 2f 0a 0a 2f 2a ┆l, nfre; #endif /* MSTATS */ /*┆ 0x04f200…09e600 0a 20 2a 20 6e 65 78 74 66 5b 69 5d 20 69 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 ┆ * nextf[i] is the pointer to t┆ 0x04f200…09e600 68 65 20 6e 65 78 74 20 66 72 65 65 20 62 6c 6f 63 6b 20 6f 66 20 73 69 7a 65 20 32 5e 28 69 2b ┆he next free block of size 2^(i+┆ 0x04f200…09e600 33 29 2e 20 20 54 68 65 0a 20 2a 20 73 6d 61 6c 6c 65 73 74 20 61 6c 6c 6f 63 61 74 61 62 6c 65 ┆3). The * smallest allocatable┆ 0x04f200…09e600 20 62 6c 6f 63 6b 20 69 73 20 38 20 62 79 74 65 73 2e 20 20 54 68 65 20 6f 76 65 72 68 65 61 64 ┆ block is 8 bytes. The overhead┆ 0x04f200…09e600 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69 6c 6c 0a 20 2a 20 67 6f 20 69 6e 20 74 68 65 20 66 ┆ information will * go in the f┆ 0x04f200…09e600 69 72 73 74 20 69 6e 74 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 2c 20 61 6e 64 20 74 68 65 20 72 ┆irst int of the block, and the r┆ 0x04f200…09e600 65 74 75 72 6e 65 64 20 70 6f 69 6e 74 65 72 20 77 69 6c 6c 20 70 6f 69 6e 74 0a 20 2a 20 74 6f ┆eturned pointer will point * to┆ 0x04f200…09e600 20 74 68 65 20 73 65 63 6f 6e 64 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 6d ┆ the second. */ static struct m┆ 0x04f200…09e600 68 65 61 64 20 2a 6e 65 78 74 66 5b 4e 42 55 43 4b 45 54 53 5d 3b 0a 0a 2f 2a 20 4e 75 6d 62 65 ┆head *nextf[NBUCKETS]; /* Numbe┆ 0x04f200…09e600 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 77 72 69 74 61 62 6c 65 20 6d 65 6d 6f 72 79 20 77 65 ┆r of bytes of writable memory we┆ 0x04f200…09e600 20 63 61 6e 20 65 78 70 65 63 74 20 74 6f 20 62 65 20 61 62 6c 65 20 74 6f 20 67 65 74 20 2a 2f ┆ can expect to be able to get */┆ 0x04f200…09e600 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 69 6d 5f 64 61 74 61 20 3d 20 30 3b 0a 2f 2a 20 4c 65 76 ┆ static int lim_data = 0; /* Lev┆ 0x04f200…09e600 65 6c 20 6e 75 6d 62 65 72 20 6f 66 20 77 61 72 6e 69 6e 67 73 20 61 6c 72 65 61 64 79 20 69 73 ┆el number of warnings already is┆ 0x04f200…09e600 73 75 65 64 2e 0a 20 2a 20 30 20 2d 2d 20 6e 6f 20 77 61 72 6e 69 6e 67 73 20 69 73 73 75 65 64 ┆sued. * 0 -- no warnings issued┆ 0x04f200…09e600 2e 0a 20 2a 20 31 20 2d 2d 20 37 35 25 20 77 61 72 6e 69 6e 67 20 61 6c 72 65 61 64 79 20 69 73 ┆. * 1 -- 75% warning already is┆ 0x04f200…09e600 73 75 65 64 2e 0a 20 2a 20 32 20 2d 2d 20 38 35 25 20 77 61 72 6e 69 6e 67 20 61 6c 72 65 61 64 ┆sued. * 2 -- 85% warning alread┆ 0x04f200…09e600 79 20 69 73 73 75 65 64 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 61 72 6e 6c 65 76 ┆y issued. */ static int warnlev┆ 0x04f200…09e600 65 6c 20 3d 20 30 3b 0a 0a 2f 2a 20 6e 6f 6e 7a 65 72 6f 20 6f 6e 63 65 20 69 6e 69 74 69 61 6c ┆el = 0; /* nonzero once initial┆ 0x04f200…09e600 20 62 75 6e 63 68 20 6f 66 20 66 72 65 65 20 62 6c 6f 63 6b 73 20 6d 61 64 65 20 2a 2f 0a 73 74 ┆ bunch of free blocks made */ st┆ 0x04f200…09e600 61 74 69 63 20 69 6e 74 20 67 6f 74 70 6f 6f 6c 3b 0a 0c 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆atic int gotpool; /***********┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆********************************┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 20 2a 09 09 09 09 09 09 09 09 ┆********************* * ┆ 0x04f200…09e600 2a 0a 20 2a 09 09 53 74 61 72 74 20 6f 66 20 70 72 6f 63 65 64 75 72 65 73 09 09 09 09 2a 0a 20 ┆* * Start of procedures * ┆ 0x04f200…09e600 2a 09 09 09 09 09 09 09 09 2a 0a 20 2a 09 6d 61 6c 6c 6f 63 5f 69 6e 69 74 2c 20 6d 5f 62 6c 6f ┆* * * malloc_init, m_blo┆ 0x04f200…09e600 63 6b 73 69 7a 65 09 09 09 09 2a 0a 20 2a 09 09 09 09 09 09 09 09 2a 0a 20 2a 2a 2a 2a 2a 2a 2a ┆cksize * * * *******┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆********************************┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 ┆*************************/ /* ┆ 0x04f200…09e600 2a 20 43 61 75 73 65 20 72 65 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 62 61 73 65 64 20 6f ┆* Cause reinitialization based o┆ 0x04f200…09e600 6e 20 6a 6f 62 20 70 61 72 61 6d 65 74 65 72 73 3b 0a 20 2a 20 61 6c 73 6f 20 64 65 63 6c 61 72 ┆n job parameters; * also declar┆ 0x04f200…09e600 65 20 77 68 65 72 65 20 74 68 65 20 65 6e 64 20 6f 66 20 70 75 72 65 20 73 74 6f 72 61 67 65 20 ┆e where the end of pure storage ┆ 0x04f200…09e600 69 73 2e 0a 20 2a 2f 0a 70 75 62 6c 69 63 20 6d 61 6c 6c 6f 63 5f 69 6e 69 74 20 28 73 74 61 72 ┆is. */ public malloc_init (star┆ 0x04f200…09e600 74 29 0a 20 20 20 20 20 63 68 61 72 20 2a 73 74 61 72 74 3b 0a 7b 0a 20 20 64 61 74 61 5f 73 70 ┆t) char *start; { data_sp┆ 0x04f200…09e600 61 63 65 5f 73 74 61 72 74 20 3d 20 73 74 61 72 74 3b 0a 20 20 6c 69 6d 5f 64 61 74 61 20 3d 20 ┆ace_start = start; lim_data = ┆ 0x04f200…09e600 30 3b 0a 20 20 77 61 72 6e 6c 65 76 65 6c 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 4d 41 4c 4c 4f ┆0; warnlevel = 0; #ifdef MALLO┆ 0x04f200…09e600 43 5f 44 45 42 55 47 0a 20 20 62 61 73 65 6c 69 6e 6b 20 3d 20 4e 55 4c 4c 3b 0a 20 20 65 6e 64 ┆C_DEBUG baselink = NULL; end┆ 0x04f200…09e600 6c 69 6e 6b 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66 20 4d 41 4c 4c 4f 43 5f 44 45 42 55 47 ┆link = NULL; #endif MALLOC_DEBUG┆ 0x04f200…09e600 0a 7d 0a 0a 70 75 62 6c 69 63 20 69 6e 74 20 6d 5f 62 6c 6f 63 6b 73 69 7a 65 28 61 5f 62 6c 6f ┆ } public int m_blocksize(a_blo┆ 0x04f200…09e600 63 6b 29 0a 20 20 20 20 20 72 65 67 69 73 74 65 72 20 63 68 61 72 20 2a 61 5f 62 6c 6f 63 6b 3b ┆ck) register char *a_block;┆ 0x04f200…09e600 0a 7b 0a 20 20 69 66 20 28 61 5f 62 6c 6f 63 6b 20 3d 3d 20 28 63 68 61 72 20 2a 29 30 29 20 72 ┆ { if (a_block == (char *)0) r┆ 0x04f200…09e600 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 28 28 28 73 74 72 75 63 74 20 6d 68 65 61 64 ┆eturn 0; return(((struct mhead┆ 0x04f200…09e600 20 2a 29 61 5f 62 6c 6f 63 6b 2d 31 29 2d 3e 6d 68 5f 6e 62 79 74 65 73 29 3b 0a 7d 0a 0c 0a 2f ┆ *)a_block-1)->mh_nbytes); } /┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆********************************┆ […0x1…] 0x04f200…09e600 0a 20 2a 09 09 09 09 09 09 09 09 2a 0a 20 2a 20 20 20 20 6d 6f 72 65 63 6f 72 65 20 2d 20 41 73 ┆ * * * morecore - As┆ 0x04f200…09e600 6b 20 74 68 65 20 73 79 73 74 65 6d 20 66 6f 72 20 6d 6f 72 65 20 6d 65 6d 6f 72 79 09 09 09 2a ┆k the system for more memory *┆ 0x04f200…09e600 0a 20 2a 09 09 09 09 09 09 09 09 2a 0a 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆ * * ******************┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆********************************┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 73 74 61 74 69 63 0a 6d 6f 72 65 63 6f 72 65 ┆**************/ static morecore┆ 0x04f200…09e600 20 28 6e 75 29 09 09 09 2f 2a 20 61 73 6b 20 73 79 73 74 65 6d 20 66 6f 72 20 6d 6f 72 65 20 6d ┆ (nu) /* ask system for more m┆ 0x04f200…09e600 65 6d 6f 72 79 20 2a 2f 0a 20 20 20 20 20 72 65 67 69 73 74 65 72 20 69 6e 74 20 6e 75 3b 09 09 ┆emory */ register int nu; ┆ 0x04f200…09e600 2f 2a 20 73 69 7a 65 20 69 6e 64 65 78 20 74 6f 20 67 65 74 20 6d 6f 72 65 20 6f 66 20 20 2a 2f ┆/* size index to get more of */┆ 0x04f200…09e600 0a 7b 0a 20 20 63 68 61 72 20 2a 73 62 72 6b 20 28 29 3b 0a 20 20 72 65 67 69 73 74 65 72 20 63 ┆ { char *sbrk (); register c┆ 0x04f200…09e600 68 61 72 20 2a 63 70 3b 0a 20 20 72 65 67 69 73 74 65 72 20 69 6e 74 20 6e 62 6c 6b 73 3b 0a 20 ┆har *cp; register int nblks; ┆ 0x04f200…09e600 20 72 65 67 69 73 74 65 72 20 69 6e 74 20 73 69 7a 3b 0a 0a 20 20 69 66 20 28 21 64 61 74 61 5f ┆ register int siz; if (!data_┆ 0x04f200…09e600 73 70 61 63 65 5f 73 74 61 72 74 29 0a 20 20 20 20 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 55 ┆space_start) { #if defined(U┆ 0x04f200…09e600 53 47 29 0a 20 20 20 20 20 20 64 61 74 61 5f 73 70 61 63 65 5f 73 74 61 72 74 20 3d 20 73 74 61 ┆SG) data_space_start = sta┆ 0x04f200…09e600 72 74 5f 6f 66 5f 64 61 74 61 20 28 29 3b 0a 23 65 6c 73 65 20 2f 2a 20 6e 6f 74 20 55 53 47 20 ┆rt_of_data (); #else /* not USG ┆ 0x04f200…09e600 2a 2f 0a 20 20 20 20 20 20 64 61 74 61 5f 73 70 61 63 65 5f 73 74 61 72 74 20 3d 20 26 65 74 65 ┆*/ data_space_start = &ete┆ 0x04f200…09e600 78 74 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 6e 6f 74 20 55 53 47 20 2a 2f 0a 20 20 20 20 7d 0a 0a ┆xt; #endif /* not USG */ } ┆ 0x04f200…09e600 20 20 69 66 20 28 6c 69 6d 5f 64 61 74 61 20 3d 3d 20 30 29 0a 20 20 20 20 67 65 74 5f 6c 69 6d ┆ if (lim_data == 0) get_lim┆ 0x04f200…09e600 5f 64 61 74 61 20 28 29 3b 0a 0a 20 20 2f 2a 20 4f 6e 20 69 6e 69 74 69 61 6c 20 73 74 61 72 74 ┆_data (); /* On initial start┆ 0x04f200…09e600 75 70 2c 20 67 65 74 20 74 77 6f 20 62 6c 6f 63 6b 73 20 6f 66 20 65 61 63 68 20 73 69 7a 65 20 ┆up, get two blocks of each size ┆ 0x04f200…09e600 75 70 20 74 6f 20 31 6b 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 66 20 28 21 67 6f 74 70 6f 6f 6c ┆up to 1k bytes */ if (!gotpool┆ 0x04f200…09e600 29 0a 20 20 20 20 67 65 74 70 6f 6f 6c 20 28 29 2c 20 67 65 74 70 6f 6f 6c 20 28 29 2c 20 67 6f ┆) getpool (), getpool (), go┆ 0x04f200…09e600 74 70 6f 6f 6c 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 63 75 72 72 65 6e 74 20 65 6e ┆tpool = 1; /* Find current en┆ 0x04f200…09e600 64 20 6f 66 20 6d 65 6d 6f 72 79 20 61 6e 64 20 69 73 73 75 65 20 77 61 72 6e 69 6e 67 20 69 66 ┆d of memory and issue warning if┆ 0x04f200…09e600 20 67 65 74 74 69 6e 67 20 6e 65 61 72 20 6d 61 78 20 2a 2f 0a 0a 20 20 63 70 20 3d 20 73 62 72 ┆ getting near max */ cp = sbr┆ 0x04f200…09e600 6b 20 28 30 29 3b 0a 20 20 73 69 7a 20 3d 20 63 70 20 2d 20 64 61 74 61 5f 73 70 61 63 65 5f 73 ┆k (0); siz = cp - data_space_s┆ 0x04f200…09e600 74 61 72 74 3b 0a 20 20 6d 61 6c 6c 6f 63 5f 73 62 72 6b 5f 75 73 65 64 20 3d 20 73 69 7a 3b 0a ┆tart; malloc_sbrk_used = siz; ┆ 0x04f200…09e600 20 20 6d 61 6c 6c 6f 63 5f 73 62 72 6b 5f 75 6e 75 73 65 64 20 3d 20 6c 69 6d 5f 64 61 74 61 20 ┆ malloc_sbrk_unused = lim_data ┆ 0x04f200…09e600 2d 20 73 69 7a 3b 0a 0a 20 20 73 77 69 74 63 68 20 28 77 61 72 6e 6c 65 76 65 6c 29 0a 20 20 20 ┆- siz; switch (warnlevel) ┆ 0x04f200…09e600 20 7b 0a 20 20 20 20 63 61 73 65 20 30 3a 20 0a 20 20 20 20 20 20 69 66 20 28 73 69 7a 20 3e 20 ┆ { case 0: if (siz > ┆ 0x04f200…09e600 28 6c 69 6d 5f 64 61 74 61 20 2f 20 34 29 20 2a 20 33 29 0a 09 7b 0a 09 20 20 77 61 72 6e 6c 65 ┆(lim_data / 4) * 3) { warnle┆ 0x04f200…09e600 76 65 6c 2b 2b 3b 0a 09 20 20 6d 61 6c 6c 6f 63 5f 77 61 72 6e 69 6e 67 20 28 22 57 61 72 6e 69 ┆vel++; malloc_warning ("Warni┆ 0x04f200…09e600 6e 67 3a 20 70 61 73 74 20 37 35 25 20 6f 66 20 6d 65 6d 6f 72 79 20 6c 69 6d 69 74 22 29 3b 0a ┆ng: past 75% of memory limit"); ┆ 0x04f200…09e600 09 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 31 3a 20 0a 20 20 20 ┆ } break; case 1: ┆ 0x04f200…09e600 20 20 20 69 66 20 28 73 69 7a 20 3e 20 28 6c 69 6d 5f 64 61 74 61 20 2f 20 32 30 29 20 2a 20 31 ┆ if (siz > (lim_data / 20) * 1┆ 0x04f200…09e600 37 29 0a 09 7b 0a 09 20 20 77 61 72 6e 6c 65 76 65 6c 2b 2b 3b 0a 09 20 20 6d 61 6c 6c 6f 63 5f ┆7) { warnlevel++; malloc_┆ 0x04f200…09e600 77 61 72 6e 69 6e 67 20 28 22 57 61 72 6e 69 6e 67 3a 20 70 61 73 74 20 38 35 25 20 6f 66 20 6d ┆warning ("Warning: past 85% of m┆ 0x04f200…09e600 65 6d 6f 72 79 20 6c 69 6d 69 74 22 29 3b 0a 09 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 ┆emory limit"); } break; ┆ 0x04f200…09e600 20 20 20 63 61 73 65 20 32 3a 20 0a 20 20 20 20 20 20 69 66 20 28 73 69 7a 20 3e 20 28 6c 69 6d ┆ case 2: if (siz > (lim┆ 0x04f200…09e600 5f 64 61 74 61 20 2f 20 32 30 29 20 2a 20 31 39 29 0a 09 7b 0a 09 20 20 77 61 72 6e 6c 65 76 65 ┆_data / 20) * 19) { warnleve┆ 0x04f200…09e600 6c 2b 2b 3b 0a 09 20 20 6d 61 6c 6c 6f 63 5f 77 61 72 6e 69 6e 67 20 28 22 57 61 72 6e 69 6e 67 ┆l++; malloc_warning ("Warning┆ 0x04f200…09e600 3a 20 70 61 73 74 20 39 35 25 20 6f 66 20 6d 65 6d 6f 72 79 20 6c 69 6d 69 74 22 29 3b 0a 09 7d ┆: past 95% of memory limit"); }┆ 0x04f200…09e600 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 69 66 20 28 28 69 6e 74 29 ┆ break; } if ((int)┆ 0x04f200…09e600 20 63 70 20 26 20 30 78 33 66 66 29 09 2f 2a 20 6c 61 6e 64 20 6f 6e 20 31 4b 20 62 6f 75 6e 64 ┆ cp & 0x3ff) /* land on 1K bound┆ 0x04f200…09e600 61 72 69 65 73 20 2a 2f 0a 20 20 20 20 73 62 72 6b 20 28 31 30 32 34 20 2d 20 28 28 69 6e 74 29 ┆aries */ sbrk (1024 - ((int)┆ 0x04f200…09e600 20 63 70 20 26 20 30 78 33 66 66 29 29 3b 0a 0a 20 20 2f 2a 20 54 61 6b 65 20 61 74 20 6c 65 61 ┆ cp & 0x3ff)); /* Take at lea┆ 0x04f200…09e600 73 74 20 32 6b 2c 20 61 6e 64 20 66 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 62 ┆st 2k, and figure out how many b┆ 0x04f200…09e600 6c 6f 63 6b 73 20 6f 66 20 74 68 65 20 64 65 73 69 72 65 64 20 73 69 7a 65 0a 20 20 20 20 77 65 ┆locks of the desired size we┆ 0x04f200…09e600 27 72 65 20 61 62 6f 75 74 20 74 6f 20 67 65 74 20 2a 2f 0a 20 20 6e 62 6c 6b 73 20 3d 20 31 3b ┆'re about to get */ nblks = 1;┆ 0x04f200…09e600 0a 20 20 69 66 20 28 28 73 69 7a 20 3d 20 6e 75 29 20 3c 20 38 29 0a 20 20 20 20 6e 62 6c 6b 73 ┆ if ((siz = nu) < 8) nblks┆ 0x04f200…09e600 20 3d 20 31 20 3c 3c 20 28 28 73 69 7a 20 3d 20 38 29 20 2d 20 6e 75 29 3b 0a 0a 20 20 69 66 20 ┆ = 1 << ((siz = 8) - nu); if ┆ 0x04f200…09e600 28 28 63 70 20 3d 20 73 62 72 6b 20 28 31 20 3c 3c 20 28 73 69 7a 20 2b 20 33 29 29 29 20 3d 3d ┆((cp = sbrk (1 << (siz + 3))) ==┆ 0x04f200…09e600 20 28 63 68 61 72 20 2a 29 20 2d 31 29 0a 20 20 20 20 72 65 74 75 72 6e 3b 09 09 09 2f 2a 20 6e ┆ (char *) -1) return; /* n┆ 0x04f200…09e600 6f 20 6d 6f 72 65 20 72 6f 6f 6d 21 20 2a 2f 0a 20 20 69 66 20 28 28 69 6e 74 29 20 63 70 20 26 ┆o more room! */ if ((int) cp &┆ 0x04f200…09e600 20 37 29 0a 20 20 20 20 7b 09 09 2f 2a 20 73 68 6f 75 6c 64 6e 27 74 20 68 61 70 70 65 6e 2c 20 ┆ 7) { /* shouldn't happen, ┆ 0x04f200…09e600 62 75 74 20 6a 75 73 74 20 69 6e 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 63 70 20 3d 20 28 ┆but just in case */ cp = (┆ 0x04f200…09e600 63 68 61 72 20 2a 29 20 28 28 28 69 6e 74 29 20 63 70 20 2b 20 38 29 20 26 20 7e 37 29 3b 0a 20 ┆char *) (((int) cp + 8) & ~7); ┆ 0x04f200…09e600 20 20 20 20 20 6e 62 6c 6b 73 2d 2d 3b 0a 20 20 20 20 7d 0a 0a 20 20 2f 2a 20 73 61 76 65 20 6e ┆ nblks--; } /* save n┆ 0x04f200…09e600 65 77 20 68 65 61 64 65 72 20 61 6e 64 20 6c 69 6e 6b 20 74 68 65 20 6e 62 6c 6b 73 20 62 6c 6f ┆ew header and link the nblks blo┆ 0x04f200…09e600 63 6b 73 20 74 6f 67 65 74 68 65 72 20 2a 2f 0a 20 20 6e 65 78 74 66 5b 6e 75 5d 20 3d 20 28 73 ┆cks together */ nextf[nu] = (s┆ 0x04f200…09e600 74 72 75 63 74 20 6d 68 65 61 64 20 2a 29 20 63 70 3b 0a 20 20 73 69 7a 20 3d 20 31 20 3c 3c 20 ┆truct mhead *) cp; siz = 1 << ┆ 0x04f200…09e600 28 6e 75 20 2b 20 33 29 3b 0a 20 20 77 68 69 6c 65 20 28 31 29 0a 20 20 20 20 7b 0a 20 20 20 20 ┆(nu + 3); while (1) { ┆ 0x04f200…09e600 20 20 28 28 73 74 72 75 63 74 20 6d 68 65 61 64 20 2a 29 20 63 70 29 20 2d 3e 20 6d 68 5f 61 6c ┆ ((struct mhead *) cp) -> mh_al┆ 0x04f200…09e600 6c 6f 63 20 3d 20 49 53 46 52 45 45 3b 0a 20 20 20 20 20 20 28 28 73 74 72 75 63 74 20 6d 68 65 ┆loc = ISFREE; ((struct mhe┆ 0x04f200…09e600 61 64 20 2a 29 20 63 70 29 20 2d 3e 20 6d 68 5f 69 6e 64 65 78 20 3d 20 6e 75 3b 0a 23 69 66 64 ┆ad *) cp) -> mh_index = nu; #ifd┆ 0x04f200…09e600 65 66 20 4d 41 4c 4c 4f 43 5f 44 45 42 55 47 0a 20 20 20 20 20 20 28 28 73 74 72 75 63 74 20 6d ┆ef MALLOC_DEBUG ((struct m┆ 0x04f200…09e600 68 65 61 64 20 2a 29 20 63 70 29 20 2d 3e 20 6d 68 5f 70 61 72 65 6e 74 20 3d 20 4e 55 4c 4c 3b ┆head *) cp) -> mh_parent = NULL;┆ 0x04f200…09e600 0a 20 20 20 20 20 20 28 28 73 74 72 75 63 74 20 6d 68 65 61 64 20 2a 29 20 63 70 29 20 2d 3e 20 ┆ ((struct mhead *) cp) -> ┆ 0x04f200…09e600 6d 68 5f 6c 69 6e 6b 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66 20 4d 41 4c 4c 4f 43 5f 44 45 ┆mh_link = NULL; #endif MALLOC_DE┆ 0x04f200…09e600 42 55 47 0a 23 69 66 64 65 66 20 72 63 68 65 63 6b 0a 20 20 20 20 20 20 28 28 73 74 72 75 63 74 ┆BUG #ifdef rcheck ((struct┆ 0x04f200…09e600 20 6d 68 65 61 64 20 2a 29 20 63 70 29 20 2d 3e 20 6d 68 5f 6d 61 67 69 63 34 20 3d 20 4d 41 47 ┆ mhead *) cp) -> mh_magic4 = MAG┆ 0x04f200…09e600 49 43 46 52 45 45 34 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 72 63 68 65 63 6b 20 2a 2f 0a 23 69 66 ┆ICFREE4; #endif /* rcheck */ #if┆ 0x04f200…09e600 64 65 66 20 73 63 72 69 62 62 6c 65 63 68 65 63 6b 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 2f 2a ┆def scribblecheck { /*┆ 0x04f200…09e600 20 43 68 65 63 6b 20 74 68 61 74 20 75 70 70 65 72 20 73 74 75 66 66 20 77 61 73 20 73 74 69 6c ┆ Check that upper stuff was stil┆ 0x04f200…09e600 6c 20 4d 41 47 49 43 31 20 2a 2f 0a 20 20 20 20 20 20 72 65 67 69 73 74 65 72 20 63 68 61 72 20 ┆l MAGIC1 */ register char ┆ 0x04f200…09e600 2a 6d 20 3d 20 28 63 68 61 72 20 2a 29 28 28 73 74 72 75 63 74 20 6d 68 65 61 64 20 2a 29 63 70 ┆*m = (char *)((struct mhead *)cp┆ 0x04f200…09e600 2b 31 29 3b 0a 20 20 20 20 20 20 72 65 67 69 73 74 65 72 20 63 68 61 72 20 2a 65 6e 20 3d 20 28 ┆+1); register char *en = (┆ 0x04f200…09e600 38 3c 3c 6e 75 29 20 2b 20 63 70 3b 0a 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 77 68 6f 6c 65 ┆8<<nu) + cp; /* Fill whole┆ 0x04f200…09e600 20 62 6c 6f 63 6b 20 77 69 74 68 20 4d 41 47 49 43 46 52 45 45 20 2a 2f 0a 20 20 20 20 20 20 77 ┆ block with MAGICFREE */ w┆ 0x04f200…09e600 68 69 6c 65 20 28 6d 3c 65 6e 29 20 2a 6d 2b 2b 20 3d 20 4d 41 47 49 43 46 52 45 45 3b 0a 20 20 ┆hile (m<en) *m++ = MAGICFREE; ┆ 0x04f200…09e600 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 73 63 72 69 62 62 6c 65 63 68 65 63 6b 20 2a 2f 0a 0a ┆ } #endif /* scribblecheck */ ┆ 0x04f200…09e600 20 20 20 20 20 20 2f 2a 20 43 6c 65 61 72 20 6e 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 62 ┆ /* Clear newly allocated b┆ 0x04f200…09e600 6c 6f 63 6b 73 2c 20 74 6f 20 6d 61 74 63 68 20 66 72 65 65 20 6f 6e 65 73 20 2a 2f 0a 20 20 20 ┆locks, to match free ones */ ┆ 0x04f200…09e600 20 20 20 69 66 20 28 2d 2d 6e 62 6c 6b 73 20 3c 3d 20 30 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 ┆ if (--nblks <= 0) break; ┆ 0x04f200…09e600 20 20 43 48 41 49 4e 20 28 28 73 74 72 75 63 74 20 6d 68 65 61 64 20 2a 29 20 63 70 29 20 3d 20 ┆ CHAIN ((struct mhead *) cp) = ┆ 0x04f200…09e600 28 73 74 72 75 63 74 20 6d 68 65 61 64 20 2a 29 20 28 63 70 20 2b 20 73 69 7a 29 3b 0a 20 20 20 ┆(struct mhead *) (cp + siz); ┆ 0x04f200…09e600 20 20 20 63 70 20 2b 3d 20 73 69 7a 3b 0a 20 20 20 20 7d 0a 20 20 43 48 41 49 4e 20 28 28 73 74 ┆ cp += siz; } CHAIN ((st┆ 0x04f200…09e600 72 75 63 74 20 6d 68 65 61 64 20 2a 29 20 63 70 29 20 3d 20 30 3b 0a 7d 0a 0c 0a 2f 2a 2a 2a 2a ┆ruct mhead *) cp) = 0; } /****┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆********************************┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 20 2a 09 ┆**************************** * ┆ 0x04f200…09e600 09 09 09 09 09 09 09 2a 0a 20 2a 09 67 65 74 70 6f 6f 6c 20 2d 20 47 65 74 20 69 6e 69 74 69 61 ┆ * * getpool - Get initia┆ 0x04f200…09e600 6c 20 70 6f 6f 6c 73 20 6f 66 20 73 6d 61 6c 6c 20 62 6c 6f 63 6b 73 09 09 2a 0a 20 2a 09 09 09 ┆l pools of small blocks * * ┆ 0x04f200…09e600 09 09 09 09 09 2a 0a 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆ * ************************┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆********************************┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 73 74 61 74 69 63 0a 67 65 74 70 6f 6f 6c 20 28 29 0a 7b 0a 20 ┆********/ static getpool () { ┆ 0x04f200…09e600 20 72 65 67 69 73 74 65 72 20 69 6e 74 20 6e 75 3b 0a 20 20 72 65 67 69 73 74 65 72 20 63 68 61 ┆ register int nu; register cha┆ 0x04f200…09e600 72 20 2a 63 70 20 3d 20 73 62 72 6b 20 28 30 29 3b 0a 0a 20 20 69 66 20 28 28 69 6e 74 29 20 63 ┆r *cp = sbrk (0); if ((int) c┆ 0x04f200…09e600 70 20 26 20 30 78 33 66 66 29 09 2f 2a 20 6c 61 6e 64 20 6f 6e 20 31 4b 20 62 6f 75 6e 64 61 72 ┆p & 0x3ff) /* land on 1K boundar┆ 0x04f200…09e600 69 65 73 20 2a 2f 0a 20 20 20 20 73 62 72 6b 20 28 31 30 32 34 20 2d 20 28 28 69 6e 74 29 20 63 ┆ies */ sbrk (1024 - ((int) c┆ 0x04f200…09e600 70 20 26 20 30 78 33 66 66 29 29 3b 0a 0a 20 20 2f 2a 20 47 65 74 20 32 6b 20 6f 66 20 73 74 6f ┆p & 0x3ff)); /* Get 2k of sto┆ 0x04f200…09e600 72 61 67 65 20 2a 2f 0a 0a 20 20 63 70 20 3d 20 73 62 72 6b 20 28 30 34 30 30 30 29 3b 0a 20 20 ┆rage */ cp = sbrk (04000); ┆ 0x04f200…09e600 69 66 20 28 63 70 20 3d 3d 20 28 63 68 61 72 20 2a 29 20 2d 31 29 0a 20 20 20 20 72 65 74 75 72 ┆if (cp == (char *) -1) retur┆ 0x04f200…09e600 6e 3b 0a 0a 20 20 2f 2a 20 44 69 76 69 64 65 20 69 74 20 69 6e 74 6f 20 61 6e 20 69 6e 69 74 69 ┆n; /* Divide it into an initi┆ 0x04f200…09e600 61 6c 20 38 2d 77 6f 72 64 20 62 6c 6f 63 6b 0a 20 20 20 20 20 70 6c 75 73 20 6f 6e 65 20 62 6c ┆al 8-word block plus one bl┆ 0x04f200…09e600 6f 63 6b 20 6f 66 20 73 69 7a 65 20 32 2a 2a 6e 75 20 66 6f 72 20 6e 75 20 3d 20 33 20 2e 2e 2e ┆ock of size 2**nu for nu = 3 ...┆ 0x04f200…09e600 20 31 30 2e 20 20 2a 2f 0a 0a 20 20 43 48 41 49 4e 20 28 63 70 29 20 3d 20 6e 65 78 74 66 5b 30 ┆ 10. */ CHAIN (cp) = nextf[0┆ 0x04f200…09e600 5d 3b 0a 20 20 6e 65 78 74 66 5b 30 5d 20 3d 20 28 73 74 72 75 63 74 20 6d 68 65 61 64 20 2a 29 ┆]; nextf[0] = (struct mhead *)┆ 0x04f200…09e600 20 63 70 3b 0a 20 20 28 28 73 74 72 75 63 74 20 6d 68 65 61 64 20 2a 29 20 63 70 29 20 2d 3e 20 ┆ cp; ((struct mhead *) cp) -> ┆ 0x04f200…09e600 6d 68 5f 61 6c 6c 6f 63 20 3d 20 49 53 46 52 45 45 3b 0a 20 20 28 28 73 74 72 75 63 74 20 6d 68 ┆mh_alloc = ISFREE; ((struct mh┆ 0x04f200…09e600 65 61 64 20 2a 29 20 63 70 29 20 2d 3e 20 6d 68 5f 69 6e 64 65 78 20 3d 20 30 3b 0a 23 69 66 64 ┆ead *) cp) -> mh_index = 0; #ifd┆ 0x04f200…09e600 65 66 20 4d 41 4c 4c 4f 43 5f 44 45 42 55 47 0a 20 20 28 28 73 74 72 75 63 74 20 6d 68 65 61 64 ┆ef MALLOC_DEBUG ((struct mhead┆ 0x04f200…09e600 20 2a 29 20 63 70 29 20 2d 3e 20 6d 68 5f 70 61 72 65 6e 74 20 3d 20 4e 55 4c 4c 3b 0a 20 20 28 ┆ *) cp) -> mh_parent = NULL; (┆ 0x04f200…09e600 28 73 74 72 75 63 74 20 6d 68 65 61 64 20 2a 29 20 63 70 29 20 2d 3e 20 6d 68 5f 6c 69 6e 6b 20 ┆(struct mhead *) cp) -> mh_link ┆ 0x04f200…09e600 3d 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66 20 4d 41 4c 4c 4f 43 5f 44 45 42 55 47 0a 23 69 66 64 ┆= NULL; #endif MALLOC_DEBUG #ifd┆ 0x04f200…09e600 65 66 20 72 63 68 65 63 6b 0a 20 20 20 20 20 20 28 28 73 74 72 75 63 74 20 6d 68 65 61 64 20 2a ┆ef rcheck ((struct mhead *┆ 0x04f200…09e600 29 20 63 70 29 20 2d 3e 20 6d 68 5f 6d 61 67 69 63 34 20 3d 20 4d 41 47 49 43 46 52 45 45 34 3b ┆) cp) -> mh_magic4 = MAGICFREE4;┆ 0x04f200…09e600 0a 23 65 6e 64 69 66 20 2f 2a 20 72 63 68 65 63 6b 20 2a 2f 0a 20 20 63 70 20 2b 3d 20 38 3b 0a ┆ #endif /* rcheck */ cp += 8; ┆ 0x04f200…09e600 0a 20 20 66 6f 72 20 28 6e 75 20 3d 20 30 3b 20 6e 75 20 3c 20 37 3b 20 6e 75 2b 2b 29 0a 20 20 ┆ for (nu = 0; nu < 7; nu++) ┆ 0x04f200…09e600 20 20 7b 0a 20 20 20 20 20 20 43 48 41 49 4e 20 28 63 70 29 20 3d 20 6e 65 78 74 66 5b 6e 75 5d ┆ { CHAIN (cp) = nextf[nu]┆ 0x04f200…09e600 3b 0a 20 20 20 20 20 20 6e 65 78 74 66 5b 6e 75 5d 20 3d 20 28 73 74 72 75 63 74 20 6d 68 65 61 ┆; nextf[nu] = (struct mhea┆ 0x04f200…09e600 64 20 2a 29 20 63 70 3b 0a 20 20 20 20 20 20 28 28 73 74 72 75 63 74 20 6d 68 65 61 64 20 2a 29 ┆d *) cp; ((struct mhead *)┆ 0x04f200…09e600 20 63 70 29 20 2d 3e 20 6d 68 5f 61 6c 6c 6f 63 20 3d 20 49 53 46 52 45 45 3b 0a 20 20 20 20 20 ┆ cp) -> mh_alloc = ISFREE; ┆ 0x04f200…09e600 20 28 28 73 74 72 75 63 74 20 6d 68 65 61 64 20 2a 29 20 63 70 29 20 2d 3e 20 6d 68 5f 69 6e 64 ┆ ((struct mhead *) cp) -> mh_ind┆ 0x04f200…09e600 65 78 20 3d 20 6e 75 3b 0a 23 69 66 64 65 66 20 72 63 68 65 63 6b 0a 20 20 20 20 20 20 28 28 73 ┆ex = nu; #ifdef rcheck ((s┆ 0x04f200…09e600 74 72 75 63 74 20 6d 68 65 61 64 20 2a 29 20 63 70 29 20 2d 3e 20 6d 68 5f 6d 61 67 69 63 34 20 ┆truct mhead *) cp) -> mh_magic4 ┆ 0x04f200…09e600 3d 20 4d 41 47 49 43 46 52 45 45 34 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 72 63 68 65 63 6b 20 2a ┆= MAGICFREE4; #endif /* rcheck *┆ 0x04f200…09e600 2f 0a 23 69 66 64 65 66 20 73 63 72 69 62 62 6c 65 63 68 65 63 6b 0a 20 20 20 20 7b 0a 20 20 20 ┆/ #ifdef scribblecheck { ┆ 0x04f200…09e600 20 20 20 72 65 67 69 73 74 65 72 20 63 68 61 72 20 2a 6d 20 3d 20 28 63 68 61 72 20 2a 29 28 28 ┆ register char *m = (char *)((┆ 0x04f200…09e600 73 74 72 75 63 74 20 6d 68 65 61 64 20 2a 29 63 70 2b 31 29 3b 0a 20 20 20 20 20 20 72 65 67 69 ┆struct mhead *)cp+1); regi┆ 0x04f200…09e600 73 74 65 72 20 63 68 61 72 20 2a 65 6e 20 3d 20 28 38 3c 3c 6e 75 29 20 2b 20 63 70 3b 0a 20 20 ┆ster char *en = (8<<nu) + cp; ┆ 0x04f200…09e600 20 20 20 20 2f 2a 20 46 69 6c 6c 20 77 68 6f 6c 65 20 62 6c 6f 63 6b 20 77 69 74 68 20 4d 41 47 ┆ /* Fill whole block with MAG┆ 0x04f200…09e600 49 43 46 52 45 45 20 2a 2f 0a 20 20 20 20 20 20 77 68 69 6c 65 20 28 6d 3c 65 6e 29 20 2a 6d 2b ┆ICFREE */ while (m<en) *m+┆ 0x04f200…09e600 2b 20 3d 20 4d 41 47 49 43 46 52 45 45 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 73 ┆+ = MAGICFREE; } #endif /* s┆ 0x04f200…09e600 63 72 69 62 62 6c 65 63 68 65 63 6b 20 2a 2f 0a 20 20 20 20 20 20 63 70 20 2b 3d 20 38 20 3c 3c ┆cribblecheck */ cp += 8 <<┆ 0x04f200…09e600 20 6e 75 3b 0a 20 20 20 20 7d 0a 7d 0a 0c 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆ nu; } } /****************┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆********************************┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 20 2a 09 09 09 09 09 09 09 09 2a 0a 20 2a 09 ┆**************** * * * ┆ 0x04f200…09e600 6d 61 6c 6c 6f 63 20 2d 20 67 65 74 20 61 20 62 6c 6f 63 6b 20 6f 66 20 73 70 61 63 65 20 66 72 ┆malloc - get a block of space fr┆ 0x04f200…09e600 6f 6d 20 61 20 70 6f 6f 6c 09 09 2a 0a 20 2a 09 09 09 09 09 09 09 09 2a 0a 20 2a 2a 2a 2a 2a 2a ┆om a pool * * * ******┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆********************************┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 70 75 62 ┆**************************/ pub┆ 0x04f200…09e600 6c 69 63 20 63 68 61 72 20 2a 0a 6d 61 6c 6c 6f 63 20 28 6e 29 09 09 2f 2a 20 67 65 74 20 61 20 ┆lic char * malloc (n) /* get a ┆ 0x04f200…09e600 62 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 6e 3b 0a 7b 0a 20 20 72 65 ┆block */ unsigned n; { re┆ 0x04f200…09e600 67 69 73 74 65 72 20 73 74 72 75 63 74 20 6d 68 65 61 64 20 2a 70 3b 0a 20 20 72 65 67 69 73 74 ┆gister struct mhead *p; regist┆ 0x04f200…09e600 65 72 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 6e 62 79 74 65 73 3b 0a 20 20 72 65 67 69 73 74 ┆er unsigned int nbytes; regist┆ 0x04f200…09e600 65 72 20 69 6e 74 20 6e 75 6e 69 74 73 20 3d 20 30 3b 0a 0a 23 69 66 64 65 66 20 4d 41 4c 4c 4f ┆er int nunits = 0; #ifdef MALLO┆ 0x04f200…09e600 43 5f 44 45 42 55 47 0a 20 20 63 68 61 72 20 2a 50 41 50 41 20 3d 20 2a 28 63 68 61 72 20 2a 2a ┆C_DEBUG char *PAPA = *(char **┆ 0x04f200…09e600 29 28 26 6e 2d 32 29 3b 0a 23 65 6e 64 69 66 20 4d 41 4c 4c 4f 43 5f 44 45 42 55 47 0a 20 20 2f ┆)(&n-2); #endif MALLOC_DEBUG /┆ 0x04f200…09e600 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 62 79 74 65 73 20 61 72 65 20 ┆* Figure out how many bytes are ┆ 0x04f200…09e600 72 65 71 75 69 72 65 64 2c 20 72 6f 75 6e 64 69 6e 67 20 75 70 20 74 6f 20 74 68 65 20 6e 65 61 ┆required, rounding up to the nea┆ 0x04f200…09e600 72 65 73 74 0a 20 20 20 20 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 34 2c 20 74 68 65 6e 20 66 69 ┆rest multiple of 4, then fi┆ 0x04f200…09e600 67 75 72 65 20 6f 75 74 20 77 68 69 63 68 20 6e 65 78 74 66 5b 5d 20 61 72 65 61 20 74 6f 20 75 ┆gure out which nextf[] area to u┆ 0x04f200…09e600 73 65 20 2a 2f 0a 20 20 6e 62 79 74 65 73 20 3d 20 28 6e 20 2b 20 73 69 7a 65 6f 66 20 2a 70 20 ┆se */ nbytes = (n + sizeof *p ┆ 0x04f200…09e600 2b 20 45 58 54 52 41 20 2b 20 33 29 20 26 20 7e 33 3b 0a 20 20 7b 0a 20 20 20 20 72 65 67 69 73 ┆+ EXTRA + 3) & ~3; { regis┆ 0x04f200…09e600 74 65 72 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 20 20 73 68 69 66 74 72 20 3d 20 28 6e 62 79 ┆ter unsigned int shiftr = (nby┆ 0x04f200…09e600 74 65 73 20 2d 20 31 29 20 3e 3e 20 32 3b 0a 0a 20 20 20 20 77 68 69 6c 65 20 28 73 68 69 66 74 ┆tes - 1) >> 2; while (shift┆ 0x04f200…09e600 72 20 3e 3e 3d 20 31 29 0a 20 20 20 20 20 20 6e 75 6e 69 74 73 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 ┆r >>= 1) nunits++; } ┆ 0x04f200…09e600 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 62 6c 6f 63 6b 73 20 6f 66 20 74 68 65 ┆/* If there are no blocks of the┆ 0x04f200…09e600 20 61 70 70 72 6f 70 72 69 61 74 65 20 73 69 7a 65 2c 20 67 6f 20 67 65 74 20 73 6f 6d 65 20 2a ┆ appropriate size, go get some *┆ 0x04f200…09e600 2f 0a 20 20 2f 2a 20 43 4f 55 4c 44 20 53 50 4c 49 54 20 55 50 20 41 20 4c 41 52 47 45 52 20 42 ┆/ /* COULD SPLIT UP A LARGER B┆ 0x04f200…09e600 4c 4f 43 4b 20 48 45 52 45 20 2e 2e 2e 20 41 43 54 20 2a 2f 0a 20 20 69 66 20 28 6e 65 78 74 66 ┆LOCK HERE ... ACT */ if (nextf┆ 0x04f200…09e600 5b 6e 75 6e 69 74 73 5d 20 3d 3d 20 30 29 0a 20 20 20 20 6d 6f 72 65 63 6f 72 65 20 28 6e 75 6e ┆[nunits] == 0) morecore (nun┆ 0x04f200…09e600 69 74 73 29 3b 0a 0a 20 20 2f 2a 20 47 65 74 20 6f 6e 65 20 62 6c 6f 63 6b 20 6f 66 66 20 74 68 ┆its); /* Get one block off th┆ 0x04f200…09e600 65 20 6c 69 73 74 2c 20 61 6e 64 20 73 65 74 20 74 68 65 20 6e 65 77 20 6c 69 73 74 20 68 65 61 ┆e list, and set the new list hea┆ 0x04f200…09e600 64 20 2a 2f 0a 20 20 69 66 20 28 28 70 20 3d 20 6e 65 78 74 66 5b 6e 75 6e 69 74 73 5d 29 20 3d ┆d */ if ((p = nextf[nunits]) =┆ 0x04f200…09e600 3d 20 30 29 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e 65 78 74 66 5b 6e 75 6e 69 74 ┆= 0) return 0; nextf[nunit┆ 0x04f200…09e600 73 5d 20 3d 20 43 48 41 49 4e 20 28 70 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 ┆s] = CHAIN (p); /* Check for ┆ 0x04f200…09e600 66 72 65 65 20 62 6c 6f 63 6b 20 63 6c 6f 62 62 65 72 65 64 20 2a 2f 0a 20 20 2f 2a 20 49 66 20 ┆free block clobbered */ /* If ┆ 0x04f200…09e600 6e 6f 74 20 66 6f 72 20 74 68 69 73 20 63 68 65 63 6b 2c 20 77 65 20 77 6f 75 6c 64 20 67 6f 62 ┆not for this check, we would gob┆ 0x04f200…09e600 62 6c 65 20 61 20 63 6c 6f 62 62 65 72 65 64 20 66 72 65 65 20 63 68 61 69 6e 20 70 74 72 20 2a ┆ble a clobbered free chain ptr *┆ 0x04f200…09e600 2f 0a 20 20 2f 2a 20 61 6e 64 20 62 6f 6d 62 20 6f 75 74 20 6f 6e 20 74 68 65 20 4e 45 58 54 20 ┆/ /* and bomb out on the NEXT ┆ 0x04f200…09e600 61 6c 6c 6f 63 61 74 65 20 6f 66 20 74 68 69 73 20 73 69 7a 65 20 62 6c 6f 63 6b 20 2a 2f 0a 20 ┆allocate of this size block */ ┆ 0x04f200…09e600 20 69 66 20 28 70 20 2d 3e 20 6d 68 5f 61 6c 6c 6f 63 20 21 3d 20 49 53 46 52 45 45 20 7c 7c 20 ┆ if (p -> mh_alloc != ISFREE || ┆ 0x04f200…09e600 70 20 2d 3e 20 6d 68 5f 69 6e 64 65 78 20 21 3d 20 6e 75 6e 69 74 73 29 0a 20 20 20 20 62 6f 74 ┆p -> mh_index != nunits) bot┆ 0x04f200…09e600 63 68 20 28 22 62 6c 6f 63 6b 20 6f 6e 20 66 72 65 65 20 6c 69 73 74 20 63 6c 6f 62 62 65 72 65 ┆ch ("block on free list clobbere┆ 0x04f200…09e600 64 22 29 3b 0a 23 69 66 64 65 66 20 72 63 68 65 63 6b 0a 20 20 69 66 20 28 70 20 2d 3e 20 6d 68 ┆d"); #ifdef rcheck if (p -> mh┆ 0x04f200…09e600 5f 6d 61 67 69 63 34 20 21 3d 20 4d 41 47 49 43 46 52 45 45 34 29 0a 20 20 20 20 62 6f 74 63 68 ┆_magic4 != MAGICFREE4) botch┆ 0x04f200…09e600 20 28 22 4d 61 67 69 63 20 69 6e 20 62 6c 6f 63 6b 20 6f 6e 20 66 72 65 65 20 6c 69 73 74 20 63 ┆ ("Magic in block on free list c┆ 0x04f200…09e600 6c 6f 62 62 65 72 65 64 22 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 72 63 68 65 63 6b 20 2a 2f 0a ┆lobbered"); #endif /* rcheck */ ┆ 0x04f200…09e600 23 69 66 64 65 66 20 73 63 72 69 62 62 6c 65 63 68 65 63 6b 0a 20 20 2f 2a 20 43 68 65 63 6b 20 ┆#ifdef scribblecheck /* Check ┆ 0x04f200…09e600 66 6f 72 20 62 6c 6f 63 6b 20 66 69 6c 6c 65 64 20 77 69 74 68 20 6d 61 67 69 63 20 6e 75 6d 62 ┆for block filled with magic numb┆ 0x04f200…09e600 65 72 73 2c 20 74 68 65 6e 20 63 68 61 6e 67 65 20 74 6f 20 7a 65 72 6f 73 20 2a 2f 0a 20 20 7b ┆ers, then change to zeros */ {┆ 0x04f200…09e600 0a 20 20 20 20 72 65 67 69 73 74 65 72 20 63 68 61 72 20 20 2a 6d 20 3d 20 28 63 68 61 72 20 2a ┆ register char *m = (char *┆ 0x04f200…09e600 29 20 28 70 20 2b 20 31 29 3b 0a 20 20 20 20 72 65 67 69 73 74 65 72 20 63 68 61 72 20 2a 65 6e ┆) (p + 1); register char *en┆ 0x04f200…09e600 20 3d 20 28 38 3c 3c 70 2d 3e 6d 68 5f 69 6e 64 65 78 29 20 2b 20 28 63 68 61 72 20 2a 29 20 70 ┆ = (8<<p->mh_index) + (char *) p┆ 0x04f200…09e600 3b 0a 20 20 20 20 72 65 67 69 73 74 65 72 20 69 6e 74 20 20 62 6c 6f 63 6b 5f 76 61 6c 69 64 20 ┆; register int block_valid ┆ 0x04f200…09e600 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 6d 3c 65 6e 20 26 26 20 28 62 6c 6f 63 6b 5f 76 61 ┆= 0; while(m<en && (block_va┆ 0x04f200…09e600 6c 69 64 3d 28 2a 6d 3d 3d 4d 41 47 49 43 46 52 45 45 29 29 29 0a 20 20 20 20 20 20 2a 6d 2b 2b ┆lid=(*m==MAGICFREE))) *m++┆ 0x04f200…09e600 3d 28 63 68 61 72 29 30 3b 0a 20 20 20 20 2f 2a 20 73 6f 2c 20 73 74 61 74 75 73 20 63 6f 6d 65 ┆=(char)0; /* so, status come┆ 0x04f200…09e600 73 20 6f 75 74 20 61 73 20 31 20 69 66 20 6f 6b 2c 20 30 20 69 66 20 74 65 72 6d 69 6e 61 74 65 ┆s out as 1 if ok, 0 if terminate┆ 0x04f200…09e600 64 20 2a 2f 0a 20 20 20 20 69 66 20 28 21 62 6c 6f 63 6b 5f 76 61 6c 69 64 29 20 62 6f 74 63 68 ┆d */ if (!block_valid) botch┆ 0x04f200…09e600 20 28 22 64 61 74 61 20 6f 6e 20 66 72 65 65 20 6c 69 73 74 20 64 61 6d 61 67 65 64 22 29 3b 0a ┆ ("data on free list damaged"); ┆ 0x04f200…09e600 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 73 63 72 69 62 62 6c 65 63 68 65 63 6b 20 2a 2f 0a 20 ┆ } #endif /* scribblecheck */ ┆ 0x04f200…09e600 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 69 6e 66 6f 2c 20 61 6e 64 20 69 66 20 72 61 6e ┆ /* Fill in the info, and if ran┆ 0x04f200…09e600 67 65 20 63 68 65 63 6b 69 6e 67 2c 20 73 65 74 20 75 70 20 74 68 65 20 6d 61 67 69 63 20 6e 75 ┆ge checking, set up the magic nu┆ 0x04f200…09e600 6d 62 65 72 73 20 2a 2f 0a 20 20 70 20 2d 3e 20 6d 68 5f 61 6c 6c 6f 63 20 3d 20 49 53 41 4c 4c ┆mbers */ p -> mh_alloc = ISALL┆ 0x04f200…09e600 4f 43 3b 0a 20 20 70 20 2d 3e 20 6d 68 5f 6e 62 79 74 65 73 20 3d 20 6e 3b 0a 23 69 66 64 65 66 ┆OC; p -> mh_nbytes = n; #ifdef┆ 0x04f200…09e600 20 4d 41 4c 4c 4f 43 5f 44 45 42 55 47 0a 20 20 70 20 2d 3e 20 6d 68 5f 70 61 72 65 6e 74 20 3d ┆ MALLOC_DEBUG p -> mh_parent =┆ 0x04f200…09e600 20 50 41 50 41 3b 0a 20 20 69 66 28 21 62 61 73 65 6c 69 6e 6b 29 0a 20 20 20 20 7b 0a 20 20 20 ┆ PAPA; if(!baselink) { ┆ 0x04f200…09e600 20 20 20 62 61 73 65 6c 69 6e 6b 20 3d 20 70 3b 0a 20 20 20 20 20 20 65 6e 64 6c 69 6e 6b 20 3d ┆ baselink = p; endlink =┆ 0x04f200…09e600 20 70 3b 0a 20 20 20 20 7d 0a 20 20 65 6c 73 65 20 69 66 20 28 70 20 2d 3e 20 6d 68 5f 6c 69 6e ┆ p; } else if (p -> mh_lin┆ 0x04f200…09e600 6b 20 3d 3d 20 4e 55 4c 4c 20 26 26 20 65 6e 64 6c 69 6e 6b 20 21 3d 20 70 29 0a 20 20 20 20 7b ┆k == NULL && endlink != p) {┆ 0x04f200…09e600 0a 20 20 20 20 20 20 65 6e 64 6c 69 6e 6b 20 2d 3e 20 6d 68 5f 6c 69 6e 6b 20 3d 20 70 3b 0a 20 ┆ endlink -> mh_link = p; ┆ 0x04f200…09e600 20 20 20 20 20 65 6e 64 6c 69 6e 6b 20 3d 20 70 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 4d ┆ endlink = p; } #endif M┆ 0x04f200…09e600 41 4c 4c 4f 43 5f 44 45 42 55 47 0a 23 69 66 64 65 66 20 72 63 68 65 63 6b 0a 20 20 70 20 2d 3e ┆ALLOC_DEBUG #ifdef rcheck p ->┆ 0x04f200…09e600 20 6d 68 5f 6d 61 67 69 63 34 20 3d 20 4d 41 47 49 43 34 3b 0a 20 20 7b 0a 20 20 20 20 72 65 67 ┆ mh_magic4 = MAGIC4; { reg┆ 0x04f200…09e600 69 73 74 65 72 20 63 68 61 72 20 20 2a 6d 20 3d 20 28 63 68 61 72 20 2a 29 20 28 70 20 2b 20 31 ┆ister char *m = (char *) (p + 1┆ 0x04f200…09e600 29 20 2b 20 6e 3b 0a 23 69 66 64 65 66 20 73 63 72 69 62 62 6c 65 63 68 65 63 6b 0a 20 20 20 20 ┆) + n; #ifdef scribblecheck ┆ 0x04f200…09e600 72 65 67 69 73 74 65 72 20 63 68 61 72 20 2a 65 6e 20 3d 20 28 38 3c 3c 70 2d 3e 6d 68 5f 69 6e ┆register char *en = (8<<p->mh_in┆ 0x04f200…09e600 64 65 78 29 2b 28 63 68 61 72 20 2a 29 70 3b 0a 20 20 20 20 2f 2a 20 70 6f 69 6e 74 20 74 6f 20 ┆dex)+(char *)p; /* point to ┆ 0x04f200…09e600 65 6e 64 20 6f 66 20 62 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 20 28 6d 3c 65 6e 29 ┆end of block */ while (m<en)┆ 0x04f200…09e600 20 2a 6d 2b 2b 20 3d 20 4d 41 47 49 43 31 3b 0a 23 65 6c 73 65 20 2f 2a 20 73 63 72 69 62 62 6c ┆ *m++ = MAGIC1; #else /* scribbl┆ 0x04f200…09e600 65 63 68 65 63 6b 20 2a 2f 0a 20 20 20 20 2a 6d 2b 2b 20 3d 20 4d 41 47 49 43 31 2c 20 2a 6d 2b ┆echeck */ *m++ = MAGIC1, *m+┆ 0x04f200…09e600 2b 20 3d 20 4d 41 47 49 43 31 2c 20 2a 6d 2b 2b 20 3d 20 4d 41 47 49 43 31 2c 20 2a 6d 20 3d 20 ┆+ = MAGIC1, *m++ = MAGIC1, *m = ┆ 0x04f200…09e600 4d 41 47 49 43 31 3b 20 0a 23 65 6e 64 69 66 20 2f 2a 20 73 63 72 69 62 62 6c 65 63 68 65 63 6b ┆MAGIC1; #endif /* scribblecheck┆ 0x04f200…09e600 20 2a 2f 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 6e 6f 74 20 72 63 68 65 63 6b 20 2a 2f 0a ┆ */ } #endif /* not rcheck */ ┆ 0x04f200…09e600 23 69 66 64 65 66 20 4d 53 54 41 54 53 0a 20 20 6e 6d 61 6c 6c 6f 63 5b 6e 75 6e 69 74 73 5d 2b ┆#ifdef MSTATS nmalloc[nunits]+┆ 0x04f200…09e600 2b 3b 0a 20 20 6e 6d 61 6c 2b 2b 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 4d 53 54 41 54 53 20 2a 2f ┆+; nmal++; #endif /* MSTATS */┆ 0x04f200…09e600 0a 20 20 72 65 74 75 72 6e 20 28 63 68 61 72 20 2a 29 20 28 70 20 2b 20 31 29 3b 0a 7d 0a 0c 0a ┆ return (char *) (p + 1); } ┆ 0x04f200…09e600 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆/*******************************┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆********************************┆ 0x04f200…09e600 2a 0a 20 2a 09 09 09 09 09 09 09 09 2a 0a 20 2a 09 66 72 65 65 20 2d 20 46 72 65 65 20 61 20 62 ┆* * * * free - Free a b┆ 0x04f200…09e600 6c 6f 63 6b 20 6f 66 20 73 70 61 63 65 09 09 09 09 2a 0a 20 2a 09 09 09 09 09 09 09 09 2a 0a 20 ┆lock of space * * * ┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆********************************┆ […0x1…] 0x04f200…09e600 2f 0a 0a 70 75 62 6c 69 63 20 66 72 65 65 20 28 6d 65 6d 29 0a 20 20 20 20 20 63 68 61 72 20 2a ┆/ public free (mem) char *┆ 0x04f200…09e600 6d 65 6d 3b 0a 7b 0a 20 20 72 65 67 69 73 74 65 72 20 73 74 72 75 63 74 20 6d 68 65 61 64 20 2a ┆mem; { register struct mhead *┆ 0x04f200…09e600 70 3b 0a 23 69 66 64 65 66 20 4d 41 4c 4c 4f 43 5f 44 45 42 55 47 0a 20 20 63 68 61 72 20 2a 50 ┆p; #ifdef MALLOC_DEBUG char *P┆ 0x04f200…09e600 41 50 41 20 3d 20 2a 28 63 68 61 72 20 2a 2a 29 28 28 26 6d 65 6d 29 2d 32 29 3b 0a 23 65 6e 64 ┆APA = *(char **)((&mem)-2); #end┆ 0x04f200…09e600 69 66 20 4d 41 4c 4c 4f 43 5f 44 45 42 55 47 0a 20 20 7b 0a 20 20 20 20 72 65 67 69 73 74 65 72 ┆if MALLOC_DEBUG { register┆ 0x04f200…09e600 20 63 68 61 72 20 2a 61 70 20 3d 20 6d 65 6d 3b 0a 0a 20 20 20 20 41 53 53 45 52 54 20 28 61 70 ┆ char *ap = mem; ASSERT (ap┆ 0x04f200…09e600 20 21 3d 20 30 29 3b 0a 20 20 20 20 70 20 3d 20 28 73 74 72 75 63 74 20 6d 68 65 61 64 20 2a 29 ┆ != 0); p = (struct mhead *)┆ 0x04f200…09e600 20 61 70 20 2d 20 31 3b 0a 20 20 20 20 41 53 53 45 52 54 20 28 70 20 2d 3e 20 6d 68 5f 61 6c 6c ┆ ap - 1; ASSERT (p -> mh_all┆ 0x04f200…09e600 6f 63 20 3d 3d 20 49 53 41 4c 4c 4f 43 29 3b 0a 23 69 66 64 65 66 20 72 63 68 65 63 6b 0a 20 20 ┆oc == ISALLOC); #ifdef rcheck ┆ 0x04f200…09e600 20 20 41 53 53 45 52 54 20 28 70 20 2d 3e 20 6d 68 5f 6d 61 67 69 63 34 20 3d 3d 20 4d 41 47 49 ┆ ASSERT (p -> mh_magic4 == MAGI┆ 0x04f200…09e600 43 34 29 3b 0a 20 20 20 20 61 70 20 2b 3d 20 70 20 2d 3e 20 6d 68 5f 6e 62 79 74 65 73 3b 0a 20 ┆C4); ap += p -> mh_nbytes; ┆ 0x04f200…09e600 20 20 20 70 2d 3e 6d 68 5f 6d 61 67 69 63 34 20 3d 20 4d 41 47 49 43 46 52 45 45 34 3b 0a 20 20 ┆ p->mh_magic4 = MAGICFREE4; ┆ 0x04f200…09e600 20 20 41 53 53 45 52 54 20 28 2a 61 70 2b 2b 20 3d 3d 20 4d 41 47 49 43 31 29 3b 20 41 53 53 45 ┆ ASSERT (*ap++ == MAGIC1); ASSE┆ 0x04f200…09e600 52 54 20 28 2a 61 70 2b 2b 20 3d 3d 20 4d 41 47 49 43 31 29 3b 0a 20 20 20 20 41 53 53 45 52 54 ┆RT (*ap++ == MAGIC1); ASSERT┆ 0x04f200…09e600 20 28 2a 61 70 2b 2b 20 3d 3d 20 4d 41 47 49 43 31 29 3b 20 41 53 53 45 52 54 20 28 2a 61 70 20 ┆ (*ap++ == MAGIC1); ASSERT (*ap ┆ 0x04f200…09e600 20 20 3d 3d 20 4d 41 47 49 43 31 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 72 63 68 65 63 6b 20 2a ┆ == MAGIC1); #endif /* rcheck *┆ 0x04f200…09e600 2f 0a 20 20 7d 0a 20 20 7b 0a 20 20 20 20 72 65 67 69 73 74 65 72 20 69 6e 74 20 6e 75 6e 69 74 ┆/ } { register int nunit┆ 0x04f200…09e600 73 20 3d 20 70 20 2d 3e 20 6d 68 5f 69 6e 64 65 78 3b 0a 0a 20 20 20 20 41 53 53 45 52 54 20 28 ┆s = p -> mh_index; ASSERT (┆ 0x04f200…09e600 6e 75 6e 69 74 73 20 3c 20 4e 42 55 43 4b 45 54 53 29 3b 0a 23 69 66 64 65 66 20 73 63 72 69 62 ┆nunits < NBUCKETS); #ifdef scrib┆ 0x04f200…09e600 62 6c 65 63 68 65 63 6b 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 ┆blecheck { /* Check th┆ 0x04f200…09e600 61 74 20 75 70 70 65 72 20 73 74 75 66 66 20 77 61 73 20 73 74 69 6c 6c 20 4d 41 47 49 43 31 20 ┆at upper stuff was still MAGIC1 ┆ 0x04f200…09e600 2a 2f 0a 20 20 20 20 20 20 72 65 67 69 73 74 65 72 20 63 68 61 72 20 20 2a 6d 20 3d 20 28 63 68 ┆*/ register char *m = (ch┆ 0x04f200…09e600 61 72 20 2a 29 20 28 70 20 2b 20 31 29 20 2b 20 70 2d 3e 6d 68 5f 6e 62 79 74 65 73 3b 0a 20 20 ┆ar *) (p + 1) + p->mh_nbytes; ┆ 0x04f200…09e600 20 20 20 20 72 65 67 69 73 74 65 72 20 63 68 61 72 20 2a 65 6e 20 3d 20 28 38 3c 3c 70 2d 3e 6d ┆ register char *en = (8<<p->m┆ 0x04f200…09e600 68 5f 69 6e 64 65 78 29 20 2b 20 28 63 68 61 72 20 2a 29 20 70 3b 0a 20 20 20 20 20 20 72 65 67 ┆h_index) + (char *) p; reg┆ 0x04f200…09e600 69 73 74 65 72 20 69 6e 74 20 20 62 6c 6f 63 6b 5f 76 61 6c 69 64 20 3d 20 30 3b 0a 20 20 20 20 ┆ister int block_valid = 0; ┆ 0x04f200…09e600 20 20 77 68 69 6c 65 28 6d 3c 65 6e 20 26 26 20 28 62 6c 6f 63 6b 5f 76 61 6c 69 64 3d 28 2a 6d ┆ while(m<en && (block_valid=(*m┆ 0x04f200…09e600 2b 2b 3d 3d 4d 41 47 49 43 31 29 29 29 3b 0a 20 20 20 20 20 20 69 66 20 28 21 62 6c 6f 63 6b 5f ┆++==MAGIC1))); if (!block_┆ 0x04f200…09e600 76 61 6c 69 64 29 20 62 6f 74 63 68 20 28 22 62 6c 6f 63 6b 20 66 72 65 65 64 20 77 69 74 68 20 ┆valid) botch ("block freed with ┆ 0x04f200…09e600 64 61 74 61 20 6f 75 74 20 6f 66 20 62 6f 75 6e 64 73 22 29 3b 0a 20 20 20 20 20 20 2f 2a 20 46 ┆data out of bounds"); /* F┆ 0x04f200…09e600 69 6c 6c 20 77 68 6f 6c 65 20 62 6c 6f 63 6b 20 77 69 74 68 20 4d 41 47 49 43 46 52 45 45 20 2a ┆ill whole block with MAGICFREE *┆ 0x04f200…09e600 2f 0a 20 20 20 20 20 20 6d 20 3d 20 28 63 68 61 72 20 2a 29 20 28 70 20 2b 20 31 29 3b 0a 20 20 ┆/ m = (char *) (p + 1); ┆ 0x04f200…09e600 20 20 20 20 77 68 69 6c 65 20 28 6d 3c 65 6e 29 20 2a 6d 2b 2b 20 3d 20 4d 41 47 49 43 46 52 45 ┆ while (m<en) *m++ = MAGICFRE┆ 0x04f200…09e600 45 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 73 63 72 69 62 62 6c 65 63 68 65 63 6b ┆E; } #endif /* scribblecheck┆ 0x04f200…09e600 20 2a 2f 0a 20 20 20 20 70 20 2d 3e 20 6d 68 5f 61 6c 6c 6f 63 20 3d 20 49 53 46 52 45 45 3b 0a ┆ */ p -> mh_alloc = ISFREE; ┆ 0x04f200…09e600 20 20 20 20 43 48 41 49 4e 20 28 70 29 20 3d 20 6e 65 78 74 66 5b 6e 75 6e 69 74 73 5d 3b 0a 20 ┆ CHAIN (p) = nextf[nunits]; ┆ 0x04f200…09e600 20 20 20 6e 65 78 74 66 5b 6e 75 6e 69 74 73 5d 20 3d 20 70 3b 0a 23 69 66 64 65 66 20 4d 53 54 ┆ nextf[nunits] = p; #ifdef MST┆ 0x04f200…09e600 41 54 53 0a 20 20 20 20 6e 6d 61 6c 6c 6f 63 5b 6e 75 6e 69 74 73 5d 2d 2d 3b 0a 20 20 20 20 6e ┆ATS nmalloc[nunits]--; n┆ 0x04f200…09e600 66 72 65 2b 2b 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 4d 53 54 41 54 53 20 2a 2f 0a 20 20 7d 0a 23 ┆fre++; #endif /* MSTATS */ } #┆ 0x04f200…09e600 69 66 64 65 66 20 4d 41 4c 4c 4f 43 5f 44 45 42 55 47 0a 20 20 70 20 2d 3e 20 6d 68 5f 70 61 72 ┆ifdef MALLOC_DEBUG p -> mh_par┆ 0x04f200…09e600 65 6e 74 20 3d 20 50 41 50 41 3b 09 2f 2a 20 73 69 6e 63 65 20 69 74 20 49 53 20 66 72 65 65 64 ┆ent = PAPA; /* since it IS freed┆ 0x04f200…09e600 2e 2e 2e 20 2a 2f 0a 23 65 6e 64 69 66 20 4d 41 4c 4c 4f 43 5f 44 45 42 55 47 0a 7d 0a 0c 0a 2f ┆... */ #endif MALLOC_DEBUG } /┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆********************************┆ […0x1…] 0x04f200…09e600 0a 20 2a 09 09 09 09 09 09 09 09 2a 0a 20 2a 09 72 65 61 6c 6c 6f 63 20 2d 20 72 65 73 69 7a 65 ┆ * * * realloc - resize┆ 0x04f200…09e600 20 61 20 62 6c 6f 63 6b 2c 20 63 6f 70 79 20 69 66 20 6e 65 63 65 73 73 61 72 79 09 09 2a 0a 20 ┆ a block, copy if necessary * ┆ 0x04f200…09e600 2a 09 09 09 09 09 09 09 09 2a 0a 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆* * ********************┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆********************************┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 70 75 62 6c 69 63 20 63 68 61 72 20 2a 0a 72 65 61 ┆************/ public char * rea┆ 0x04f200…09e600 6c 6c 6f 63 20 28 6d 65 6d 2c 20 6e 29 0a 20 20 20 20 20 63 68 61 72 20 2a 6d 65 6d 3b 0a 20 20 ┆lloc (mem, n) char *mem; ┆ 0x04f200…09e600 20 20 20 72 65 67 69 73 74 65 72 20 75 6e 73 69 67 6e 65 64 20 6e 3b 0a 7b 0a 20 20 72 65 67 69 ┆ register unsigned n; { regi┆ 0x04f200…09e600 73 74 65 72 20 73 74 72 75 63 74 20 6d 68 65 61 64 20 2a 70 3b 0a 20 20 72 65 67 69 73 74 65 72 ┆ster struct mhead *p; register┆ 0x04f200…09e600 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 74 6f 63 6f 70 79 3b 0a 20 20 72 65 67 69 73 74 65 72 ┆ unsigned int tocopy; register┆ 0x04f200…09e600 20 69 6e 74 20 6e 62 79 74 65 73 3b 0a 20 20 72 65 67 69 73 74 65 72 20 69 6e 74 20 6e 75 6e 69 ┆ int nbytes; register int nuni┆ 0x04f200…09e600 74 73 3b 0a 23 69 66 64 65 66 20 4d 41 4c 4c 4f 43 5f 44 45 42 55 47 0a 20 20 63 68 61 72 20 2a ┆ts; #ifdef MALLOC_DEBUG char *┆ 0x04f200…09e600 50 41 50 41 20 3d 20 2a 28 63 68 61 72 20 2a 2a 29 28 28 26 6d 65 6d 29 2d 32 29 3b 0a 23 65 6e ┆PAPA = *(char **)((&mem)-2); #en┆ 0x04f200…09e600 64 69 66 20 4d 41 4c 4c 4f 43 5f 44 45 42 55 47 0a 0a 20 20 69 66 20 28 28 70 20 3d 20 28 73 74 ┆dif MALLOC_DEBUG if ((p = (st┆ 0x04f200…09e600 72 75 63 74 20 6d 68 65 61 64 20 2a 29 20 6d 65 6d 29 20 3d 3d 20 30 29 0a 20 20 20 20 72 65 74 ┆ruct mhead *) mem) == 0) ret┆ 0x04f200…09e600 75 72 6e 20 6d 61 6c 6c 6f 63 20 28 6e 29 3b 09 09 2f 2a 20 77 65 6c 6c 2c 20 73 68 6f 75 6c 64 ┆urn malloc (n); /* well, should┆ 0x04f200…09e600 6e 27 74 20 72 65 61 6c 6c 6f 63 28 4e 55 4c 4c 29 20 61 6e 79 77 61 79 2e 2e 2e 20 2a 2f 0a 20 ┆n't realloc(NULL) anyway... */ ┆ 0x04f200…09e600 20 70 2d 2d 3b 0a 23 69 66 64 65 66 20 4d 41 4c 4c 4f 43 5f 44 45 42 55 47 0a 20 20 70 20 2d 3e ┆ p--; #ifdef MALLOC_DEBUG p ->┆ 0x04f200…09e600 20 6d 68 5f 70 61 72 65 6e 74 20 3d 20 50 41 50 41 3b 0a 23 65 6e 64 69 66 20 4d 41 4c 4c 4f 43 ┆ mh_parent = PAPA; #endif MALLOC┆ 0x04f200…09e600 5f 44 45 42 55 47 0a 20 20 6e 75 6e 69 74 73 20 3d 20 70 20 2d 3e 20 6d 68 5f 69 6e 64 65 78 3b ┆_DEBUG nunits = p -> mh_index;┆ 0x04f200…09e600 0a 20 20 41 53 53 45 52 54 20 28 70 20 2d 3e 20 6d 68 5f 61 6c 6c 6f 63 20 3d 3d 20 49 53 41 4c ┆ ASSERT (p -> mh_alloc == ISAL┆ 0x04f200…09e600 4c 4f 43 29 3b 0a 20 20 74 6f 63 6f 70 79 20 3d 20 70 20 2d 3e 20 6d 68 5f 6e 62 79 74 65 73 3b ┆LOC); tocopy = p -> mh_nbytes;┆ 0x04f200…09e600 0a 23 69 66 64 65 66 20 72 63 68 65 63 6b 0a 20 20 41 53 53 45 52 54 20 28 70 20 2d 3e 20 6d 68 ┆ #ifdef rcheck ASSERT (p -> mh┆ 0x04f200…09e600 5f 6d 61 67 69 63 34 20 3d 3d 20 4d 41 47 49 43 34 29 3b 0a 20 20 7b 0a 20 20 20 20 72 65 67 69 ┆_magic4 == MAGIC4); { regi┆ 0x04f200…09e600 73 74 65 72 20 63 68 61 72 20 2a 6d 20 3d 20 6d 65 6d 20 2b 20 74 6f 63 6f 70 79 3b 0a 23 69 66 ┆ster char *m = mem + tocopy; #if┆ 0x04f200…09e600 64 65 66 20 73 63 72 69 62 62 6c 65 63 68 65 63 6b 0a 20 20 20 20 72 65 67 69 73 74 65 72 20 63 ┆def scribblecheck register c┆ 0x04f200…09e600 68 61 72 20 2a 65 6e 20 3d 20 28 38 3c 3c 70 2d 3e 6d 68 5f 69 6e 64 65 78 29 20 2b 20 28 63 68 ┆har *en = (8<<p->mh_index) + (ch┆ 0x04f200…09e600 61 72 20 2a 29 70 3b 0a 20 20 20 20 72 65 67 69 73 74 65 72 20 69 6e 74 20 62 6c 6f 63 6b 5f 76 ┆ar *)p; register int block_v┆ 0x04f200…09e600 61 6c 69 64 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 6d 3c 65 6e 20 26 26 20 28 62 6c 6f ┆alid = 0; while(m<en && (blo┆ 0x04f200…09e600 63 6b 5f 76 61 6c 69 64 3d 28 2a 6d 2b 2b 3d 3d 4d 41 47 49 43 31 29 29 29 3b 0a 20 20 20 20 69 ┆ck_valid=(*m++==MAGIC1))); i┆ 0x04f200…09e600 66 20 28 21 62 6c 6f 63 6b 5f 76 61 6c 69 64 29 20 62 6f 74 63 68 20 28 22 6f 75 74 20 6f 66 20 ┆f (!block_valid) botch ("out of ┆ 0x04f200…09e600 62 6f 75 6e 64 73 20 64 61 74 61 20 6f 6e 20 72 65 61 6c 6c 6f 63 22 29 3b 0a 23 65 6c 73 65 20 ┆bounds data on realloc"); #else ┆ 0x04f200…09e600 2f 2a 20 73 63 72 69 62 62 6c 65 63 68 65 63 6b 20 2a 2f 0a 20 20 20 20 41 53 53 45 52 54 20 28 ┆/* scribblecheck */ ASSERT (┆ 0x04f200…09e600 2a 6d 2b 2b 20 3d 3d 20 4d 41 47 49 43 31 29 3b 20 41 53 53 45 52 54 20 28 2a 6d 2b 2b 20 3d 3d ┆*m++ == MAGIC1); ASSERT (*m++ ==┆ 0x04f200…09e600 20 4d 41 47 49 43 31 29 3b 0a 20 20 20 20 41 53 53 45 52 54 20 28 2a 6d 2b 2b 20 3d 3d 20 4d 41 ┆ MAGIC1); ASSERT (*m++ == MA┆ 0x04f200…09e600 47 49 43 31 29 3b 20 41 53 53 45 52 54 20 28 2a 6d 20 20 20 3d 3d 20 4d 41 47 49 43 31 29 3b 0a ┆GIC1); ASSERT (*m == MAGIC1); ┆ 0x04f200…09e600 23 65 6e 64 69 66 20 2f 2a 20 73 63 72 69 62 62 6c 65 63 68 65 63 6b 20 2a 2f 0a 20 20 7d 0a 23 ┆#endif /* scribblecheck */ } #┆ 0x04f200…09e600 65 6e 64 69 66 20 2f 2a 20 6e 6f 74 20 72 63 68 65 63 6b 20 2a 2f 0a 0a 20 20 2f 2a 20 53 65 65 ┆endif /* not rcheck */ /* See┆ 0x04f200…09e600 20 69 66 20 64 65 73 69 72 65 64 20 73 69 7a 65 20 72 6f 75 6e 64 73 20 74 6f 20 73 61 6d 65 20 ┆ if desired size rounds to same ┆ 0x04f200…09e600 70 6f 77 65 72 20 6f 66 20 32 20 61 73 20 61 63 74 75 61 6c 20 73 69 7a 65 2e 20 2a 2f 0a 20 20 ┆power of 2 as actual size. */ ┆ 0x04f200…09e600 6e 62 79 74 65 73 20 3d 20 28 6e 20 2b 20 73 69 7a 65 6f 66 20 2a 70 20 2b 20 45 58 54 52 41 20 ┆nbytes = (n + sizeof *p + EXTRA ┆ 0x04f200…09e600 2b 20 37 29 20 26 20 7e 37 3b 0a 0a 20 20 2f 2a 20 49 66 20 6f 6b 2c 20 75 73 65 20 74 68 65 20 ┆+ 7) & ~7; /* If ok, use the ┆ 0x04f200…09e600 73 61 6d 65 20 62 6c 6f 63 6b 2c 20 6a 75 73 74 20 6d 61 72 6b 69 6e 67 20 69 74 73 20 73 69 7a ┆same block, just marking its siz┆ 0x04f200…09e600 65 20 61 73 20 63 68 61 6e 67 65 64 2e 20 20 2a 2f 0a 20 20 69 66 20 28 6e 62 79 74 65 73 20 3e ┆e as changed. */ if (nbytes >┆ 0x04f200…09e600 20 28 34 20 3c 3c 20 6e 75 6e 69 74 73 29 20 26 26 20 6e 62 79 74 65 73 20 3c 3d 20 28 38 20 3c ┆ (4 << nunits) && nbytes <= (8 <┆ 0x04f200…09e600 3c 20 6e 75 6e 69 74 73 29 29 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 2f 2a 20 48 65 72 65 20 77 ┆< nunits)) { /* Here w┆ 0x04f200…09e600 65 20 63 68 65 63 6b 20 6f 6e 20 72 65 61 6c 6c 6f 63 20 69 66 20 77 65 20 61 72 65 20 67 72 61 ┆e check on realloc if we are gra┆ 0x04f200…09e600 62 62 69 6e 67 20 75 6e 75 73 65 64 20 73 70 61 63 65 20 2a 2f 0a 23 69 66 64 65 66 20 72 63 68 ┆bbing unused space */ #ifdef rch┆ 0x04f200…09e600 65 63 6b 0a 20 20 20 20 20 20 72 65 67 69 73 74 65 72 20 63 68 61 72 20 2a 6d 20 3d 20 6d 65 6d ┆eck register char *m = mem┆ 0x04f200…09e600 20 2b 20 74 6f 63 6f 70 79 3b 0a 23 69 66 64 65 66 20 73 63 72 69 62 62 6c 65 63 68 65 63 6b 0a ┆ + tocopy; #ifdef scribblecheck ┆ 0x04f200…09e600 20 20 20 20 20 20 72 65 67 69 73 74 65 72 20 63 68 61 72 20 2a 65 6e 20 3d 20 28 38 3c 3c 70 2d ┆ register char *en = (8<<p-┆ 0x04f200…09e600 3e 6d 68 5f 69 6e 64 65 78 29 20 2b 20 28 63 68 61 72 20 2a 29 20 70 3b 0a 20 20 20 20 20 20 77 ┆>mh_index) + (char *) p; w┆ 0x04f200…09e600 68 69 6c 65 20 28 6d 3c 65 6e 29 20 2a 6d 2b 2b 3d 28 63 68 61 72 29 30 3b 0a 23 65 6c 73 65 20 ┆hile (m<en) *m++=(char)0; #else ┆ 0x04f200…09e600 2f 2a 20 73 63 72 69 62 62 6c 65 63 68 65 63 6b 20 2a 2f 0a 20 20 20 20 20 20 2a 6d 2b 2b 20 3d ┆/* scribblecheck */ *m++ =┆ 0x04f200…09e600 20 30 3b 20 20 2a 6d 2b 2b 20 3d 20 30 3b 20 20 2a 6d 2b 2b 20 3d 20 30 3b 20 20 2a 6d 2b 2b 20 ┆ 0; *m++ = 0; *m++ = 0; *m++ ┆ 0x04f200…09e600 3d 20 30 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 73 63 72 69 62 62 6c 65 63 68 65 63 6b 20 2a 2f 0a ┆= 0; #endif /* scribblecheck */ ┆ 0x04f200…09e600 20 20 20 20 20 20 6d 20 3d 20 6d 65 6d 20 2b 20 6e 3b 0a 23 69 66 64 65 66 20 73 63 72 69 62 62 ┆ m = mem + n; #ifdef scribb┆ 0x04f200…09e600 6c 65 63 68 65 63 6b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 6d 3c 65 6e 29 20 2a 6d 2b 2b 20 3d ┆lecheck while(m<en) *m++ =┆ 0x04f200…09e600 20 4d 41 47 49 43 31 3b 0a 23 65 6c 73 65 20 2f 2a 20 73 63 72 69 62 62 6c 65 63 68 65 63 6b 20 ┆ MAGIC1; #else /* scribblecheck ┆ 0x04f200…09e600 2a 2f 0a 20 20 20 20 20 20 2a 6d 2b 2b 20 3d 20 4d 41 47 49 43 31 3b 20 20 2a 6d 2b 2b 20 3d 20 ┆*/ *m++ = MAGIC1; *m++ = ┆ 0x04f200…09e600 4d 41 47 49 43 31 3b 20 20 2a 6d 2b 2b 20 3d 20 4d 41 47 49 43 31 3b 20 20 2a 6d 2b 2b 20 3d 20 ┆MAGIC1; *m++ = MAGIC1; *m++ = ┆ 0x04f200…09e600 4d 41 47 49 43 31 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 73 63 72 69 62 62 6c 65 63 68 65 63 6b 20 ┆MAGIC1; #endif /* scribblecheck ┆ 0x04f200…09e600 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 6e 6f 74 20 72 63 68 65 63 6b 20 2a 2f 0a 20 20 20 20 20 ┆*/ #endif /* not rcheck */ ┆ 0x04f200…09e600 20 70 2d 3e 20 6d 68 5f 6e 62 79 74 65 73 20 3d 20 6e 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e ┆ p-> mh_nbytes = n; return┆ 0x04f200…09e600 20 6d 65 6d 3b 0a 20 20 20 20 7d 0a 0a 20 20 69 66 20 28 6e 20 3c 20 74 6f 63 6f 70 79 29 0a 20 ┆ mem; } if (n < tocopy) ┆ 0x04f200…09e600 20 20 20 74 6f 63 6f 70 79 20 3d 20 6e 3b 0a 20 20 7b 0a 20 20 20 20 72 65 67 69 73 74 65 72 20 ┆ tocopy = n; { register ┆ 0x04f200…09e600 63 68 61 72 20 2a 6e 65 77 3b 0a 0a 20 20 20 20 69 66 20 28 28 6e 65 77 20 3d 20 6d 61 6c 6c 6f ┆char *new; if ((new = mallo┆ 0x04f200…09e600 63 20 28 6e 29 29 20 3d 3d 20 30 29 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 ┆c (n)) == 0) return 0; ┆ 0x04f200…09e600 20 62 63 6f 70 79 20 28 6d 65 6d 2c 20 6e 65 77 2c 20 74 6f 63 6f 70 79 29 3b 0a 20 20 20 20 66 ┆ bcopy (mem, new, tocopy); f┆ 0x04f200…09e600 72 65 65 20 28 6d 65 6d 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6e 65 77 3b 0a 20 20 7d 0a 7d ┆ree (mem); return new; } }┆ 0x04f200…09e600 0a 0c 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆ /****************************┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆********************************┆ 0x04f200…09e600 2a 2a 2a 2a 0a 20 2a 09 09 09 09 09 09 09 09 2a 0a 20 2a 09 4d 65 6d 6f 72 79 20 53 74 61 74 69 ┆**** * * * Memory Stati┆ 0x04f200…09e600 73 74 69 63 73 20 73 74 75 66 66 09 09 09 09 09 2a 0a 20 2a 09 09 09 09 09 09 09 09 2a 0a 20 2a ┆stics stuff * * * *┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆********************************┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f ┆*******************************/┆ 0x04f200…09e600 0a 0a 23 69 66 64 65 66 20 4d 53 54 41 54 53 0a 2f 2a 20 52 65 74 75 72 6e 20 73 74 61 74 69 73 ┆ #ifdef MSTATS /* Return statis┆ 0x04f200…09e600 74 69 63 73 20 64 65 73 63 72 69 62 69 6e 67 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 62 6c ┆tics describing allocation of bl┆ 0x04f200…09e600 6f 63 6b 73 20 6f 66 20 73 69 7a 65 20 32 2a 2a 6e 2e 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 70 ┆ocks of size 2**n. */ #ifndef p┆ 0x04f200…09e600 75 62 6c 69 63 0a 73 74 72 75 63 74 20 6d 73 74 61 74 73 5f 76 61 6c 75 65 0a 20 20 7b 0a 20 20 ┆ublic struct mstats_value { ┆ 0x04f200…09e600 20 20 69 6e 74 20 62 6c 6f 63 6b 73 69 7a 65 3b 0a 20 20 20 20 69 6e 74 20 6e 66 72 65 65 3b 0a ┆ int blocksize; int nfree; ┆ 0x04f200…09e600 20 20 20 20 69 6e 74 20 6e 75 73 65 64 3b 0a 20 20 7d 3b 0a 23 65 6e 64 69 66 20 70 75 62 6c 69 ┆ int nused; }; #endif publi┆ 0x04f200…09e600 63 0a 0a 70 75 62 6c 69 63 20 73 74 72 75 63 74 20 6d 73 74 61 74 73 5f 76 61 6c 75 65 0a 6d 61 ┆c public struct mstats_value ma┆ 0x04f200…09e600 6c 6c 6f 63 5f 73 74 61 74 73 20 28 73 69 7a 65 29 0a 20 20 20 20 20 69 6e 74 20 73 69 7a 65 3b ┆lloc_stats (size) int size;┆ 0x04f200…09e600 0a 7b 0a 09 73 74 72 75 63 74 20 6d 73 74 61 74 73 5f 76 61 6c 75 65 20 76 3b 0a 09 72 65 67 69 ┆ { struct mstats_value v; regi┆ 0x04f200…09e600 73 74 65 72 20 69 6e 74 20 69 3b 0a 09 72 65 67 69 73 74 65 72 20 73 74 72 75 63 74 20 6d 68 65 ┆ster int i; register struct mhe┆ 0x04f200…09e600 61 64 20 2a 70 3b 0a 0a 09 76 2e 6e 66 72 65 65 20 3d 20 30 3b 0a 0a 09 69 66 20 28 73 69 7a 65 ┆ad *p; v.nfree = 0; if (size┆ 0x04f200…09e600 20 3c 20 30 20 7c 7c 20 73 69 7a 65 20 3e 3d 20 4e 42 55 43 4b 45 54 53 29 20 7b 0a 09 09 76 2e ┆ < 0 || size >= NBUCKETS) { v.┆ 0x04f200…09e600 62 6c 6f 63 6b 73 69 7a 65 20 3d 20 30 3b 0a 09 09 76 2e 6e 75 73 65 64 20 3d 20 30 3b 0a 09 09 ┆blocksize = 0; v.nused = 0; ┆ 0x04f200…09e600 72 65 74 75 72 6e 20 76 3b 0a 09 7d 0a 0a 09 76 2e 62 6c 6f 63 6b 73 69 7a 65 20 3d 20 31 20 3c ┆return v; } v.blocksize = 1 <┆ 0x04f200…09e600 3c 20 28 73 69 7a 65 20 2b 20 33 29 3b 0a 09 76 2e 6e 75 73 65 64 20 3d 20 6e 6d 61 6c 6c 6f 63 ┆< (size + 3); v.nused = nmalloc┆ 0x04f200…09e600 5b 73 69 7a 65 5d 3b 0a 0a 09 66 6f 72 20 28 70 20 3d 20 6e 65 78 74 66 5b 73 69 7a 65 5d 3b 20 ┆[size]; for (p = nextf[size]; ┆ 0x04f200…09e600 70 3b 20 70 20 3d 20 43 48 41 49 4e 20 28 70 29 29 0a 09 09 76 2e 6e 66 72 65 65 2b 2b 3b 0a 0a ┆p; p = CHAIN (p)) v.nfree++; ┆ 0x04f200…09e600 09 72 65 74 75 72 6e 20 76 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 73 68 6f 77 61 6c 6c 20 2d 20 70 72 ┆ return v; } /* * showall - pr┆ 0x04f200…09e600 69 6e 74 20 6f 75 74 20 73 74 61 74 69 73 74 69 63 73 20 61 62 6f 75 74 20 6d 61 6c 6c 6f 63 0a ┆int out statistics about malloc ┆ 0x04f200…09e600 20 2a 20 0a 20 2a 20 50 72 69 6e 74 73 20 74 77 6f 20 6c 69 6e 65 73 20 6f 66 20 6e 75 6d 62 65 ┆ * * Prints two lines of numbe┆ 0x04f200…09e600 72 73 2c 20 6f 6e 65 20 73 68 6f 77 69 6e 67 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 ┆rs, one showing the length of th┆ 0x04f200…09e600 65 20 66 72 65 65 20 6c 69 73 74 0a 20 2a 20 66 6f 72 20 65 61 63 68 20 73 69 7a 65 20 63 61 74 ┆e free list * for each size cat┆ 0x04f200…09e600 65 67 6f 72 79 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 73 68 6f 77 69 6e 67 20 74 68 65 20 6e 75 ┆egory, the second showing the nu┆ 0x04f200…09e600 6d 62 65 72 20 6f 66 20 6d 61 6c 6c 6f 63 73 20 2d 0a 20 2a 20 66 72 65 65 73 20 66 6f 72 20 65 ┆mber of mallocs - * frees for e┆ 0x04f200…09e600 61 63 68 20 73 69 7a 65 20 63 61 74 65 67 6f 72 79 2e 0a 20 2a 2f 0a 73 68 6f 77 61 6c 6c 28 76 ┆ach size category. */ showall(v┆ 0x04f200…09e600 29 0a 09 63 68 61 72 20 2a 2a 76 3b 0a 7b 0a 20 20 09 72 65 67 69 73 74 65 72 20 69 6e 74 20 69 ┆) char **v; { register int i┆ 0x04f200…09e600 2c 20 6a 3b 0a 20 20 09 72 65 67 69 73 74 65 72 20 73 74 72 75 63 74 20 6d 68 65 61 64 20 2a 70 ┆, j; register struct mhead *p┆ 0x04f200…09e600 3b 0a 20 20 09 69 6e 74 20 74 6f 74 66 72 65 65 20 3d 20 30 2c 0a 20 20 09 74 6f 74 75 73 65 64 ┆; int totfree = 0, totused┆ 0x04f200…09e600 20 3d 20 30 3b 0a 0a 20 20 09 70 72 69 6e 74 66 28 22 74 63 73 68 20 6d 65 6d 6f 72 79 20 61 6c ┆ = 0; printf("tcsh memory al┆ 0x04f200…09e600 6c 6f 63 61 74 69 6f 6e 20 73 74 61 74 69 73 74 69 63 73 5c 6e 66 72 65 65 3a 5c 74 22 29 3b 0a ┆location statistics\nfree:\t"); ┆ 0x04f200…09e600 20 20 09 66 6f 72 20 28 69 20 3d 20 30 3b 20 69 20 3c 20 4e 42 55 43 4b 45 54 53 3b 20 69 2b 2b ┆ for (i = 0; i < NBUCKETS; i++┆ 0x04f200…09e600 29 20 7b 0a 09 09 6a 3d 30 3b 0a 20 20 09 09 66 6f 72 20 28 70 20 3d 20 6e 65 78 74 66 5b 69 5d ┆) { j=0; for (p = nextf[i]┆ 0x04f200…09e600 3b 20 70 3b 20 70 20 3d 20 43 48 41 49 4e 28 70 29 29 0a 20 20 09 09 09 6a 2b 2b 3b 0a 20 20 09 ┆; p; p = CHAIN(p)) j++; ┆ 0x04f200…09e600 09 70 72 69 6e 74 66 28 22 20 25 34 64 22 2c 20 6a 29 3b 0a 20 20 09 09 74 6f 74 66 72 65 65 20 ┆ printf(" %4d", j); totfree ┆ 0x04f200…09e600 2b 3d 20 6a 20 2a 20 28 31 20 3c 3c 20 28 69 20 2b 20 33 29 29 3b 0a 20 20 09 7d 0a 20 20 09 70 ┆+= j * (1 << (i + 3)); } p┆ 0x04f200…09e600 72 69 6e 74 66 28 22 5c 6e 75 73 65 64 3a 5c 74 22 29 3b 0a 20 20 09 66 6f 72 20 28 69 20 3d 20 ┆rintf("\nused:\t"); for (i = ┆ 0x04f200…09e600 30 3b 20 69 20 3c 20 4e 42 55 43 4b 45 54 53 3b 20 69 2b 2b 29 20 7b 0a 20 20 09 09 70 72 69 6e ┆0; i < NBUCKETS; i++) { prin┆ 0x04f200…09e600 74 66 28 22 20 25 34 64 22 2c 20 6e 6d 61 6c 6c 6f 63 5b 69 5d 29 3b 0a 20 20 09 09 74 6f 74 75 ┆tf(" %4d", nmalloc[i]); totu┆ 0x04f200…09e600 73 65 64 20 2b 3d 20 6e 6d 61 6c 6c 6f 63 5b 69 5d 20 2a 20 28 31 20 3c 3c 20 28 69 20 2b 20 33 ┆sed += nmalloc[i] * (1 << (i + 3┆ 0x04f200…09e600 29 29 3b 0a 20 20 09 7d 0a 20 20 09 70 72 69 6e 74 66 28 22 5c 6e 5c 74 54 6f 74 61 6c 20 69 6e ┆)); } printf("\n\tTotal in┆ 0x04f200…09e600 20 75 73 65 3a 20 25 64 2c 20 74 6f 74 61 6c 20 66 72 65 65 3a 20 25 64 5c 6e 22 2c 0a 09 20 20 ┆ use: %d, total free: %d\n", ┆ 0x04f200…09e600 20 20 74 6f 74 75 73 65 64 2c 20 74 6f 74 66 72 65 65 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0c 0a ┆ totused, totfree); } #endif ┆ 0x04f200…09e600 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆/*******************************┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆********************************┆ 0x04f200…09e600 2a 0a 20 2a 09 09 09 09 09 09 09 09 2a 0a 20 2a 09 53 74 75 66 66 20 68 61 76 69 6e 67 20 74 6f ┆* * * * Stuff having to┆ 0x04f200…09e600 20 64 6f 20 77 69 74 68 20 64 65 74 65 72 6d 69 6e 69 6e 67 20 6d 65 6d 6f 72 79 20 6c 69 6d 69 ┆ do with determining memory limi┆ 0x04f200…09e600 74 73 09 2a 0a 20 2a 09 09 09 09 09 09 09 09 2a 0a 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆ts * * * **************┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆********************************┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 09 54 68 69 73 20 ┆******************/ /* * This ┆ 0x04f200…09e600 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 ┆function returns the total numbe┆ 0x04f200…09e600 72 20 6f 66 20 62 79 74 65 73 20 74 68 61 74 20 74 68 65 20 70 72 6f 63 65 73 73 0a 20 2a 09 77 ┆r of bytes that the process * w┆ 0x04f200…09e600 69 6c 6c 20 62 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 76 69 61 20 74 ┆ill be allowed to allocate via t┆ 0x04f200…09e600 68 65 20 73 62 72 6b 28 32 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20 4f 6e 0a 20 2a 09 42 ┆he sbrk(2) system call. On * B┆ 0x04f200…09e600 53 44 20 73 79 73 74 65 6d 73 20 74 68 69 73 20 69 73 20 74 68 65 20 74 6f 74 61 6c 20 73 70 61 ┆SD systems this is the total spa┆ 0x04f200…09e600 63 65 20 61 6c 6c 6f 63 61 74 61 62 6c 65 20 74 6f 20 73 74 61 63 6b 20 61 6e 64 0a 20 2a 09 64 ┆ce allocatable to stack and * d┆ 0x04f200…09e600 61 74 61 2e 20 20 4f 6e 20 55 53 47 20 73 79 73 74 65 6d 73 20 74 68 69 73 20 69 73 20 74 68 65 ┆ata. On USG systems this is the┆ 0x04f200…09e600 20 64 61 74 61 20 73 70 61 63 65 20 6f 6e 6c 79 2e 0a 20 2a 2f 0a 0a 23 69 66 64 65 66 20 55 53 ┆ data space only. */ #ifdef US┆ 0x04f200…09e600 47 0a 0a 70 75 62 6c 69 63 20 67 65 74 5f 6c 69 6d 5f 64 61 74 61 20 28 29 0a 7b 0a 20 20 65 78 ┆G public get_lim_data () { ex┆ 0x04f200…09e600 74 65 72 6e 20 6c 6f 6e 67 20 75 6c 69 6d 69 74 20 28 29 3b 0a 20 20 20 20 0a 20 20 6c 69 6d 5f ┆tern long ulimit (); lim_┆ 0x04f200…09e600 64 61 74 61 20 3d 20 75 6c 69 6d 69 74 20 28 33 2c 20 30 29 3b 0a 20 20 6c 69 6d 5f 64 61 74 61 ┆data = ulimit (3, 0); lim_data┆ 0x04f200…09e600 20 2d 3d 20 28 6c 6f 6e 67 29 20 64 61 74 61 5f 73 70 61 63 65 5f 73 74 61 72 74 3b 0a 7d 0a 0a ┆ -= (long) data_space_start; } ┆ 0x04f200…09e600 23 65 6c 73 65 20 2f 2a 20 6e 6f 74 20 55 53 47 20 2a 2f 0a 23 69 66 6e 64 65 66 20 42 53 44 34 ┆#else /* not USG */ #ifndef BSD4┆ 0x04f200…09e600 32 0a 0a 70 75 62 6c 69 63 20 67 65 74 5f 6c 69 6d 5f 64 61 74 61 20 28 29 0a 7b 0a 20 20 6c 69 ┆2 public get_lim_data () { li┆ 0x04f200…09e600 6d 5f 64 61 74 61 20 3d 20 76 6c 69 6d 69 74 20 28 4c 49 4d 5f 44 41 54 41 2c 20 2d 31 29 3b 0a ┆m_data = vlimit (LIM_DATA, -1); ┆ 0x04f200…09e600 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20 42 53 44 34 32 20 2a 2f 0a 0a 70 75 62 6c 69 63 20 67 65 74 ┆} #else /* BSD42 */ public get┆ 0x04f200…09e600 5f 6c 69 6d 5f 64 61 74 61 20 28 29 0a 7b 0a 20 20 73 74 72 75 63 74 20 72 6c 69 6d 69 74 20 58 ┆_lim_data () { struct rlimit X┆ 0x04f200…09e600 58 72 6c 69 6d 69 74 3b 0a 0a 20 20 67 65 74 72 6c 69 6d 69 74 20 28 52 4c 49 4d 49 54 5f 44 41 ┆Xrlimit; getrlimit (RLIMIT_DA┆ 0x04f200…09e600 54 41 2c 20 26 58 58 72 6c 69 6d 69 74 29 3b 0a 20 20 6c 69 6d 5f 64 61 74 61 20 3d 20 58 58 72 ┆TA, &XXrlimit); lim_data = XXr┆ 0x04f200…09e600 6c 69 6d 69 74 2e 72 6c 69 6d 5f 63 75 72 3b 09 09 2f 2a 20 73 6f 66 74 20 6c 69 6d 69 74 20 2a ┆limit.rlim_cur; /* soft limit *┆ 0x04f200…09e600 2f 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 42 53 44 34 32 20 2a 2f 0a 23 65 6e 64 69 66 20 2f ┆/ } #endif /* BSD42 */ #endif /┆ 0x04f200…09e600 2a 20 6e 6f 74 20 55 53 47 20 2a 2f 0a 23 69 66 64 65 66 20 4d 41 4c 4c 4f 43 5f 44 45 42 55 47 ┆* not USG */ #ifdef MALLOC_DEBUG┆ 0x04f200…09e600 0a 2f 2a 0a 20 48 65 72 65 20 77 65 20 68 61 76 65 20 74 68 65 20 69 6e 74 65 72 65 73 74 69 6e ┆ /* Here we have the interestin┆ 0x04f200…09e600 67 20 64 75 6d 70 20 72 6f 75 74 69 6e 65 73 20 74 6f 20 64 65 73 63 72 69 62 65 20 74 68 65 20 ┆g dump routines to describe the ┆ 0x04f200…09e600 69 6e 6e 65 72 0a 20 73 74 61 74 65 20 6f 66 20 6d 61 6c 6c 6f 63 2e 0a 20 2a 2f 0a 0a 23 69 6e ┆inner state of malloc. */ #in┆ 0x04f200…09e600 63 6c 75 64 65 20 3c 61 2e 6f 75 74 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 61 62 2e 68 ┆clude <a.out.h> #include <stab.h┆ 0x04f200…09e600 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 66 69 6c 65 2e 68 3e 0a 0a 2f 2a 0a 20 2a 20 6d ┆> #include <sys/file.h> /* * m┆ 0x04f200…09e600 61 6c 6c 6f 63 5f 64 75 6d 70 5f 61 6c 6c 20 2d 2d 2d 20 64 69 73 70 6c 61 79 73 20 77 68 61 74 ┆alloc_dump_all --- displays what┆ 0x04f200…09e600 20 72 6f 75 74 69 6e 65 73 20 6d 61 6c 6c 6f 63 65 64 20 77 68 61 74 20 61 6e 64 20 77 68 65 6e ┆ routines malloced what and when┆ 0x04f200…09e600 2e 0a 20 2a 0a 20 2a 20 54 68 69 73 20 69 73 20 61 20 67 72 6f 73 73 20 6b 6c 75 64 67 65 2e 20 ┆. * * This is a gross kludge. ┆ 0x04f200…09e600 20 48 6f 77 65 76 65 72 2c 20 69 74 27 73 20 77 6f 6e 64 65 72 66 75 6c 20 66 6f 72 20 66 69 6e ┆ However, it's wonderful for fin┆ 0x04f200…09e600 64 69 6e 67 20 6d 65 6d 6f 72 79 0a 20 2a 20 6c 65 61 6b 73 20 61 6e 64 20 6f 74 68 65 72 20 6d ┆ding memory * leaks and other m┆ 0x04f200…09e600 61 6c 6c 6f 63 20 70 72 6f 62 6c 65 6d 73 2e 20 20 0a 20 2a 2f 0a 6d 61 6c 6c 6f 63 5f 64 75 6d ┆alloc problems. */ malloc_dum┆ 0x04f200…09e600 70 5f 61 6c 6c 28 66 69 6c 65 29 0a 20 20 20 20 20 63 68 61 72 20 2a 66 69 6c 65 3b 0a 7b 0a 20 ┆p_all(file) char *file; { ┆ 0x04f200…09e600 20 69 6e 74 20 66 64 3b 0a 20 20 73 74 72 75 63 74 20 6d 68 65 61 64 20 2a 70 3b 0a 20 20 73 74 ┆ int fd; struct mhead *p; st┆ 0x04f200…09e600 72 75 63 74 20 65 78 65 63 20 62 61 73 65 3b 0a 20 20 73 74 72 75 63 74 20 6e 6c 69 73 74 20 2a ┆ruct exec base; struct nlist *┆ 0x04f200…09e600 6e 6c 73 3b 0a 20 20 69 6e 74 20 6e 75 6d 73 79 6d 73 3b 0a 20 20 63 68 61 72 20 2a 73 74 72 74 ┆nls; int numsyms; char *strt┆ 0x04f200…09e600 61 62 3b 0a 20 20 69 6e 74 20 73 74 72 74 61 62 6c 65 6e 3b 0a 20 20 69 6e 74 20 73 74 61 74 3b ┆ab; int strtablen; int stat;┆ 0x04f200…09e600 0a 0a 20 20 70 72 69 6e 74 66 28 22 44 75 6d 70 69 6e 67 20 73 74 61 74 65 3a 5c 6e 22 29 3b 0a ┆ printf("Dumping state:\n"); ┆ 0x04f200…09e600 0a 20 20 66 64 20 3d 20 6f 70 65 6e 28 66 69 6c 65 2c 20 4f 5f 52 44 4f 4e 4c 59 2c 20 30 37 37 ┆ fd = open(file, O_RDONLY, 077┆ 0x04f200…09e600 37 29 3b 20 2f 2a 20 6f 70 65 6e 20 74 68 65 20 62 69 6e 61 72 79 20 2a 2f 0a 20 20 69 66 28 66 ┆7); /* open the binary */ if(f┆ 0x04f200…09e600 64 3c 30 29 20 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 70 65 72 72 6f 72 28 22 6d 61 6c 6c 6f 63 ┆d<0) { perror("malloc┆ 0x04f200…09e600 5f 64 75 6d 70 5f 61 6c 6c 3a 6f 70 65 6e 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a ┆_dump_all:open"); return; ┆ 0x04f200…09e600 20 20 20 20 7d 0a 0a 20 20 73 74 61 74 20 3d 20 6c 73 65 65 6b 28 66 64 2c 20 30 4c 2c 20 4c 5f ┆ } stat = lseek(fd, 0L, L_┆ 0x04f200…09e600 53 45 54 29 3b 09 2f 2a 20 73 65 65 6b 20 28 72 65 64 75 6e 64 61 6e 74 2e 2e 2e 20 66 6f 72 20 ┆SET); /* seek (redundant... for ┆ 0x04f200…09e600 6c 61 74 65 72 29 20 2a 2f 0a 20 20 69 66 28 73 74 61 74 20 3c 20 30 29 0a 20 20 20 20 7b 0a 20 ┆later) */ if(stat < 0) { ┆ 0x04f200…09e600 20 20 20 20 20 70 65 72 72 6f 72 28 22 6d 61 6c 6c 6f 63 5f 64 75 6d 70 5f 61 6c 6c 3a 69 6e 69 ┆ perror("malloc_dump_all:ini┆ 0x04f200…09e600 74 73 65 65 6b 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 0a 20 20 ┆tseek"); return; } ┆ 0x04f200…09e600 73 74 61 74 20 3d 20 72 65 61 64 28 66 64 2c 20 26 62 61 73 65 2c 20 73 69 7a 65 6f 66 28 62 61 ┆stat = read(fd, &base, sizeof(ba┆ 0x04f200…09e600 73 65 29 29 3b 09 2f 2a 20 72 65 61 64 20 69 6e 20 62 61 73 65 20 62 6c 6f 63 6b 20 2a 2f 0a 20 ┆se)); /* read in base block */ ┆ 0x04f200…09e600 20 69 66 28 73 74 61 74 20 3c 3d 20 30 29 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 70 65 72 72 6f ┆ if(stat <= 0) { perro┆ 0x04f200…09e600 72 28 22 6d 61 6c 6c 6f 63 5f 64 75 6d 70 5f 61 6c 6c 3a 72 65 61 64 22 29 3b 0a 20 20 20 20 20 ┆r("malloc_dump_all:read"); ┆ 0x04f200…09e600 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 0a 20 20 73 74 61 74 20 3d 20 6c 73 65 65 6b 28 66 ┆ return; } stat = lseek(f┆ 0x04f200…09e600 64 2c 20 4e 5f 53 59 4d 4f 46 46 28 62 61 73 65 29 2c 20 4c 5f 53 45 54 29 3b 20 2f 2a 20 73 65 ┆d, N_SYMOFF(base), L_SET); /* se┆ 0x04f200…09e600 65 6b 20 74 6f 20 73 79 6d 74 61 62 20 2a 2f 0a 20 20 69 66 28 73 74 61 74 20 3c 20 30 29 0a 20 ┆ek to symtab */ if(stat < 0) ┆ 0x04f200…09e600 20 20 20 7b 0a 20 20 20 20 20 20 70 65 72 72 6f 72 28 22 6d 61 6c 6c 6f 63 5f 64 75 6d 70 5f 61 ┆ { perror("malloc_dump_a┆ 0x04f200…09e600 6c 6c 3a 73 79 6d 73 65 65 6b 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 ┆ll:symseek"); return; ┆ 0x04f200…09e600 7d 0a 20 20 6e 6c 73 20 3d 20 28 73 74 72 75 63 74 20 6e 6c 69 73 74 20 2a 29 6d 61 6c 6c 6f 63 ┆} nls = (struct nlist *)malloc┆ 0x04f200…09e600 28 62 61 73 65 2e 61 5f 73 79 6d 73 29 3b 0a 20 20 6e 75 6d 73 79 6d 73 20 3d 20 62 61 73 65 2e ┆(base.a_syms); numsyms = base.┆ 0x04f200…09e600 61 5f 73 79 6d 73 20 2f 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 6e 6c 69 73 74 29 3b 0a 0a ┆a_syms / sizeof(struct nlist); ┆ 0x04f200…09e600 20 20 73 74 61 74 20 3d 20 72 65 61 64 28 66 64 2c 20 6e 6c 73 2c 20 62 61 73 65 2e 61 5f 73 79 ┆ stat = read(fd, nls, base.a_sy┆ 0x04f200…09e600 6d 73 29 3b 09 2f 2a 20 72 65 61 64 20 69 6e 20 73 79 6d 74 61 62 20 2a 2f 0a 20 20 69 66 28 73 ┆ms); /* read in symtab */ if(s┆ 0x04f200…09e600 74 61 74 20 3c 3d 20 30 29 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 70 65 72 72 6f 72 28 22 6d 61 ┆tat <= 0) { perror("ma┆ 0x04f200…09e600 6c 6c 6f 63 5f 64 75 6d 70 5f 61 6c 6c 3a 73 79 6d 72 65 61 64 22 29 3b 0a 20 20 20 20 20 20 72 ┆lloc_dump_all:symread"); r┆ 0x04f200…09e600 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 0a 20 20 73 74 61 74 20 3d 20 6c 73 65 65 6b 28 66 64 2c ┆eturn; } stat = lseek(fd,┆ 0x04f200…09e600 20 4e 5f 53 54 52 4f 46 46 28 62 61 73 65 29 2c 20 4c 5f 53 45 54 29 3b 20 2f 2a 20 73 65 65 6b ┆ N_STROFF(base), L_SET); /* seek┆ 0x04f200…09e600 20 74 6f 20 73 74 72 69 6e 67 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 66 28 73 74 61 74 20 3c 20 ┆ to string table */ if(stat < ┆ 0x04f200…09e600 30 29 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 70 65 72 72 6f 72 28 22 6d 61 6c 6c 6f 63 5f 64 75 ┆0) { perror("malloc_du┆ 0x04f200…09e600 6d 70 5f 61 6c 6c 3a 73 65 65 6b 73 74 72 74 61 62 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 ┆mp_all:seekstrtab"); retur┆ 0x04f200…09e600 6e 3b 0a 20 20 20 20 7d 0a 0a 20 20 73 74 61 74 20 3d 20 72 65 61 64 28 66 64 2c 20 26 73 74 72 ┆n; } stat = read(fd, &str┆ 0x04f200…09e600 74 61 62 6c 65 6e 2c 20 73 69 7a 65 6f 66 28 73 74 72 74 61 62 6c 65 6e 29 29 3b 20 2f 2a 20 72 ┆tablen, sizeof(strtablen)); /* r┆ 0x04f200…09e600 65 61 64 20 73 74 72 69 6e 67 74 61 62 6c 65 20 6c 65 6e 20 2a 2f 0a 20 20 69 66 28 73 74 61 74 ┆ead stringtable len */ if(stat┆ 0x04f200…09e600 20 3c 3d 20 30 29 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 70 65 72 72 6f 72 28 22 6d 61 6c 6c 6f ┆ <= 0) { perror("mallo┆ 0x04f200…09e600 63 5f 64 75 6d 70 5f 61 6c 6c 3a 72 65 61 64 73 74 72 74 61 62 6c 65 6e 22 29 3b 0a 20 20 20 20 ┆c_dump_all:readstrtablen"); ┆ 0x04f200…09e600 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 73 74 72 74 61 62 20 3d 20 6d 61 6c 6c 6f ┆ return; } strtab = mallo┆ 0x04f200…09e600 63 28 73 74 72 74 61 62 6c 65 6e 29 3b 0a 0a 20 20 73 74 61 74 20 3d 20 72 65 61 64 28 66 64 2c ┆c(strtablen); stat = read(fd,┆ 0x04f200…09e600 20 73 74 72 74 61 62 2c 20 73 74 72 74 61 62 6c 65 6e 29 3b 20 2f 2a 20 72 65 61 64 20 69 6e 20 ┆ strtab, strtablen); /* read in ┆ 0x04f200…09e600 73 74 72 69 6e 67 74 61 62 6c 65 20 2a 2f 0a 20 20 69 66 28 73 74 61 74 20 3c 3d 20 30 29 0a 20 ┆stringtable */ if(stat <= 0) ┆ 0x04f200…09e600 20 20 20 7b 0a 20 20 20 20 20 20 70 65 72 72 6f 72 28 22 6d 61 6c 6c 6f 63 5f 64 75 6d 70 5f 61 ┆ { perror("malloc_dump_a┆ 0x04f200…09e600 6c 6c 3a 72 65 61 64 73 74 72 74 61 62 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 ┆ll:readstrtab"); return; ┆ 0x04f200…09e600 20 20 20 7d 0a 0a 20 20 66 6f 72 28 70 20 3d 20 62 61 73 65 6c 69 6e 6b 3b 20 70 20 21 3d 20 65 ┆ } for(p = baselink; p != e┆ 0x04f200…09e600 6e 64 6c 69 6e 6b 3b 20 70 20 3d 20 70 20 2d 3e 20 6d 68 5f 6c 69 6e 6b 29 0a 20 20 20 20 7b 0a ┆ndlink; p = p -> mh_link) { ┆ 0x04f200…09e600 20 20 20 20 20 20 66 69 6e 64 5f 73 79 6d 28 6e 6c 73 2c 20 6e 75 6d 73 79 6d 73 2c 20 73 74 72 ┆ find_sym(nls, numsyms, str┆ 0x04f200…09e600 74 61 62 2c 20 70 20 2d 3e 20 6d 68 5f 70 61 72 65 6e 74 29 3b 0a 20 20 20 20 20 20 73 77 69 74 ┆tab, p -> mh_parent); swit┆ 0x04f200…09e600 63 68 20 28 70 20 2d 3e 20 6d 68 5f 61 6c 6c 6f 63 29 20 7b 0a 20 20 20 20 20 20 63 61 73 65 20 ┆ch (p -> mh_alloc) { case ┆ 0x04f200…09e600 49 53 41 4c 4c 4f 43 3a 0a 09 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 20 61 6c 6c 6f 63 61 74 ┆ISALLOC: printf(" allocat┆ 0x04f200…09e600 65 64 20 25 64 20 62 79 74 65 73 5c 6e 22 2c 70 2d 3e 6d 68 5f 6e 62 79 74 65 73 29 3b 0a 09 20 ┆ed %d bytes\n",p->mh_nbytes); ┆ 0x04f200…09e600 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 49 53 46 52 45 45 3a 0a 09 ┆ break; case ISFREE: ┆ 0x04f200…09e600 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 20 66 72 65 65 64 20 62 6c 6f 63 6b 5c 6e 22 29 3b 0a ┆ printf(" freed block\n"); ┆ 0x04f200…09e600 09 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 09 20 20 ┆ break; default: ┆ 0x04f200…09e600 20 20 20 20 70 72 69 6e 74 66 28 22 20 69 6e 76 61 6c 69 64 20 62 6c 6f 63 6b 20 28 25 64 29 5c ┆ printf(" invalid block (%d)\┆ 0x04f200…09e600 6e 22 2c 20 70 2d 3e 20 6d 68 5f 6e 62 79 74 65 73 29 3b 0a 09 20 20 20 20 20 20 62 72 65 61 6b ┆n", p-> mh_nbytes); break┆ 0x04f200…09e600 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b ┆; } } flush(stdout);┆ 0x04f200…09e600 0a 20 20 66 72 65 65 28 73 74 72 74 61 62 29 3b 0a 20 20 66 72 65 65 28 6e 6c 73 29 3b 0a 20 20 ┆ free(strtab); free(nls); ┆ 0x04f200…09e600 70 72 69 6e 74 66 28 22 44 6f 6e 65 20 64 75 6d 70 69 6e 67 20 73 74 61 74 65 2e 5c 6e 22 29 3b ┆printf("Done dumping state.\n");┆ 0x04f200…09e600 0a 7d 0a 0a 66 69 6e 64 5f 73 79 6d 28 6e 6c 73 2c 20 6e 75 6d 73 79 6d 73 2c 20 73 74 72 73 2c ┆ } find_sym(nls, numsyms, strs,┆ 0x04f200…09e600 20 70 61 72 29 0a 20 20 20 20 20 73 74 72 75 63 74 20 6e 6c 69 73 74 20 2a 6e 6c 73 3b 0a 20 20 ┆ par) struct nlist *nls; ┆ 0x04f200…09e600 20 20 20 69 6e 74 20 6e 75 6d 73 79 6d 73 3b 0a 20 20 20 20 20 63 68 61 72 20 2a 73 74 72 73 3b ┆ int numsyms; char *strs;┆ 0x04f200…09e600 0a 20 20 20 20 20 63 68 61 72 20 2a 70 61 72 3b 0a 7b 0a 20 20 69 6e 74 20 73 79 6d 2c 20 73 74 ┆ char *par; { int sym, st┆ 0x04f200…09e600 61 74 3b 0a 20 20 69 6e 74 20 6c 61 73 74 3b 0a 20 20 69 6e 74 20 74 66 69 6c 65 3d 30 2c 20 74 ┆at; int last; int tfile=0, t┆ 0x04f200…09e600 66 30 3d 30 3b 0a 20 20 63 68 61 72 20 2a 78 3b 0a 0a 20 20 78 20 3d 20 70 61 72 3b 0a 0a 20 20 ┆f0=0; char *x; x = par; ┆ 0x04f200…09e600 73 79 6d 20 3d 20 2d 31 3b 0a 20 20 77 68 69 6c 65 28 2b 2b 73 79 6d 20 3c 20 6e 75 6d 73 79 6d ┆sym = -1; while(++sym < numsym┆ 0x04f200…09e600 73 29 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 73 77 69 74 63 68 28 6e 6c 73 5b 73 79 6d 5d 2e 6e ┆s) { switch(nls[sym].n┆ 0x04f200…09e600 5f 74 79 70 65 29 0a 09 7b 0a 09 63 61 73 65 20 4e 5f 54 45 58 54 3a 0a 09 63 61 73 65 20 4e 5f ┆_type) { case N_TEXT: case N_┆ 0x04f200…09e600 53 4f 3a 0a 09 20 20 74 66 30 20 3d 20 74 66 69 6c 65 3b 0a 09 20 20 74 66 69 6c 65 20 3d 20 6e ┆SO: tf0 = tfile; tfile = n┆ 0x04f200…09e600 6c 73 5b 73 79 6d 5d 2e 6e 5f 75 6e 2e 6e 5f 73 74 72 78 3b 0a 09 63 61 73 65 20 4e 5f 53 4c 49 ┆ls[sym].n_un.n_strx; case N_SLI┆ 0x04f200…09e600 4e 45 3a 0a 09 20 20 69 66 28 28 28 63 68 61 72 20 2a 29 6e 6c 73 5b 73 79 6d 5d 2e 6e 5f 76 61 ┆NE: if(((char *)nls[sym].n_va┆ 0x04f200…09e600 6c 75 65 29 20 3e 20 78 29 0a 09 20 20 20 20 7b 0a 09 20 20 20 20 20 20 73 79 6d 20 3d 20 6e 75 ┆lue) > x) { sym = nu┆ 0x04f200…09e600 6d 73 79 6d 73 3b 0a 09 20 20 20 20 7d 0a 09 20 20 65 6c 73 65 0a 09 20 20 20 20 7b 0a 09 20 20 ┆msyms; } else { ┆ 0x04f200…09e600 20 20 20 20 6c 61 73 74 20 3d 20 6e 6c 73 5b 73 79 6d 5d 2e 6e 5f 64 65 73 63 3b 0a 09 20 20 20 ┆ last = nls[sym].n_desc; ┆ 0x04f200…09e600 20 7d 0a 09 20 20 62 72 65 61 6b 3b 0a 09 64 65 66 61 75 6c 74 3a 0a 09 20 20 62 72 65 61 6b 3b ┆ } break; default: break;┆ 0x04f200…09e600 0a 09 7d 0a 20 20 20 20 7d 0a 0a 0a 20 20 70 72 69 6e 74 66 28 22 5c 22 25 73 5c 22 2c 20 6c 69 ┆ } } printf("\"%s\", li┆ 0x04f200…09e600 6e 65 20 25 64 3a 20 41 64 64 72 65 73 73 5b 30 78 25 78 5d 22 2c 20 73 74 72 73 2b 74 66 30 2d ┆ne %d: Address[0x%x]", strs+tf0-┆ 0x04f200…09e600 73 69 7a 65 6f 66 28 69 6e 74 29 2c 20 6c 61 73 74 2c 20 78 29 3b 0a 0a 7d 0a 23 65 6e 64 69 66 ┆sizeof(int), last, x); } #endif┆ 0x04f200…09e600 20 4d 41 4c 4c 4f 43 5f 44 45 42 55 47 0a 72 3b 0a 7b 0a 20 20 69 6e 74 20 73 79 6d 2c 20 73 74 ┆ MALLOC_DEBUG r; { int sym, st┆ 0x04f200…09e600 61 74 3b 0a 20 20 69 6e 74 20 6c 61 73 74 3b 0a 20 20 69 6e 74 20 74 66 69 6c 65 3d 30 2c 20 74 ┆at; int last; int tfile=0, t┆ 0x04f200…09e600 66 30 3d 30 3b 0a 20 20 63 68 61 72 20 2a 78 3b 0a 0a 20 20 78 20 3d 20 70 61 72 3b 0a 0a 20 20 ┆f0=0; char *x; x = par; ┆ 0x04f200…09e600 73 79 6d 20 3d 20 2d 31 3b 0a 20 20 77 68 69 6c 65 28 2b 2b 73 79 6d 20 3c 20 6e 75 6d 73 79 6d ┆sym = -1; while(++sym < numsym┆ 0x04f200…09e600 73 29 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 73 77 69 74 63 68 28 6e 6c 73 5b 73 79 6d 5d 2e 6e ┆s) { switch(nls[sym].n┆ 0x04f200…09e600 5f 74 79 70 65 29 0a 09 7b 0a 09 63 61 73 65 20 4e 5f 54 45 58 54 3a 0a 09 63 61 73 65 20 4e 5f ┆_type) { case N_TEXT: case N_┆ 0x04f200…09e600 53 4f 3a 0a 09 20 20 74 66 30 20 3d 20 74 66 69 6c 73 72 63 2f 44 2e 70 6f 72 74 2f 6e 6d 61 6c ┆SO: tf0 = tfilsrc/D.port/nmal┆ 0x04f200…09e600 6c 6f 63 2e 68 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆loc.h ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆ ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 20 20 20 34 34 34 20 00 20 20 20 ┆ 444 ┆ 0x04f200…09e600 31 34 35 20 00 20 20 20 20 20 31 20 00 20 20 20 20 20 20 20 20 37 32 30 20 20 34 34 35 36 31 37 ┆145 1 720 445617┆ 0x04f200…09e600 32 37 36 36 20 20 20 37 36 31 31 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆2766 7611 ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆ ┆ […0x9…] 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 23 69 66 6e 64 65 66 20 5f 6d 61 6c 6c 6f 63 ┆ #ifndef _malloc┆ 0x04f200…09e600 5f 0a 23 64 65 66 69 6e 65 20 5f 6d 61 6c 6c 6f 63 5f 0a 0a 23 64 65 66 69 6e 65 20 4e 65 77 28 ┆_ #define _malloc_ #define New(┆ 0x04f200…09e600 54 59 50 45 29 20 28 28 54 59 50 45 20 2a 29 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 54 59 50 ┆TYPE) ((TYPE *)malloc(sizeof(TYP┆ 0x04f200…09e600 45 29 29 29 0a 6d 61 6c 6c 6f 63 5f 69 6e 69 74 20 28 20 2f 2a 20 73 74 61 72 74 20 2a 2f 20 29 ┆E))) malloc_init ( /* start */ )┆ 0x04f200…09e600 3b 0a 69 6e 74 20 6d 5f 62 6c 6f 63 6b 73 69 7a 65 28 20 2f 2a 20 61 5f 62 6c 6f 63 6b 20 2a 2f ┆; int m_blocksize( /* a_block */┆ 0x04f200…09e600 20 29 3b 0a 63 68 61 72 20 2a 20 6d 61 6c 6c 6f 63 20 28 20 2f 2a 20 6e 20 2a 2f 20 29 3b 09 09 ┆ ); char * malloc ( /* n */ ); ┆ 0x04f200…09e600 2f 2a 20 67 65 74 20 61 20 62 6c 6f 63 6b 20 2a 2f 0a 66 72 65 65 20 28 20 2f 2a 20 6d 65 6d 20 ┆/* get a block */ free ( /* mem ┆ 0x04f200…09e600 2a 2f 20 29 3b 0a 63 68 61 72 20 2a 20 72 65 61 6c 6c 6f 63 20 28 20 2f 2a 20 6d 65 6d 2c 20 6e ┆*/ ); char * realloc ( /* mem, n┆ 0x04f200…09e600 20 2a 2f 20 29 3b 0a 73 74 72 75 63 74 20 6d 73 74 61 74 73 5f 76 61 6c 75 65 0a 20 20 7b 0a 20 ┆ */ ); struct mstats_value { ┆ 0x04f200…09e600 20 20 20 69 6e 74 20 62 6c 6f 63 6b 73 69 7a 65 3b 0a 20 20 20 20 69 6e 74 20 6e 66 72 65 65 3b ┆ int blocksize; int nfree;┆ 0x04f200…09e600 0a 20 20 20 20 69 6e 74 20 6e 75 73 65 64 3b 0a 20 20 7d 3b 0a 73 74 72 75 63 74 20 6d 73 74 61 ┆ int nused; }; struct msta┆ 0x04f200…09e600 74 73 5f 76 61 6c 75 65 20 6d 61 6c 6c 6f 63 5f 73 74 61 74 73 20 28 20 2f 2a 20 73 69 7a 65 20 ┆ts_value malloc_stats ( /* size ┆ 0x04f200…09e600 2a 2f 20 29 3b 0a 67 65 74 5f 6c 69 6d 5f 64 61 74 61 20 28 20 2f 2a 20 20 2a 2f 20 29 3b 0a 67 ┆*/ ); get_lim_data ( /* */ ); g┆ 0x04f200…09e600 65 74 5f 6c 69 6d 5f 64 61 74 61 20 28 20 2f 2a 20 20 2a 2f 20 29 3b 0a 67 65 74 5f 6c 69 6d 5f ┆et_lim_data ( /* */ ); get_lim_┆ 0x04f200…09e600 64 61 74 61 20 28 20 2f 2a 20 20 2a 2f 20 29 3b 0a 23 65 6e 64 69 66 20 5f 6d 61 6c 6c 6f 63 5f ┆data ( /* */ ); #endif _malloc_┆ 0x04f200…09e600 0a 74 79 70 65 29 0a 09 7b 0a 09 63 61 73 65 20 4e 5f 54 45 58 54 3a 0a 09 63 61 73 65 20 4e 5f ┆ type) { case N_TEXT: case N_┆ 0x04f200…09e600 53 4f 3a 0a 09 20 20 74 66 30 20 3d 20 74 66 69 6c 73 72 63 2f 44 2e 70 6f 72 74 2f 6e 73 74 72 ┆SO: tf0 = tfilsrc/D.port/nstr┆ 0x04f200…09e600 69 70 2e 63 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆ip.c ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆ ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 20 20 20 34 34 34 20 00 20 20 20 ┆ 444 ┆ 0x04f200…09e600 31 34 35 20 00 20 20 20 20 20 31 20 00 20 20 20 20 20 20 20 20 37 31 36 20 20 34 34 35 36 31 35 ┆145 1 716 445615┆ 0x04f200…09e600 34 30 35 31 20 20 20 37 34 36 36 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆4051 7466 ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆ ┆ […0x9…] 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 2f 2a 20 6e 73 74 72 69 70 2e 63 20 2d 2d 20 ┆ /* nstrip.c -- ┆ 0x04f200…09e600 73 74 72 69 70 20 74 72 61 69 6c 69 6e 67 20 77 68 69 74 65 73 70 61 63 65 20 66 72 6f 6d 20 61 ┆strip trailing whitespace from a┆ 0x04f200…09e600 20 73 74 72 69 6e 67 20 20 2a 2f 0a 2f 2a 20 4c 49 4e 54 4c 49 42 52 41 52 59 20 2a 2f 0a 23 69 ┆ string */ /* LINTLIBRARY */ #i┆ 0x04f200…09e600 6e 63 6c 75 64 65 20 22 6c 69 62 70 6f 72 74 2e 68 22 0a 0a 6e 73 74 72 69 70 28 73 29 0a 2f 2a ┆nclude "libport.h" nstrip(s) /*┆ 0x04f200…09e600 0a 20 2a 20 53 74 72 69 70 20 74 72 61 69 6c 69 6e 67 20 6e 65 77 6c 69 6e 65 73 2c 20 62 6c 61 ┆ * Strip trailing newlines, bla┆ 0x04f200…09e600 6e 6b 73 2c 20 61 6e 64 20 74 61 62 73 20 66 72 6f 6d 20 27 73 27 2e 0a 20 2a 20 52 65 74 75 72 ┆nks, and tabs from 's'. * Retur┆ 0x04f200…09e600 6e 20 54 52 55 45 20 69 66 20 6e 65 77 6c 69 6e 65 20 77 61 73 20 66 6f 75 6e 64 2c 20 65 6c 73 ┆n TRUE if newline was found, els┆ 0x04f200…09e600 65 20 46 41 4c 53 45 2e 0a 20 2a 2f 0a 72 65 67 69 73 74 65 72 20 63 68 61 72 20 2a 73 3b 0a 7b ┆e FALSE. */ register char *s; {┆ 0x04f200…09e600 0a 09 72 65 67 69 73 74 65 72 20 63 68 61 72 20 2a 70 3b 0a 09 72 65 67 69 73 74 65 72 20 62 6f ┆ register char *p; register bo┆ 0x04f200…09e600 6f 6c 20 72 63 3b 0a 0a 09 72 63 20 3d 20 46 41 4c 53 45 3b 0a 09 70 20 3d 20 73 3b 0a 09 77 68 ┆ol rc; rc = FALSE; p = s; wh┆ 0x04f200…09e600 69 6c 65 20 28 2a 70 29 0a 09 09 69 66 20 28 2a 70 2b 2b 20 3d 3d 20 27 5c 6e 27 29 0a 09 09 09 ┆ile (*p) if (*p++ == '\n') ┆ 0x04f200…09e600 72 63 20 3d 20 54 52 55 45 3b 0a 09 77 68 69 6c 65 20 28 2d 2d 70 20 3e 3d 20 73 20 26 26 20 28 ┆rc = TRUE; while (--p >= s && (┆ 0x04f200…09e600 2a 70 20 3d 3d 20 27 5c 6e 27 20 7c 7c 20 2a 70 20 3d 3d 20 27 20 27 20 7c 7c 20 2a 70 20 3d 3d ┆*p == '\n' || *p == ' ' || *p ==┆ 0x04f200…09e600 20 27 5c 74 27 29 29 3b 0a 09 2a 2b 2b 70 20 3d 20 27 5c 30 27 3b 0a 09 72 65 74 75 72 6e 20 72 ┆ '\t')); *++p = '\0'; return r┆ 0x04f200…09e600 63 3b 0a 7d 0a 0a 2f 2a 20 6e 73 74 72 69 70 2e 63 20 65 6e 64 73 20 68 65 72 65 20 2a 2f 0a 5f ┆c; } /* nstrip.c ends here */ _┆ 0x04f200…09e600 0a 74 79 70 65 29 0a 09 7b 0a 09 63 61 73 65 20 4e 5f 54 45 58 54 3a 0a 09 63 61 73 65 20 4e 5f ┆ type) { case N_TEXT: case N_┆ 0x04f200…09e600 53 4f 3a 0a 09 20 20 74 66 30 20 3d 20 74 66 69 6c 73 72 63 2f 44 2e 70 6f 72 74 2f 70 65 6f 70 ┆SO: tf0 = tfilsrc/D.port/peop┆ 0x04f200…09e600 65 6e 2e 63 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆en.c ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆ ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 20 20 20 34 34 34 20 00 20 20 20 ┆ 444 ┆ 0x04f200…09e600 31 34 35 20 00 20 20 20 20 20 31 20 00 20 20 20 20 20 20 31 30 36 35 34 20 20 34 34 35 36 31 35 ┆145 1 10654 445615┆ 0x04f200…09e600 34 30 36 30 20 20 20 37 34 37 37 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆4060 7477 ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆ ┆ […0x9…] 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆ /**************┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆********************************┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a ┆******************************* ┆ 0x04f200…09e600 0a 4e 41 4d 45 0a 20 20 20 70 65 6f 70 65 6e 2e 63 20 2d 2d 20 73 65 63 75 72 65 20 70 6f 70 65 ┆ NAME peopen.c -- secure pope┆ 0x04f200…09e600 6e 20 72 65 70 6c 61 63 65 6d 65 6e 74 0a 0a 53 59 4e 4f 50 53 49 53 0a 20 20 20 46 49 4c 45 20 ┆n replacement SYNOPSIS FILE ┆ 0x04f200…09e600 2a 70 65 6f 70 65 6e 28 63 6d 64 2c 20 6d 6f 64 65 29 09 2d 2d 20 6f 70 65 6e 20 61 20 70 69 70 ┆*peopen(cmd, mode) -- open a pip┆ 0x04f200…09e600 65 20 74 6f 20 61 20 63 6f 6d 6d 61 6e 64 0a 20 20 20 63 68 61 72 20 2a 63 6d 64 3b 0a 0a 20 20 ┆e to a command char *cmd; ┆ 0x04f200…09e600 20 69 6e 74 20 70 65 63 6c 6f 73 65 28 6d 66 70 29 09 09 2d 2d 20 63 6c 6f 73 65 20 61 20 70 69 ┆ int peclose(mfp) -- close a pi┆ 0x04f200…09e600 70 65 20 6f 70 65 6e 65 64 20 62 79 20 70 65 6f 70 65 6e 0a 20 20 20 46 49 4c 45 20 2a 6d 66 70 ┆pe opened by peopen FILE *mfp┆ 0x04f200…09e600 3b 0a 0a 44 45 53 43 52 49 50 54 49 4f 4e 0a 20 20 20 54 68 65 73 65 20 66 75 6e 63 74 69 6f 6e ┆; DESCRIPTION These function┆ 0x04f200…09e600 73 20 70 72 6f 76 69 64 65 20 61 20 72 65 61 73 6f 6e 61 62 6c 79 20 73 65 63 75 72 65 20 69 6e ┆s provide a reasonably secure in┆ 0x04f200…09e600 74 65 72 66 61 63 65 20 66 6f 72 20 64 6f 69 6e 67 20 70 6f 70 65 6e 28 33 29 2d 0a 6c 69 6b 65 ┆terface for doing popen(3)- like┆ 0x04f200…09e600 20 74 68 69 6e 67 73 20 66 72 6f 6d 20 74 72 75 73 74 65 64 20 70 72 6f 67 72 61 6d 73 2e 20 54 ┆ things from trusted programs. T┆ 0x04f200…09e600 68 65 20 6d 61 69 6e 20 65 6e 74 72 79 20 70 6f 69 6e 74 2c 20 70 65 6f 70 65 6e 28 29 2c 20 66 ┆he main entry point, peopen(), f┆ 0x04f200…09e600 6f 72 6b 73 20 61 0a 62 61 72 65 20 70 72 6f 63 65 73 73 20 69 6e 73 74 65 61 64 20 6f 66 20 61 ┆orks a bare process instead of a┆ 0x04f200…09e600 20 73 68 65 6c 6c 2e 20 50 61 74 68 20 73 65 61 72 63 68 20 61 6e 64 20 61 20 6c 69 6d 69 74 65 ┆ shell. Path search and a limite┆ 0x04f200…09e600 64 20 49 2f 4f 20 72 65 64 69 72 65 63 74 69 6f 6e 0a 63 61 70 61 62 69 6c 69 74 79 20 69 73 20 ┆d I/O redirection capability is ┆ 0x04f200…09e600 73 75 70 70 6f 72 74 65 64 2e 20 43 6f 6d 6d 61 6e 64 73 20 6f 70 65 6e 65 64 20 66 6f 72 20 22 ┆supported. Commands opened for "┆ 0x04f200…09e600 72 22 20 6d 61 79 20 69 6e 63 6c 75 64 65 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 6f 66 0a 74 68 ┆r" may include an argument of th┆ 0x04f200…09e600 65 20 66 6f 72 6d 20 22 3c 66 69 6c 65 22 2c 20 63 6f 6d 6d 61 6e 64 73 20 6f 70 65 6e 65 64 20 ┆e form "<file", commands opened ┆ 0x04f200…09e600 66 6f 72 20 22 77 22 20 6d 61 79 20 68 61 76 65 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 6c 69 6b ┆for "w" may have an argument lik┆ 0x04f200…09e600 65 20 22 3e 66 69 6c 65 22 3b 0a 74 68 65 73 65 20 64 6f 20 74 68 65 20 6f 62 76 69 6f 75 73 20 ┆e ">file"; these do the obvious ┆ 0x04f200…09e600 72 65 64 69 72 65 63 74 69 6f 6e 73 20 61 6e 64 20 61 72 65 20 64 72 6f 70 70 65 64 20 6f 75 74 ┆redirections and are dropped out┆ 0x04f200…09e600 20 6f 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 6c 69 73 74 0a 62 65 66 6f 72 65 20 74 68 65 ┆ of the argument list before the┆ 0x04f200…09e600 20 65 78 65 63 76 70 28 29 2e 0a 0a 42 55 47 53 0a 20 20 20 57 65 27 64 20 6c 69 6b 65 20 74 6f ┆ execvp(). BUGS We'd like to┆ 0x04f200…09e600 20 63 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 65 78 63 65 ┆ close all file descriptors exce┆ 0x04f200…09e600 70 74 20 73 74 64 69 6e 20 6f 72 20 73 74 64 6f 75 74 20 62 65 66 6f 72 65 0a 73 70 61 77 6e 69 ┆pt stdin or stdout before spawni┆ 0x04f200…09e600 6e 67 20 74 68 65 20 63 68 69 6c 64 2c 20 62 75 74 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 ┆ng the child, but attempting to ┆ 0x04f200…09e600 64 6f 20 73 6f 20 73 65 65 6d 73 20 74 6f 20 63 61 75 73 65 20 62 72 6f 6b 65 6e 20 70 69 70 65 ┆do so seems to cause broken pipe┆ 0x04f200…09e600 20 65 72 72 6f 72 73 0a 69 6e 20 70 72 6f 63 65 73 73 65 73 20 74 68 61 74 20 64 6f 20 6d 75 6c ┆ errors in processes that do mul┆ 0x04f200…09e600 74 69 70 6c 65 20 70 65 6f 70 65 6e 73 28 29 2e 0a 0a 52 45 56 49 53 45 44 20 42 59 0a 20 20 20 ┆tiple peopens(). REVISED BY ┆ 0x04f200…09e600 45 72 69 63 20 53 2e 20 52 61 79 6d 6f 6e 64 0a 20 20 20 54 68 69 73 20 73 6f 66 74 77 61 72 65 ┆Eric S. Raymond This software┆ 0x04f200…09e600 20 69 73 20 43 6f 70 79 72 69 67 68 74 20 28 43 29 20 31 39 38 39 20 62 79 20 45 72 69 63 20 53 ┆ is Copyright (C) 1989 by Eric S┆ 0x04f200…09e600 2e 20 52 61 79 6d 6f 6e 64 20 66 6f 72 20 74 68 65 20 73 6f 6c 65 20 70 75 72 70 6f 73 65 0a 6f ┆. Raymond for the sole purpose o┆ 0x04f200…09e600 66 20 70 72 6f 74 65 63 74 69 6e 67 20 66 72 65 65 20 72 65 64 69 73 74 72 69 62 75 74 69 6f 6e ┆f protecting free redistribution┆ 0x04f200…09e600 3b 20 73 65 65 20 74 68 65 20 4c 49 43 45 4e 53 45 20 66 69 6c 65 20 66 6f 72 20 64 65 74 61 69 ┆; see the LICENSE file for detai┆ 0x04f200…09e600 6c 73 2e 0a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆ls. ***************************┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆********************************┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 4c 49 4e 54 4c 49 42 52 41 52 59 ┆*****************/ /*LINTLIBRARY┆ 0x04f200…09e600 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 6c 69 62 70 6f 72 74 2e 68 22 0a 0a 23 64 65 66 69 6e 65 ┆*/ #include "libport.h" #define┆ 0x04f200…09e600 20 4d 41 58 41 52 47 53 09 36 34 09 2f 2a 20 6d 61 78 20 23 20 6f 66 20 61 72 67 75 6d 65 6e 74 ┆ MAXARGS 64 /* max # of argument┆ 0x04f200…09e600 73 20 61 63 63 65 70 74 65 64 20 66 6f 72 20 73 65 63 75 72 65 20 63 6f 6d 6d 61 6e 64 20 2a 2f ┆s accepted for secure command */┆ 0x04f200…09e600 0a 0a 23 69 66 6e 64 65 66 20 5f 4e 46 49 4c 45 09 09 2f 2a 20 74 68 69 73 20 77 69 6c 6c 20 62 ┆ #ifndef _NFILE /* this will b┆ 0x04f200…09e600 65 20 64 65 66 69 6e 65 64 20 63 6f 72 72 65 63 74 6c 79 20 6f 6e 20 55 53 47 20 73 79 73 74 65 ┆e defined correctly on USG syste┆ 0x04f200…09e600 6d 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 5f 4e 46 49 4c 45 09 36 34 0a 23 65 6e 64 69 66 0a 0a ┆ms */ #define _NFILE 64 #endif ┆ 0x04f200…09e600 23 64 65 66 69 6e 65 09 52 44 52 09 30 0a 23 64 65 66 69 6e 65 09 57 54 52 09 31 0a 73 74 61 74 ┆#define RDR 0 #define WTR 1 stat┆ 0x04f200…09e600 69 63 09 69 6e 74 09 70 65 6f 70 65 6e 5f 70 69 64 5b 5f 4e 46 49 4c 45 5d 3b 0a 0a 23 64 65 66 ┆ic int peopen_pid[_NFILE]; #def┆ 0x04f200…09e600 69 6e 65 20 4e 4f 53 48 45 4c 4c 09 2f 2a 20 77 69 74 68 6f 75 74 20 4e 4f 53 48 45 4c 4c 20 74 ┆ine NOSHELL /* without NOSHELL t┆ 0x04f200…09e600 68 69 73 20 6a 75 73 74 20 66 6f 72 6b 73 20 61 20 42 6f 75 72 6e 65 20 73 68 65 6c 6c 20 2a 2f ┆his just forks a Bourne shell */┆ 0x04f200…09e600 0a 0a 46 49 4c 45 20 2a 70 65 6f 70 65 6e 28 63 6d 64 2c 20 6d 6f 64 65 29 0a 2f 2a 0a 20 2a 20 ┆ FILE *peopen(cmd, mode) /* * ┆ 0x04f200…09e600 54 68 69 73 20 69 73 20 61 20 6d 6f 64 69 66 69 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 70 6f ┆This is a modified version of po┆ 0x04f200…09e600 70 65 6e 2c 20 6d 61 64 65 20 6d 6f 72 65 20 73 65 63 75 72 65 2e 20 20 52 61 74 68 65 72 20 74 ┆pen, made more secure. Rather t┆ 0x04f200…09e600 68 61 6e 0a 20 2a 20 66 6f 72 6b 69 6e 67 20 6f 66 66 20 61 20 73 68 65 6c 6c 2c 20 79 6f 75 20 ┆han * forking off a shell, you ┆ 0x04f200…09e600 67 65 74 20 61 20 62 61 72 65 20 70 72 6f 63 65 73 73 2e 0a 20 2a 2f 0a 63 68 61 72 20 2a 63 6d ┆get a bare process. */ char *cm┆ 0x04f200…09e600 64 2c 20 2a 6d 6f 64 65 3b 0a 7b 0a 20 20 20 20 69 6e 74 09 70 69 70 65 73 5b 32 5d 3b 0a 20 20 ┆d, *mode; { int pipes[2]; ┆ 0x04f200…09e600 20 20 72 65 67 69 73 74 65 72 20 69 6e 74 20 66 64 2c 20 6d 79 73 69 64 65 2c 20 79 6f 75 72 73 ┆ register int fd, myside, yours┆ 0x04f200…09e600 69 64 65 2c 20 70 69 64 2c 20 77 6d 6f 64 65 20 3d 20 28 73 74 72 63 6d 70 28 6d 6f 64 65 2c 20 ┆ide, pid, wmode = (strcmp(mode, ┆ 0x04f200…09e600 22 77 22 29 20 3d 3d 20 30 29 3b 0a 0a 23 69 66 64 65 66 20 4e 4f 53 48 45 4c 4c 0a 20 20 20 20 ┆"w") == 0); #ifdef NOSHELL ┆ 0x04f200…09e600 63 68 61 72 20 20 20 20 2a 63 70 2c 20 6c 69 6e 65 5b 42 55 46 53 49 5a 5d 2c 20 2a 6c 61 72 67 ┆char *cp, line[BUFSIZ], *larg┆ 0x04f200…09e600 76 5b 4d 41 58 41 52 47 53 5d 2c 20 2a 72 65 64 69 72 65 63 74 20 3d 20 28 63 68 61 72 20 2a 29 ┆v[MAXARGS], *redirect = (char *)┆ 0x04f200…09e600 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 09 20 20 20 20 6c 61 72 67 63 20 3d 20 30 3b 0a 0a 20 20 ┆NULL; int largc = 0; ┆ 0x04f200…09e600 20 20 2f 2a 20 63 72 61 63 6b 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 6c 69 73 74 20 69 6e 74 ┆ /* crack the argument list int┆ 0x04f200…09e600 6f 20 61 20 64 6f 70 65 20 76 65 63 74 6f 72 20 2a 2f 0a 20 20 20 20 28 76 6f 69 64 29 20 73 74 ┆o a dope vector */ (void) st┆ 0x04f200…09e600 72 63 70 79 28 6c 69 6e 65 2c 20 63 6d 64 29 3b 0a 20 20 20 20 66 6f 72 20 28 63 70 20 3d 20 6c ┆rcpy(line, cmd); for (cp = l┆ 0x04f200…09e600 69 6e 65 3b 20 2a 63 70 3b 20 63 70 2b 2b 29 0a 20 20 20 20 7b 0a 09 69 66 20 28 69 73 73 70 61 ┆ine; *cp; cp++) { if (isspa┆ 0x04f200…09e600 63 65 28 2a 63 70 29 29 0a 09 20 20 20 20 2a 63 70 20 3d 20 27 5c 30 27 3b 0a 09 65 6c 73 65 20 ┆ce(*cp)) *cp = '\0'; else ┆ 0x04f200…09e600 69 66 20 28 63 70 20 3d 3d 20 6c 69 6e 65 20 7c 7c 20 63 70 5b 2d 31 5d 20 3d 3d 20 30 29 0a 09 ┆if (cp == line || cp[-1] == 0) ┆ 0x04f200…09e600 7b 0a 20 09 20 20 20 20 2f 2a 20 49 2f 4f 20 72 65 64 69 72 65 63 74 69 6f 6e 20 74 6f 6b 65 6e ┆{ /* I/O redirection token┆ 0x04f200…09e600 73 20 61 72 65 6e 27 74 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 09 20 20 20 20 69 66 20 28 2a ┆s aren't arguments */ if (*┆ 0x04f200…09e600 63 70 20 3d 3d 20 27 3c 27 20 7c 7c 20 2a 63 70 20 3d 3d 20 27 3e 27 29 0a 09 20 20 20 20 7b 0a ┆cp == '<' || *cp == '>') { ┆ 0x04f200…09e600 09 09 69 66 20 28 28 77 6d 6f 64 65 20 26 26 20 2a 63 70 20 3d 3d 20 27 3e 27 29 20 7c 7c 20 28 ┆ if ((wmode && *cp == '>') || (┆ 0x04f200…09e600 21 77 6d 6f 64 65 20 26 26 20 2a 63 70 20 3d 3d 20 27 3c 27 29 29 0a 09 09 20 20 20 20 72 65 64 ┆!wmode && *cp == '<')) red┆ 0x04f200…09e600 69 72 65 63 74 20 3d 20 63 70 20 2b 20 31 3b 0a 09 09 65 6c 73 65 0a 09 09 20 20 20 20 72 65 74 ┆irect = cp + 1; else ret┆ 0x04f200…09e600 75 72 6e 28 28 46 49 4c 45 20 2a 29 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 65 ┆urn((FILE *)NULL); } e┆ 0x04f200…09e600 6c 73 65 20 69 66 20 28 6c 61 72 67 63 20 3e 3d 20 4d 41 58 41 52 47 53 20 2d 20 31 29 0a 09 09 ┆lse if (largc >= MAXARGS - 1) ┆ 0x04f200…09e600 72 65 74 75 72 6e 28 28 46 49 4c 45 20 2a 29 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 65 6c 73 65 0a ┆return((FILE *)NULL); else ┆ 0x04f200…09e600 09 09 6c 61 72 67 76 5b 6c 61 72 67 63 2b 2b 5d 20 3d 20 63 70 3b 0a 09 7d 0a 20 20 20 20 7d 0a ┆ largv[largc++] = cp; } } ┆ 0x04f200…09e600 20 20 20 20 6c 61 72 67 76 5b 6c 61 72 67 63 5d 20 3d 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c ┆ largv[largc] = (char *) NULL┆ 0x04f200…09e600 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 4e 4f 53 48 45 4c 4c 20 2a 2f 0a 0a 20 20 20 20 69 66 20 28 ┆; #endif /* NOSHELL */ if (┆ 0x04f200…09e600 70 69 70 65 28 70 69 70 65 73 29 20 3c 20 30 29 0a 09 72 65 74 75 72 6e 28 28 46 49 4c 45 20 2a ┆pipe(pipes) < 0) return((FILE *┆ 0x04f200…09e600 29 4e 55 4c 4c 29 3b 0a 20 20 20 20 6d 79 73 69 64 65 20 3d 20 28 77 6d 6f 64 65 20 3f 20 70 69 ┆)NULL); myside = (wmode ? pi┆ 0x04f200…09e600 70 65 73 5b 57 54 52 5d 20 3a 20 70 69 70 65 73 5b 52 44 52 5d 29 3b 0a 20 20 20 20 79 6f 75 72 ┆pes[WTR] : pipes[RDR]); your┆ 0x04f200…09e600 73 69 64 65 20 3d 20 28 77 6d 6f 64 65 20 3f 20 70 69 70 65 73 5b 52 44 52 5d 20 3a 20 70 69 70 ┆side = (wmode ? pipes[RDR] : pip┆ 0x04f200…09e600 65 73 5b 57 54 52 5d 29 3b 0a 20 20 20 20 69 66 20 28 28 70 69 64 20 3d 20 66 6f 72 6b 28 29 29 ┆es[WTR]); if ((pid = fork())┆ 0x04f200…09e600 20 3d 3d 20 30 29 09 2f 2a 20 6d 79 73 69 64 65 2f 79 6f 75 72 73 69 64 65 20 72 65 76 65 72 73 ┆ == 0) /* myside/yourside revers┆ 0x04f200…09e600 65 20 72 6f 6c 65 73 20 69 6e 20 63 68 69 6c 64 20 2a 2f 0a 20 20 20 20 7b 0a 23 69 66 64 65 66 ┆e roles in child */ { #ifdef┆ 0x04f200…09e600 20 43 4c 4f 53 45 41 4c 4c 09 2f 2a 20 74 68 69 73 20 73 65 65 6d 73 20 74 6f 20 62 72 65 61 6b ┆ CLOSEALL /* this seems to break┆ 0x04f200…09e600 20 70 72 6f 63 65 73 73 65 73 20 77 69 74 68 20 6d 75 6c 74 69 70 6c 65 20 70 65 6f 70 65 6e 73 ┆ processes with multiple peopens┆ 0x04f200…09e600 28 29 20 2a 2f 0a 09 2f 2a 20 63 6c 6f 73 65 20 61 6c 6c 20 70 69 70 65 73 20 66 72 6f 6d 20 6f ┆() */ /* close all pipes from o┆ 0x04f200…09e600 74 68 65 72 20 70 65 6f 70 65 6e 28 29 73 20 2a 2f 0a 09 66 6f 72 20 28 66 64 20 3d 20 32 3b 20 ┆ther peopen()s */ for (fd = 2; ┆ 0x04f200…09e600 66 64 20 3c 20 5f 4e 46 49 4c 45 3b 20 66 64 29 0a 09 20 20 20 20 69 66 20 28 70 65 6f 70 65 6e ┆fd < _NFILE; fd) if (peopen┆ 0x04f200…09e600 5f 70 69 64 5b 66 64 5d 29 0a 09 09 28 76 6f 69 64 29 20 63 6c 6f 73 65 28 66 64 29 3b 0a 23 65 ┆_pid[fd]) (void) close(fd); #e┆ 0x04f200…09e600 6e 64 69 66 20 2f 2a 20 43 4c 4f 53 45 41 4c 4c 20 2a 2f 0a 0a 09 28 76 6f 69 64 29 20 63 6c 6f ┆ndif /* CLOSEALL */ (void) clo┆ 0x04f200…09e600 73 65 28 6d 79 73 69 64 65 29 3b 0a 09 69 66 20 28 79 6f 75 72 73 69 64 65 20 21 3d 20 28 77 6d ┆se(myside); if (yourside != (wm┆ 0x04f200…09e600 6f 64 65 20 3f 20 30 20 3a 20 31 29 29 0a 09 7b 0a 09 20 20 20 20 28 76 6f 69 64 29 20 63 6c 6f ┆ode ? 0 : 1)) { (void) clo┆ 0x04f200…09e600 73 65 28 77 6d 6f 64 65 20 3f 20 30 20 3a 20 31 29 3b 0a 09 20 20 20 20 28 76 6f 69 64 29 20 64 ┆se(wmode ? 0 : 1); (void) d┆ 0x04f200…09e600 75 70 28 79 6f 75 72 73 69 64 65 29 3b 0a 09 20 20 20 20 28 76 6f 69 64 29 20 63 6c 6f 73 65 28 ┆up(yourside); (void) close(┆ 0x04f200…09e600 79 6f 75 72 73 69 64 65 29 3b 0a 09 7d 0a 0a 23 69 66 64 65 66 20 4e 4f 53 48 45 4c 4c 0a 09 2f ┆yourside); } #ifdef NOSHELL /┆ 0x04f200…09e600 2a 20 64 6f 20 72 65 64 69 72 65 63 74 69 6f 6e 73 20 2a 2f 0a 09 69 66 20 28 72 65 64 69 72 65 ┆* do redirections */ if (redire┆ 0x04f200…09e600 63 74 20 21 3d 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 0a 09 7b 0a 09 20 20 20 20 46 49 4c 45 ┆ct != (char *)NULL) { FILE┆ 0x04f200…09e600 20 2a 66 70 3b 0a 0a 09 20 20 20 20 66 70 20 3d 20 66 6f 70 65 6e 28 72 65 64 69 72 65 63 74 2c ┆ *fp; fp = fopen(redirect,┆ 0x04f200…09e600 20 6d 6f 64 65 29 3b 0a 09 20 20 20 20 69 66 20 28 66 70 20 3d 3d 20 28 46 49 4c 45 20 2a 29 4e ┆ mode); if (fp == (FILE *)N┆ 0x04f200…09e600 55 4c 4c 20 7c 7c 20 28 66 64 20 3d 20 66 69 6c 65 6e 6f 28 66 70 29 29 20 3d 3d 20 46 41 49 4c ┆ULL || (fd = fileno(fp)) == FAIL┆ 0x04f200…09e600 29 0a 09 09 5f 65 78 69 74 28 32 29 3b 0a 0a 09 20 20 20 20 69 66 20 28 77 6d 6f 64 65 20 21 3d ┆) _exit(2); if (wmode !=┆ 0x04f200…09e600 20 66 64 29 0a 09 20 20 20 20 7b 0a 09 09 28 76 6f 69 64 29 20 63 6c 6f 73 65 28 77 6d 6f 64 65 ┆ fd) { (void) close(wmode┆ 0x04f200…09e600 29 3b 0a 09 09 28 76 6f 69 64 29 20 64 75 70 28 66 64 29 3b 0a 09 09 28 76 6f 69 64 29 20 63 6c ┆); (void) dup(fd); (void) cl┆ 0x04f200…09e600 6f 73 65 28 66 64 29 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 0a 09 28 76 6f 69 64 29 20 65 78 65 63 ┆ose(fd); } } (void) exec┆ 0x04f200…09e600 76 70 28 6c 61 72 67 76 5b 30 5d 2c 20 6c 61 72 67 76 29 3b 0a 23 65 6c 73 65 0a 09 28 76 6f 69 ┆vp(largv[0], largv); #else (voi┆ 0x04f200…09e600 64 29 20 65 78 65 63 6c 28 22 2f 62 69 6e 2f 73 68 22 2c 20 22 73 68 22 2c 20 22 2d 63 22 2c 20 ┆d) execl("/bin/sh", "sh", "-c", ┆ 0x04f200…09e600 63 6d 64 2c 20 30 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 4e 4f 53 48 45 4c 4c 20 2a 2f 0a 09 70 ┆cmd, 0); #endif /* NOSHELL */ p┆ 0x04f200…09e600 65 72 72 6f 72 28 22 65 78 65 63 20 69 6e 20 70 65 6f 70 65 6e 28 29 20 66 61 69 6c 65 64 22 29 ┆error("exec in peopen() failed")┆ 0x04f200…09e600 3b 0a 09 5f 65 78 69 74 28 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 70 69 64 20 3d ┆; _exit(1); } if (pid =┆ 0x04f200…09e600 3d 20 2d 31 29 0a 09 72 65 74 75 72 6e 28 28 46 49 4c 45 20 2a 29 4e 55 4c 4c 29 3b 0a 20 20 20 ┆= -1) return((FILE *)NULL); ┆ 0x04f200…09e600 20 70 65 6f 70 65 6e 5f 70 69 64 5b 6d 79 73 69 64 65 5d 20 3d 20 70 69 64 3b 0a 20 20 20 20 28 ┆ peopen_pid[myside] = pid; (┆ 0x04f200…09e600 76 6f 69 64 29 20 63 6c 6f 73 65 28 79 6f 75 72 73 69 64 65 29 3b 0a 20 20 20 20 72 65 74 75 72 ┆void) close(yourside); retur┆ 0x04f200…09e600 6e 28 66 64 6f 70 65 6e 28 6d 79 73 69 64 65 2c 20 6d 6f 64 65 29 29 3b 0a 7d 0a 0a 69 6e 74 20 ┆n(fdopen(myside, mode)); } int ┆ 0x04f200…09e600 70 65 63 6c 6f 73 65 28 70 74 72 29 0a 2f 2a 20 77 65 27 72 65 20 64 6f 6e 65 20 77 72 69 74 69 ┆peclose(ptr) /* we're done writi┆ 0x04f200…09e600 6e 67 20 74 6f 20 74 68 65 20 63 6f 6d 6d 61 6e 64 2c 20 63 6c 6f 73 65 20 75 70 20 74 68 65 20 ┆ng to the command, close up the ┆ 0x04f200…09e600 70 69 70 65 73 20 61 6e 64 20 6c 65 74 20 27 65 72 20 72 69 70 20 2a 2f 0a 46 49 4c 45 20 2a 70 ┆pipes and let 'er rip */ FILE *p┆ 0x04f200…09e600 74 72 3b 0a 7b 0a 20 20 20 20 72 65 67 69 73 74 65 72 20 69 6e 74 09 66 2c 20 72 3b 0a 20 20 20 ┆tr; { register int f, r; ┆ 0x04f200…09e600 20 63 61 74 63 68 5f 74 09 09 28 2a 68 61 6e 67 75 70 66 29 28 29 2c 20 28 2a 69 67 6e 6f 72 65 ┆ catch_t (*hangupf)(), (*ignore┆ 0x04f200…09e600 66 29 28 29 2c 20 28 2a 71 75 69 74 66 29 28 29 3b 0a 20 20 20 20 77 61 69 74 5f 74 09 09 73 74 ┆f)(), (*quitf)(); wait_t st┆ 0x04f200…09e600 61 74 75 73 3b 0a 0a 20 20 20 20 66 20 3d 20 66 69 6c 65 6e 6f 28 70 74 72 29 3b 0a 20 20 20 20 ┆atus; f = fileno(ptr); ┆ 0x04f200…09e600 28 76 6f 69 64 29 20 66 63 6c 6f 73 65 28 70 74 72 29 3b 0a 20 20 20 20 69 67 6e 6f 72 65 66 20 ┆(void) fclose(ptr); ignoref ┆ 0x04f200…09e600 3d 20 73 69 67 6e 61 6c 28 53 49 47 49 4e 54 2c 20 53 49 47 43 41 53 54 28 53 49 47 5f 49 47 4e ┆= signal(SIGINT, SIGCAST(SIG_IGN┆ 0x04f200…09e600 29 29 3b 0a 20 20 20 20 71 75 69 74 66 20 3d 20 73 69 67 6e 61 6c 28 53 49 47 51 55 49 54 2c 20 ┆)); quitf = signal(SIGQUIT, ┆ 0x04f200…09e600 53 49 47 43 41 53 54 28 53 49 47 5f 49 47 4e 29 29 3b 0a 20 20 20 20 68 61 6e 67 75 70 66 20 3d ┆SIGCAST(SIG_IGN)); hangupf =┆ 0x04f200…09e600 20 73 69 67 6e 61 6c 28 53 49 47 48 55 50 2c 20 53 49 47 43 41 53 54 28 53 49 47 5f 49 47 4e 29 ┆ signal(SIGHUP, SIGCAST(SIG_IGN)┆ 0x04f200…09e600 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 28 72 20 3d 20 77 61 69 74 28 26 73 74 61 74 75 73 29 29 ┆); while((r = wait(&status))┆ 0x04f200…09e600 20 21 3d 20 70 65 6f 70 65 6e 5f 70 69 64 5b 66 5d 20 26 26 20 28 72 20 21 3d 20 2d 31 20 7c 7c ┆ != peopen_pid[f] && (r != -1 ||┆ 0x04f200…09e600 20 65 72 72 6e 6f 20 3d 3d 20 45 49 4e 54 52 29 29 0a 09 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 ┆ errno == EINTR)) continue; ┆ 0x04f200…09e600 20 69 66 20 28 72 20 3d 3d 20 2d 31 29 0a 09 73 74 61 74 75 73 2e 77 5f 73 74 61 74 75 73 20 3d ┆ if (r == -1) status.w_status =┆ 0x04f200…09e600 20 2d 31 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 73 69 67 6e 61 6c 28 53 49 47 49 4e 54 2c 20 53 ┆ -1; (void) signal(SIGINT, S┆ 0x04f200…09e600 49 47 43 41 53 54 28 69 67 6e 6f 72 65 66 29 29 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 73 69 67 ┆IGCAST(ignoref)); (void) sig┆ 0x04f200…09e600 6e 61 6c 28 53 49 47 51 55 49 54 2c 20 53 49 47 43 41 53 54 28 71 75 69 74 66 29 29 3b 0a 20 20 ┆nal(SIGQUIT, SIGCAST(quitf)); ┆ 0x04f200…09e600 20 20 28 76 6f 69 64 29 20 73 69 67 6e 61 6c 28 53 49 47 48 55 50 2c 20 53 49 47 43 41 53 54 28 ┆ (void) signal(SIGHUP, SIGCAST(┆ 0x04f200…09e600 68 61 6e 67 75 70 66 29 29 3b 0a 23 69 66 64 65 66 20 43 4c 4f 53 45 41 4c 4c 09 2f 2a 20 74 68 ┆hangupf)); #ifdef CLOSEALL /* th┆ 0x04f200…09e600 69 73 20 73 65 65 6d 73 20 74 6f 20 62 72 65 61 6b 20 70 72 6f 63 65 73 73 65 73 20 77 69 74 68 ┆is seems to break processes with┆ 0x04f200…09e600 20 6d 75 6c 74 69 70 6c 65 20 70 65 6f 70 65 6e 73 28 29 20 2a 2f 0a 20 20 20 20 70 65 6f 70 65 ┆ multiple peopens() */ peope┆ 0x04f200…09e600 6e 5f 70 69 64 5b 66 5d 20 3d 20 30 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 43 4c 4f 53 45 41 4c 4c ┆n_pid[f] = 0; #endif /* CLOSEALL┆ 0x04f200…09e600 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 28 73 74 61 74 75 73 2e 77 5f 73 74 61 74 75 73 29 3b ┆ */ return(status.w_status);┆ 0x04f200…09e600 0a 7d 0a 0a 2f 2a 20 70 65 6f 70 65 6e 2e 63 20 65 6e 64 73 20 68 65 72 65 20 2a 2f 0a 54 2c 20 ┆ } /* peopen.c ends here */ T, ┆ 0x04f200…09e600 53 49 47 43 41 53 54 28 53 49 47 5f 49 47 4e 29 29 3b 0a 20 20 20 20 68 61 6e 67 75 70 66 20 3d ┆SIGCAST(SIG_IGN)); hangupf =┆ 0x04f200…09e600 20 73 69 67 6e 61 6c 28 53 49 47 48 55 50 2c 20 53 49 47 43 41 53 54 28 53 49 47 5f 49 47 4e 29 ┆ signal(SIGHUP, SIGCAST(SIG_IGN)┆ 0x04f200…09e600 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 28 72 20 3d 73 72 63 2f 44 2e 70 6f 72 74 2f 70 72 65 66 ┆); while((r =src/D.port/pref┆ 0x04f200…09e600 69 78 2e 63 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆ix.c ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆ ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 20 20 20 34 34 34 20 00 20 20 20 ┆ 444 ┆ 0x04f200…09e600 31 34 35 20 00 20 20 20 20 20 31 20 00 20 20 20 20 20 20 20 31 30 37 30 20 20 34 34 35 36 31 35 ┆145 1 1070 445615┆ 0x04f200…09e600 34 30 35 34 20 20 20 37 34 36 31 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆4054 7461 ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆ ┆ […0x9…] 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 2f 2a 20 4c 49 4e 54 4c 49 42 52 41 52 59 20 ┆ /* LINTLIBRARY ┆ 0x04f200…09e600 2a 2f 0a 2f 2a 0a 20 2a 20 20 54 68 69 73 20 73 6f 66 74 77 61 72 65 20 69 73 20 43 6f 70 79 72 ┆*/ /* * This software is Copyr┆ 0x04f200…09e600 69 67 68 74 20 28 43 29 20 31 39 38 39 20 62 79 20 45 72 69 63 20 53 2e 20 52 61 79 6d 6f 6e 64 ┆ight (C) 1989 by Eric S. Raymond┆ 0x04f200…09e600 20 66 6f 72 20 74 68 65 20 73 6f 6c 65 20 70 75 72 70 6f 73 65 0a 20 2a 20 6f 66 20 70 72 6f 74 ┆ for the sole purpose * of prot┆ 0x04f200…09e600 65 63 74 69 6e 67 20 66 72 65 65 20 72 65 64 69 73 74 72 69 62 75 74 69 6f 6e 3b 20 73 65 65 20 ┆ecting free redistribution; see ┆ 0x04f200…09e600 74 68 65 20 4c 49 43 45 4e 53 45 20 66 69 6c 65 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 20 2a ┆the LICENSE file for details. *┆ 0x04f200…09e600 2f 0a 23 69 6e 63 6c 75 64 65 20 22 6c 69 62 70 6f 72 74 2e 68 22 0a 0a 62 6f 6f 6c 20 70 72 65 ┆/ #include "libport.h" bool pre┆ 0x04f200…09e600 66 69 78 28 66 75 6c 6c 2c 20 70 72 65 66 29 0a 2f 2a 20 72 65 74 75 72 6e 20 54 52 55 45 20 69 ┆fix(full, pref) /* return TRUE i┆ 0x04f200…09e600 66 20 70 72 65 66 20 69 73 20 61 20 70 72 65 66 69 78 20 6f 66 20 66 75 6c 6c 2c 20 46 41 4c 53 ┆f pref is a prefix of full, FALS┆ 0x04f200…09e600 45 20 6f 74 68 65 72 77 69 73 65 20 2a 2f 0a 72 65 67 69 73 74 65 72 20 63 68 61 72 20 2a 66 75 ┆E otherwise */ register char *fu┆ 0x04f200…09e600 6c 6c 2c 20 2a 70 72 65 66 3b 0a 7b 0a 20 20 20 20 72 65 67 69 73 74 65 72 20 63 68 61 72 20 66 ┆ll, *pref; { register char f┆ 0x04f200…09e600 63 2c 20 70 63 3b 0a 0a 20 20 20 20 77 68 69 6c 65 20 28 28 70 63 20 3d 20 2a 70 72 65 66 2b 2b ┆c, pc; while ((pc = *pref++┆ 0x04f200…09e600 29 20 21 3d 20 27 5c 30 27 29 0a 20 20 20 20 7b 0a 09 66 63 20 3d 20 2a 66 75 6c 6c 2b 2b 3b 0a ┆) != '\0') { fc = *full++; ┆ 0x04f200…09e600 09 69 66 20 28 69 73 75 70 70 65 72 28 66 63 29 29 0a 09 20 20 20 20 66 63 20 3d 20 74 6f 6c 6f ┆ if (isupper(fc)) fc = tolo┆ 0x04f200…09e600 77 65 72 28 66 63 29 3b 0a 09 69 66 20 28 69 73 75 70 70 65 72 28 70 63 29 29 0a 09 20 20 20 20 ┆wer(fc); if (isupper(pc)) ┆ 0x04f200…09e600 70 63 20 3d 20 74 6f 6c 6f 77 65 72 28 70 63 29 3b 0a 09 69 66 20 28 66 63 20 21 3d 20 70 63 29 ┆pc = tolower(pc); if (fc != pc)┆ 0x04f200…09e600 0a 09 20 20 20 20 72 65 74 75 72 6e 28 46 41 4c 53 45 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 ┆ return(FALSE); } r┆ 0x04f200…09e600 65 74 75 72 6e 28 54 52 55 45 29 3b 0a 7d 0a 0a 2f 2a 20 70 72 65 66 69 78 2e 63 20 65 6e 64 73 ┆eturn(TRUE); } /* prefix.c ends┆ 0x04f200…09e600 20 68 65 72 65 20 2a 2f 0a 31 39 38 39 20 62 79 20 45 72 69 63 20 53 2e 20 52 61 79 6d 6f 6e 64 ┆ here */ 1989 by Eric S. Raymond┆ 0x04f200…09e600 20 66 6f 72 20 74 68 65 20 73 6f 6c 65 20 70 75 72 70 6f 73 65 0a 20 2a 20 6f 66 20 70 72 6f 74 ┆ for the sole purpose * of prot┆ 0x04f200…09e600 65 63 74 69 6e 67 20 66 72 65 65 20 72 65 64 69 73 74 72 69 62 75 74 69 6f 6e 3b 20 73 65 65 20 ┆ecting free redistribution; see ┆ 0x04f200…09e600 74 68 65 20 4c 49 43 45 4e 53 45 20 66 69 6c 65 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 20 2a ┆the LICENSE file for details. *┆ 0x04f200…09e600 2f 0a 23 69 6e 63 6c 75 64 65 20 22 6c 69 62 70 6f 72 74 2e 68 22 0a 0a 62 6f 6f 6c 20 70 72 65 ┆/ #include "libport.h" bool pre┆ 0x04f200…09e600 66 69 78 28 66 75 6c 6c 2c 20 70 72 65 66 29 0a 2f 2a 20 72 65 74 75 72 6e 20 54 52 55 45 20 69 ┆fix(full, pref) /* return TRUE i┆ 0x04f200…09e600 66 20 70 72 65 66 20 69 73 20 61 20 70 72 65 66 69 78 20 6f 66 20 66 75 6c 6c 2c 20 46 41 4c 53 ┆f pref is a prefix of full, FALS┆ 0x04f200…09e600 45 20 6f 74 68 65 72 77 69 73 65 20 2a 2f 0a 72 65 67 69 73 74 65 72 20 63 68 61 72 20 2a 66 75 ┆E otherwise */ register char *fu┆ 0x04f200…09e600 6c 6c 2c 20 2a 70 72 65 66 3b 0a 7b 0a 20 20 20 20 72 65 67 69 73 74 65 72 20 63 68 61 72 20 66 ┆ll, *pref; { register char f┆ 0x04f200…09e600 63 2c 20 70 63 3b 0a 0a 20 20 20 20 77 68 69 6c 65 20 28 28 70 63 20 3d 20 2a 70 72 65 66 2b 2b ┆c, pc; while ((pc = *pref++┆ 0x04f200…09e600 29 20 21 3d 20 27 5c 30 27 29 0a 20 20 20 20 7b 0a 09 66 63 20 3d 20 2a 66 75 6c 6c 2b 2b 3b 0a ┆) != '\0') { fc = *full++; ┆ 0x04f200…09e600 09 69 66 20 28 69 73 75 70 70 65 72 28 66 63 29 29 0a 09 20 20 20 20 66 63 20 3d 20 74 6f 6c 6f ┆ if (isupper(fc)) fc = tolo┆ 0x04f200…09e600 77 65 72 28 66 63 29 3b 0a 09 69 66 20 28 69 73 75 70 70 65 72 28 70 63 29 29 0a 09 20 20 20 20 ┆wer(fc); if (isupper(pc)) ┆ 0x04f200…09e600 70 63 20 3d 20 74 6f 6c 6f 77 65 72 28 70 63 29 3b 0a 09 69 66 20 28 66 63 20 21 3d 20 70 63 29 ┆pc = tolower(pc); if (fc != pc)┆ 0x04f200…09e600 0a 09 20 20 20 20 72 65 74 75 72 6e 28 46 41 4c 53 73 72 63 2f 44 2e 70 6f 72 74 2f 70 72 6f 63 ┆ return(FALSsrc/D.port/proc┆ 0x04f200…09e600 6f 70 74 73 2e 63 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆opts.c ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆ ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 20 20 20 34 34 34 20 00 20 20 20 ┆ 444 ┆ 0x04f200…09e600 31 34 35 20 00 20 20 20 20 20 31 20 00 20 20 20 20 20 20 31 33 33 31 36 20 20 34 34 35 36 37 32 ┆145 1 13316 445672┆ 0x04f200…09e600 30 32 34 31 20 20 31 30 30 36 30 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆0241 10060 ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆ ┆ […0x9…] 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆ /**************┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆********************************┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a ┆******************************* ┆ 0x04f200…09e600 0a 4e 45 57 53 0a 20 20 20 70 72 6f 63 6f 70 74 73 2e 63 20 2d 2d 20 63 6f 6d 6d 6f 6e 20 6f 70 ┆ NEWS procopts.c -- common op┆ 0x04f200…09e600 74 69 6f 6e 73 20 70 72 6f 63 65 73 73 69 6e 67 20 63 6f 64 65 0a 0a 53 59 4e 4f 50 53 49 53 0a ┆tions processing code SYNOPSIS ┆ 0x04f200…09e600 20 20 20 23 69 6e 63 6c 75 64 65 20 22 70 72 6f 63 6f 70 74 73 2e 68 22 0a 0a 20 20 20 69 6e 74 ┆ #include "procopts.h" int┆ 0x04f200…09e600 20 70 72 6f 63 6f 70 74 73 28 61 72 67 63 2c 20 61 72 67 76 2c 20 73 74 61 74 65 2c 20 6f 70 74 ┆ procopts(argc, argv, state, opt┆ 0x04f200…09e600 69 6f 6e 73 29 0a 20 20 20 69 6e 74 20 61 72 67 63 3b 20 63 68 61 72 20 2a 2a 61 72 67 76 3b 20 ┆ions) int argc; char **argv; ┆ 0x04f200…09e600 69 6e 74 20 73 74 61 74 65 3b 20 6f 70 74 69 6f 6e 5f 74 20 2a 6f 70 74 69 6f 6e 73 3b 0a 0a 20 ┆int state; option_t *options; ┆ 0x04f200…09e600 20 20 69 6e 74 20 76 63 72 61 63 6b 28 6c 69 6e 65 2c 20 61 72 67 76 2c 20 6d 61 78 61 72 67 73 ┆ int vcrack(line, argv, maxargs┆ 0x04f200…09e600 29 0a 20 20 20 63 68 61 72 20 2a 6c 69 6e 65 2c 20 2a 61 72 67 76 5b 5d 3b 20 69 6e 74 20 6d 61 ┆) char *line, *argv[]; int ma┆ 0x04f200…09e600 78 61 72 67 73 3b 0a 0a 44 45 53 43 52 49 50 54 49 4f 4e 0a 20 20 20 54 68 65 20 70 72 6f 63 6f ┆xargs; DESCRIPTION The proco┆ 0x04f200…09e600 70 74 73 20 66 75 6e 63 74 69 6f 6e 20 61 63 63 65 70 74 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 ┆pts function accepts an argument┆ 0x04f200…09e600 20 76 65 63 74 6f 72 2c 20 61 6e 20 69 6e 69 74 69 61 6c 20 73 74 61 74 65 2c 20 61 6e 64 20 61 ┆ vector, an initial state, and a┆ 0x04f200…09e600 6e 0a 6f 70 74 69 6f 6e 73 20 61 72 72 61 79 20 61 6e 64 20 70 72 6f 63 65 73 73 65 73 20 74 68 ┆n options array and processes th┆ 0x04f200…09e600 65 20 61 72 67 75 6d 65 6e 74 20 76 65 63 74 6f 72 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 20 54 ┆e argument vector accordingly. T┆ 0x04f200…09e600 68 65 20 6f 70 74 69 6f 6e 73 20 61 72 72 61 79 0a 63 6f 6e 73 69 73 74 73 20 6f 66 20 6f 70 74 ┆he options array consists of opt┆ 0x04f200…09e600 69 6f 6e 5f 74 20 73 74 72 75 63 74 75 72 65 73 2e 20 45 61 63 68 20 6f 66 20 74 68 65 73 65 20 ┆ion_t structures. Each of these ┆ 0x04f200…09e600 64 65 66 69 6e 65 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 0a 31 2e 20 41 6e 20 6f 70 ┆defines the following: 1. An op┆ 0x04f200…09e600 74 69 6f 6e 20 6b 65 79 6c 65 74 74 65 72 0a 20 20 20 54 68 69 73 20 69 73 20 74 68 65 20 6c 65 ┆tion keyletter This is the le┆ 0x04f200…09e600 74 74 65 72 20 77 68 69 63 68 2c 20 77 68 65 6e 20 72 65 63 6f 67 6e 69 7a 65 64 2c 20 69 6e 76 ┆tter which, when recognized, inv┆ 0x04f200…09e600 6f 6b 65 73 20 70 72 6f 63 65 73 73 69 6e 67 20 6f 66 20 74 68 69 73 0a 6f 70 74 69 6f 6e 2e 20 ┆okes processing of this option. ┆ 0x04f200…09e600 4f 70 74 69 6f 6e 20 6c 65 74 74 65 72 73 20 61 72 65 20 61 6c 77 61 79 73 20 72 65 63 6f 67 6e ┆Option letters are always recogn┆ 0x04f200…09e600 69 7a 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 27 2d 27 ┆ized immediately following a '-'┆ 0x04f200…09e600 2e 0a 46 6c 61 67 20 6f 70 74 69 6f 6e 73 20 61 72 65 20 72 65 63 6f 67 6e 69 7a 65 64 20 61 74 ┆. Flag options are recognized at┆ 0x04f200…09e600 20 61 6e 79 20 70 6f 73 69 74 69 6f 6e 20 69 6e 20 61 20 27 2d 27 2d 70 72 65 66 69 78 65 64 20 ┆ any position in a '-'-prefixed ┆ 0x04f200…09e600 61 72 67 75 6d 65 6e 74 2e 0a 0a 32 2e 20 41 20 62 75 66 66 65 72 20 66 69 6c 6c 20 63 68 61 72 ┆argument. 2. A buffer fill char┆ 0x04f200…09e600 61 63 74 65 72 0a 20 20 53 65 65 20 23 37 20 62 65 6c 6f 77 2e 0a 0a 33 2e 20 41 20 66 6c 61 67 ┆acter See #7 below. 3. A flag┆ 0x04f200…09e600 20 61 64 64 72 65 73 73 0a 20 20 49 66 20 74 68 69 73 20 6f 70 74 69 6f 6e 20 69 73 20 66 6f 75 ┆ address If this option is fou┆ 0x04f200…09e600 6e 64 2c 20 74 68 65 20 61 64 64 72 65 73 73 20 67 69 76 65 6e 20 69 73 20 73 65 74 20 74 6f 20 ┆nd, the address given is set to ┆ 0x04f200…09e600 54 52 55 45 2c 20 6f 74 68 65 72 77 69 73 65 20 69 74 0a 69 73 20 46 41 4c 53 45 2e 20 49 66 20 ┆TRUE, otherwise it is FALSE. If ┆ 0x04f200…09e600 74 68 65 20 6f 70 74 69 6f 6e 20 69 73 20 6f 66 20 4e 55 4d 42 45 52 20 74 79 70 65 20 61 6e 64 ┆the option is of NUMBER type and┆ 0x04f200…09e600 20 68 61 73 20 61 20 76 61 6c 75 65 20 74 68 65 20 76 61 6c 75 65 20 77 69 6c 6c 20 62 65 0a 70 ┆ has a value the value will be p┆ 0x04f200…09e600 75 74 20 74 68 65 72 65 2e 0a 0a 34 2e 20 41 6e 20 65 6e 74 72 79 20 6d 6f 64 65 0a 20 20 20 50 ┆ut there. 4. An entry mode P┆ 0x04f200…09e600 72 6f 63 6f 70 74 73 20 6b 65 65 70 73 20 72 75 6e 6e 69 6e 67 20 74 72 61 63 6b 20 6f 66 20 61 ┆rocopts keeps running track of a┆ 0x04f200…09e600 20 27 6d 6f 64 65 27 20 77 68 69 63 68 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 44 4e 43 20 28 ┆ 'mode' which is initially DNC (┆ 0x04f200…09e600 44 6f 20 4e 6f 74 0a 43 61 72 65 29 2e 20 49 66 20 61 6e 20 6f 70 74 69 6f 6e 27 73 20 65 6e 74 ┆Do Not Care). If an option's ent┆ 0x04f200…09e600 72 79 20 73 74 61 74 65 20 69 73 20 6f 74 68 65 72 20 74 68 61 6e 20 44 4e 43 20 61 6e 64 20 64 ┆ry state is other than DNC and d┆ 0x04f200…09e600 6f 65 73 6e 27 74 20 6d 61 74 63 68 20 74 68 65 0a 63 75 72 72 65 6e 74 20 6d 6f 64 65 20 28 73 ┆oesn't match the current mode (s┆ 0x04f200…09e600 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 20 69 66 20 74 68 65 20 26 20 6f 66 20 74 68 65 20 65 6e ┆pecifically, if the & of the en┆ 0x04f200…09e600 74 72 79 20 6d 6f 64 65 20 61 6e 64 20 63 75 72 72 65 6e 74 20 6d 6f 64 65 20 69 73 20 30 29 0a ┆try mode and current mode is 0) ┆ 0x04f200…09e600 61 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 0a 35 2e 20 41 6e 20 65 78 69 ┆an error is returned. 5. An exi┆ 0x04f200…09e600 74 20 6d 6f 64 65 0a 20 20 20 49 66 20 74 68 69 73 20 6d 65 6d 62 65 72 20 69 73 20 6f 74 68 65 ┆t mode If this member is othe┆ 0x04f200…09e600 72 20 74 68 61 6e 20 44 4e 43 20 74 68 65 20 63 75 72 72 65 6e 74 20 6d 6f 64 65 20 69 73 20 73 ┆r than DNC the current mode is s┆ 0x04f200…09e600 65 74 20 74 6f 20 69 74 20 61 66 74 65 72 20 74 68 65 0a 6f 70 74 69 6f 6e 20 69 73 20 70 72 6f ┆et to it after the option is pro┆ 0x04f200…09e600 63 65 73 73 65 64 2e 20 54 68 69 73 20 66 69 65 6c 64 2c 20 74 6f 67 65 74 68 65 72 20 77 69 74 ┆cessed. This field, together wit┆ 0x04f200…09e600 68 20 74 68 65 20 70 72 65 76 69 6f 75 73 2c 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 0a 65 ┆h the previous, can be used to e┆ 0x04f200…09e600 6e 66 6f 72 63 65 20 6d 75 74 75 61 6c 20 65 78 63 6c 75 73 69 76 69 74 79 20 6f 66 20 76 61 72 ┆nforce mutual exclusivity of var┆ 0x04f200…09e600 69 6f 75 73 20 73 65 74 73 20 6f 66 20 6f 70 74 69 6f 6e 73 2e 0a 0a 36 2e 20 41 6e 20 61 72 67 ┆ious sets of options. 6. An arg┆ 0x04f200…09e600 75 6d 65 6e 74 20 74 79 70 65 0a 20 20 20 41 6e 20 4f 50 54 49 4f 4e 20 74 79 70 65 20 6f 70 74 ┆ument type An OPTION type opt┆ 0x04f200…09e600 69 6f 6e 20 73 69 6d 70 6c 79 20 73 65 74 73 20 69 74 73 20 66 6c 61 67 20 76 61 72 69 61 62 6c ┆ion simply sets its flag variabl┆ 0x04f200…09e600 65 2e 20 41 20 4e 55 4d 42 45 52 20 6f 70 74 69 6f 6e 2c 0a 77 68 65 6e 20 65 6e 63 6f 75 6e 74 ┆e. A NUMBER option, when encount┆ 0x04f200…09e600 65 72 65 64 2c 20 6c 6f 61 64 73 20 69 74 73 20 66 6c 61 67 20 76 61 72 69 61 62 6c 65 20 77 69 ┆ered, loads its flag variable wi┆ 0x04f200…09e600 74 68 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 6e 65 78 74 20 66 6f 6c 6c 6f 77 69 ┆th the value of the next followi┆ 0x04f200…09e600 6e 67 0a 74 6f 6b 65 6e 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 61 20 64 65 63 69 6d 61 ┆ng token interpreted as a decima┆ 0x04f200…09e600 6c 20 69 6e 74 65 67 65 72 20 28 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73 75 63 68 20 74 ┆l integer (if there is no such t┆ 0x04f200…09e600 6f 6b 65 6e 20 31 2c 20 6e 6f 74 20 30 20 69 73 0a 6c 6f 61 64 65 64 29 2e 20 46 6f 72 20 53 54 ┆oken 1, not 0 is loaded). For ST┆ 0x04f200…09e600 52 49 4e 47 20 6f 70 74 69 6f 6e 73 20 73 65 65 20 62 65 6c 6f 77 2e 0a 0a 37 2e 20 41 20 62 75 ┆RING options see below. 7. A bu┆ 0x04f200…09e600 66 66 65 72 20 61 64 64 72 65 73 73 0a 20 20 20 41 20 53 54 52 49 4e 47 20 6f 70 74 69 6f 6e 20 ┆ffer address A STRING option ┆ 0x04f200…09e600 69 6e 74 65 72 70 72 65 74 73 20 61 6c 6c 20 74 6f 6b 65 6e 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 ┆interprets all tokens following ┆ 0x04f200…09e600 74 68 65 20 63 75 72 72 65 6e 74 20 61 72 67 75 6d 65 6e 74 0a 75 70 20 74 6f 20 62 75 74 20 6e ┆the current argument up to but n┆ 0x04f200…09e600 6f 74 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 6e 65 78 74 20 27 2d 27 2d 70 72 65 66 69 78 ┆ot including the next '-'-prefix┆ 0x04f200…09e600 65 64 20 74 6f 6b 65 6e 20 61 73 20 73 74 72 69 6e 67 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 0a ┆ed token as string arguments to ┆ 0x04f200…09e600 62 65 20 63 6f 6e 63 61 74 65 6e 61 74 65 64 20 69 6e 74 6f 20 69 74 73 20 62 75 66 66 65 72 2e ┆be concatenated into its buffer.┆ 0x04f200…09e600 20 4f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 69 6c 6c 20 63 68 61 72 61 63 ┆ One instance of the fill charac┆ 0x04f200…09e600 74 65 72 20 69 73 0a 69 6e 73 65 72 74 65 64 20 62 65 74 77 65 65 6e 20 65 61 63 68 20 70 61 69 ┆ter is inserted between each pai┆ 0x04f200…09e600 72 20 6f 66 20 73 74 72 69 6e 67 73 20 63 6f 6e 63 61 74 65 6e 61 74 65 64 2e 0a 0a 20 20 20 49 ┆r of strings concatenated. I┆ 0x04f200…09e600 66 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 6c 61 63 6b 73 20 61 20 6c 65 61 ┆f the first argument lacks a lea┆ 0x04f200…09e600 64 69 6e 67 20 64 61 73 68 2c 20 70 72 6f 63 6f 70 74 73 28 29 20 61 63 74 73 20 61 73 20 74 68 ┆ding dash, procopts() acts as th┆ 0x04f200…09e600 6f 75 67 68 0a 74 68 65 20 6b 65 79 6c 65 74 74 65 72 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 ┆ough the keyletter of the first ┆ 0x04f200…09e600 6f 70 74 69 6f 6e 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 77 65 72 65 20 69 6e 73 65 72 74 65 ┆option in the table were inserte┆ 0x04f200…09e600 64 20 69 6e 20 66 72 6f 6e 74 20 6f 66 20 69 74 2e 0a 0a 20 20 20 49 66 20 6e 6f 20 6f 70 74 69 ┆d in front of it. If no opti┆ 0x04f200…09e600 6f 6e 20 6d 61 74 63 68 69 6e 67 20 61 20 66 6f 75 6e 64 20 6b 65 79 6c 65 74 74 65 72 20 69 73 ┆on matching a found keyletter is┆ 0x04f200…09e600 20 66 6f 75 6e 64 2c 20 46 41 49 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 0a 70 72 6f ┆ found, FAIL is returned and pro┆ 0x04f200…09e600 63 65 73 73 69 6e 67 20 73 74 6f 70 73 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74 2e 0a 0a 20 20 ┆cessing stops at that point. ┆ 0x04f200…09e600 20 4e 6f 74 65 20 74 68 61 74 20 70 72 6f 63 6f 70 74 73 28 29 20 69 67 6e 6f 72 65 73 20 61 72 ┆ Note that procopts() ignores ar┆ 0x04f200…09e600 67 76 5b 30 5d 2e 0a 0a 20 20 20 54 68 65 20 76 63 72 61 63 6b 20 70 72 6f 63 65 64 75 72 65 20 ┆gv[0]. The vcrack procedure ┆ 0x04f200…09e600 69 73 20 70 72 6f 76 69 64 65 64 20 66 6f 72 20 70 61 72 73 69 6e 67 20 61 72 67 75 6d 65 6e 74 ┆is provided for parsing argument┆ 0x04f200…09e600 20 76 65 63 74 6f 72 73 20 66 72 6f 6d 20 74 65 78 74 0a 6c 69 6e 65 73 2e 20 49 74 20 64 6f 65 ┆ vectors from text lines. It doe┆ 0x04f200…09e600 73 20 2a 6e 6f 74 2a 20 69 67 6e 6f 72 65 20 61 72 67 76 5b 30 5d 2e 0a 0a 42 55 47 53 0a 20 20 ┆s *not* ignore argv[0]. BUGS ┆ 0x04f200…09e600 20 54 68 65 20 63 6f 64 65 20 69 6e 73 69 73 74 73 20 74 68 61 74 20 74 68 65 20 66 69 72 73 74 ┆ The code insists that the first┆ 0x04f200…09e600 20 6f 70 74 69 6f 6e 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 62 65 20 6f 66 20 53 54 52 49 4e ┆ option in the table be of STRIN┆ 0x04f200…09e600 47 20 74 79 70 65 2e 0a 54 68 69 73 20 69 73 20 73 6f 20 74 68 65 72 65 20 77 69 6c 6c 20 61 6c ┆G type. This is so there will al┆ 0x04f200…09e600 77 61 79 73 20 62 65 20 61 20 76 61 6c 69 64 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 72 20 74 ┆ways be a valid buffer pointer t┆ 0x04f200…09e600 6f 20 63 6f 6e 73 20 73 74 72 69 6e 67 73 20 74 6f 0a 74 68 65 20 65 6e 64 20 6f 66 2e 0a 0a 41 ┆o cons strings to the end of. A┆ 0x04f200…09e600 55 54 48 4f 52 0a 20 20 20 45 72 69 63 20 53 2e 20 52 61 79 6d 6f 6e 64 0a 20 20 20 54 68 69 73 ┆UTHOR Eric S. Raymond This┆ 0x04f200…09e600 20 73 6f 66 74 77 61 72 65 20 69 73 20 43 6f 70 79 72 69 67 68 74 20 28 43 29 20 31 39 38 39 20 ┆ software is Copyright (C) 1989 ┆ 0x04f200…09e600 62 79 20 45 72 69 63 20 53 2e 20 52 61 79 6d 6f 6e 64 20 66 6f 72 20 74 68 65 20 73 6f 6c 65 20 ┆by Eric S. Raymond for the sole ┆ 0x04f200…09e600 70 75 72 70 6f 73 65 0a 6f 66 20 70 72 6f 74 65 63 74 69 6e 67 20 66 72 65 65 20 72 65 64 69 73 ┆purpose of protecting free redis┆ 0x04f200…09e600 74 72 69 62 75 74 69 6f 6e 3b 20 73 65 65 20 74 68 65 20 4c 49 43 45 4e 53 45 20 66 69 6c 65 20 ┆tribution; see the LICENSE file ┆ 0x04f200…09e600 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆for details. ******************┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆********************************┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 20 ┆***************************/ /* ┆ 0x04f200…09e600 4c 49 4e 54 4c 49 42 52 41 52 59 20 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 6c 69 62 70 6f 72 74 ┆LINTLIBRARY */ #include "libport┆ 0x04f200…09e600 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 70 72 6f 63 6f 70 74 73 2e 68 22 0a 0a 69 6e 74 20 70 ┆.h" #include "procopts.h" int p┆ 0x04f200…09e600 72 6f 63 6f 70 74 73 28 61 72 67 63 2c 20 61 72 67 76 2c 20 73 74 61 74 65 2c 20 6f 70 74 69 6f ┆rocopts(argc, argv, state, optio┆ 0x04f200…09e600 6e 73 29 0a 72 65 67 69 73 74 65 72 20 69 6e 74 09 61 72 67 63 3b 09 09 2f 2a 20 63 6f 75 6e 74 ┆ns) register int argc; /* count┆ 0x04f200…09e600 20 6f 66 20 6f 70 74 69 6f 6e 73 20 74 6f 20 70 72 6f 63 65 73 73 20 2a 2f 0a 72 65 67 69 73 74 ┆ of options to process */ regist┆ 0x04f200…09e600 65 72 20 63 68 61 72 09 2a 2a 61 72 67 76 3b 09 09 2f 2a 20 76 65 63 74 6f 72 20 6f 66 20 6f 70 ┆er char **argv; /* vector of op┆ 0x04f200…09e600 74 69 6f 6e 20 73 74 72 69 6e 67 73 20 2a 2f 0a 69 6e 74 09 09 73 74 61 74 65 3b 09 09 2f 2a 20 ┆tion strings */ int state; /* ┆ 0x04f200…09e600 6d 6f 64 65 20 74 6f 20 73 74 61 72 74 20 69 6e 20 2a 2f 0a 6f 70 74 69 6f 6e 5f 74 09 2a 6f 70 ┆mode to start in */ option_t *op┆ 0x04f200…09e600 74 69 6f 6e 73 3b 09 2f 2a 20 6f 70 74 69 6f 6e 73 20 74 61 62 6c 65 20 74 6f 20 75 73 65 20 2a ┆tions; /* options table to use *┆ 0x04f200…09e600 2f 0a 7b 0a 20 20 20 20 72 65 67 69 73 74 65 72 20 63 68 61 72 20 2a 62 75 66 2c 20 2a 70 74 72 ┆/ { register char *buf, *ptr┆ 0x04f200…09e600 3b 0a 20 20 20 20 63 68 61 72 20 66 69 6c 63 68 61 72 2c 20 66 69 72 73 74 6f 70 74 5b 33 5d 3b ┆; char filchar, firstopt[3];┆ 0x04f200…09e600 0a 20 20 20 20 69 6e 74 20 6c 65 6e 2c 20 74 6c 65 6e 3b 0a 20 20 20 20 6f 70 74 69 6f 6e 5f 74 ┆ int len, tlen; option_t┆ 0x04f200…09e600 20 2a 6f 70 74 70 74 3b 0a 0a 20 20 20 20 69 66 20 28 61 72 67 63 20 3d 3d 20 30 29 0a 09 72 65 ┆ *optpt; if (argc == 0) re┆ 0x04f200…09e600 74 75 72 6e 28 73 74 61 74 65 29 3b 0a 0a 20 20 20 20 2f 2a 20 66 6f 72 63 65 20 74 68 65 20 66 ┆turn(state); /* force the f┆ 0x04f200…09e600 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 66 20 6e 6f 20 2d 20 73 77 69 74 63 68 20 69 73 20 ┆irst argument if no - switch is ┆ 0x04f200…09e600 67 69 76 65 6e 20 2a 2f 0a 20 20 20 20 69 66 20 28 61 72 67 76 5b 31 5d 20 21 3d 20 28 63 68 61 ┆given */ if (argv[1] != (cha┆ 0x04f200…09e600 72 20 2a 29 4e 55 4c 4c 20 26 26 20 61 72 67 76 5b 31 5d 5b 30 5d 20 21 3d 20 27 2d 27 20 26 26 ┆r *)NULL && argv[1][0] != '-' &&┆ 0x04f200…09e600 20 61 72 67 76 5b 31 5d 5b 30 5d 20 21 3d 20 27 2b 27 29 0a 20 20 20 20 7b 0a 09 66 69 72 73 74 ┆ argv[1][0] != '+') { first┆ 0x04f200…09e600 6f 70 74 5b 30 5d 20 3d 20 27 2d 27 3b 0a 09 66 69 72 73 74 6f 70 74 5b 31 5d 20 3d 20 6f 70 74 ┆opt[0] = '-'; firstopt[1] = opt┆ 0x04f200…09e600 69 6f 6e 73 5b 30 5d 2e 6f 70 74 6c 65 74 3b 0a 09 66 69 72 73 74 6f 70 74 5b 32 5d 20 3d 20 27 ┆ions[0].optlet; firstopt[2] = '┆ 0x04f200…09e600 5c 30 27 3b 0a 09 61 72 67 76 5b 30 5d 20 3d 20 66 69 72 73 74 6f 70 74 3b 0a 20 20 20 20 7d 0a ┆\0'; argv[0] = firstopt; } ┆ 0x04f200…09e600 20 20 20 20 65 6c 73 65 0a 09 2b 2b 61 72 67 76 2c 20 2d 2d 61 72 67 63 3b 0a 0a 23 69 66 64 65 ┆ else ++argv, --argc; #ifde┆ 0x04f200…09e600 66 20 50 44 45 42 55 47 0a 20 20 20 20 28 76 6f 69 64 29 20 66 70 72 69 6e 74 66 28 73 74 64 65 ┆f PDEBUG (void) fprintf(stde┆ 0x04f200…09e600 72 72 2c 20 22 70 72 6f 63 61 72 67 73 3a 20 61 72 67 63 20 3d 20 25 64 5c 6e 22 2c 20 61 72 67 ┆rr, "procargs: argc = %d\n", arg┆ 0x04f200…09e600 63 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 50 44 45 42 55 47 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 ┆c); #endif /* PDEBUG */ /* ┆ 0x04f200…09e600 6c 6f 6f 70 20 6f 6e 63 65 20 70 65 72 20 61 72 67 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 20 28 3b ┆loop once per arg. */ for (;┆ 0x04f200…09e600 20 61 72 67 63 2d 2d 3b 20 61 72 67 76 2b 2b 29 0a 20 20 20 20 7b 0a 09 69 66 20 28 2a 2a 61 72 ┆ argc--; argv++) { if (**ar┆ 0x04f200…09e600 67 76 20 3d 3d 20 27 2d 27 20 7c 7c 20 2a 2a 61 72 67 76 20 3d 3d 20 27 2b 27 29 0a 09 7b 0a 09 ┆gv == '-' || **argv == '+') { ┆ 0x04f200…09e600 20 20 20 20 69 6e 74 09 20 20 20 20 74 75 72 6e 6f 6e 20 3d 20 28 2a 2a 61 72 67 76 20 3d 3d 20 ┆ int turnon = (**argv == ┆ 0x04f200…09e600 27 2d 27 29 3b 0a 0a 09 20 20 20 20 2f 2a 20 66 69 6e 64 20 61 6e 64 20 73 65 74 20 61 20 6e 65 ┆'-'); /* find and set a ne┆ 0x04f200…09e600 77 20 63 75 72 72 65 6e 74 20 6f 70 74 69 6f 6e 20 2a 2f 0a 09 20 20 20 20 77 68 69 6c 65 20 28 ┆w current option */ while (┆ 0x04f200…09e600 2a 2b 2b 2a 61 72 67 76 20 21 3d 20 27 5c 30 27 29 0a 09 20 20 20 20 7b 0a 09 09 2f 2a 20 73 65 ┆*++*argv != '\0') { /* se┆ 0x04f200…09e600 61 72 63 68 20 74 68 65 20 6f 70 74 69 6f 6e 73 20 74 61 62 6c 65 20 66 6f 72 20 61 20 6d 61 74 ┆arch the options table for a mat┆ 0x04f200…09e600 63 68 69 6e 67 20 6c 65 74 74 65 72 20 2a 2f 0a 09 09 66 6f 72 20 28 6f 70 74 70 74 20 3d 20 6f ┆ching letter */ for (optpt = o┆ 0x04f200…09e600 70 74 69 6f 6e 73 3b 20 6f 70 74 70 74 2d 3e 6f 70 74 6c 65 74 20 21 3d 20 27 5c 30 27 3b 20 2b ┆ptions; optpt->optlet != '\0'; +┆ 0x04f200…09e600 2b 6f 70 74 70 74 29 0a 09 09 7b 0a 09 09 20 20 20 20 69 66 20 28 6f 70 74 70 74 2d 3e 6f 70 74 ┆+optpt) { if (optpt->opt┆ 0x04f200…09e600 6c 65 74 20 3d 3d 20 2a 2a 61 72 67 76 29 0a 09 09 20 20 20 20 7b 0a 09 09 09 2f 2a 20 66 69 72 ┆let == **argv) { /* fir┆ 0x04f200…09e600 73 74 2c 20 63 68 65 63 6b 20 74 68 61 74 20 77 65 27 72 65 20 69 6e 20 61 20 67 6f 6f 64 20 73 ┆st, check that we're in a good s┆ 0x04f200…09e600 74 61 74 65 20 2a 2f 0a 09 09 09 69 66 20 28 73 74 61 74 65 20 26 26 20 28 73 74 61 74 65 20 26 ┆tate */ if (state && (state &┆ 0x04f200…09e600 20 6f 70 74 70 74 2d 3e 6f 6c 64 73 74 61 74 65 20 3d 3d 20 30 29 29 0a 09 09 09 20 20 20 20 72 ┆ optpt->oldstate == 0)) r┆ 0x04f200…09e600 65 74 75 72 6e 28 46 41 49 4c 29 3b 0a 09 09 09 65 6c 73 65 20 69 66 20 28 6f 70 74 70 74 2d 3e ┆eturn(FAIL); else if (optpt->┆ 0x04f200…09e600 6e 65 77 73 74 61 74 65 29 0a 09 09 09 20 20 20 20 73 74 61 74 65 20 3d 20 6f 70 74 70 74 2d 3e ┆newstate) state = optpt->┆ 0x04f200…09e600 6e 65 77 73 74 61 74 65 3b 0a 0a 09 09 09 2f 2a 20 73 74 61 74 65 20 69 73 20 4f 2e 4b 2e 2c 20 ┆newstate; /* state is O.K., ┆ 0x04f200…09e600 66 69 6c 6c 20 69 6e 20 74 68 65 20 6f 70 74 69 6f 6e 73 20 2a 2f 0a 09 09 09 66 69 6c 63 68 61 ┆fill in the options */ filcha┆ 0x04f200…09e600 72 20 3d 20 6f 70 74 70 74 2d 3e 66 69 6c 63 68 61 72 3b 0a 09 09 09 69 66 20 28 6f 70 74 70 74 ┆r = optpt->filchar; if (optpt┆ 0x04f200…09e600 2d 3e 66 6c 61 67 61 64 64 72 20 21 3d 20 4e 4f 4e 45 29 0a 09 09 09 20 20 20 20 6f 70 74 70 74 ┆->flagaddr != NONE) optpt┆ 0x04f200…09e600 2d 3e 66 6c 61 67 61 64 64 72 5b 30 5d 20 3d 20 74 75 72 6e 6f 6e 3b 0a 09 09 09 70 74 72 20 3d ┆->flagaddr[0] = turnon; ptr =┆ 0x04f200…09e600 20 62 75 66 20 3d 20 6f 70 74 70 74 2d 3e 62 75 66 3b 0a 09 09 09 6c 65 6e 20 3d 20 42 55 46 53 ┆ buf = optpt->buf; len = BUFS┆ 0x04f200…09e600 49 5a 3b 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 20 20 20 20 7d 0a 09 09 7d 0a 0a 09 09 69 66 20 ┆IZ; break; } } if ┆ 0x04f200…09e600 28 6f 70 74 70 74 2d 3e 6f 70 74 6c 65 74 20 3d 3d 20 27 5c 30 27 29 0a 09 09 20 20 20 20 72 65 ┆(optpt->optlet == '\0') re┆ 0x04f200…09e600 74 75 72 6e 28 46 41 49 4c 29 3b 09 09 2f 2a 20 75 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e 20 6c ┆turn(FAIL); /* unknown option l┆ 0x04f200…09e600 65 74 74 65 72 20 2a 2f 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 65 6c 73 65 20 69 66 20 28 6f 70 74 ┆etter */ } } else if (opt┆ 0x04f200…09e600 70 74 2d 3e 61 72 67 74 79 70 65 20 3d 3d 20 4f 50 54 49 4f 4e 29 09 2f 2a 20 6c 61 73 74 20 6f ┆pt->argtype == OPTION) /* last o┆ 0x04f200…09e600 70 74 69 6f 6e 20 74 6f 6f 6b 20 6e 6f 20 61 72 67 73 20 2a 2f 0a 09 20 20 20 20 72 65 74 75 72 ┆ption took no args */ retur┆ 0x04f200…09e600 6e 28 46 41 49 4c 29 3b 09 09 09 20 20 20 20 2f 2a 20 74 68 69 73 20 6d 75 73 74 20 62 65 20 77 ┆n(FAIL); /* this must be w┆ 0x04f200…09e600 72 6f 6e 67 20 2a 2f 0a 09 65 6c 73 65 20 69 66 20 28 6f 70 74 70 74 2d 3e 61 72 67 74 79 70 65 ┆rong */ else if (optpt->argtype┆ 0x04f200…09e600 20 3d 3d 20 4e 55 4d 42 45 52 29 0a 09 7b 0a 09 20 20 20 20 69 66 20 28 6f 70 74 70 74 2d 3e 66 ┆ == NUMBER) { if (optpt->f┆ 0x04f200…09e600 6c 61 67 61 64 64 72 20 21 3d 20 4e 4f 4e 45 29 0a 09 09 69 66 20 28 2a 2a 61 72 67 76 29 0a 09 ┆lagaddr != NONE) if (**argv) ┆ 0x04f200…09e600 09 20 20 20 20 6f 70 74 70 74 2d 3e 66 6c 61 67 61 64 64 72 5b 30 5d 20 3d 20 61 74 6f 69 28 2a ┆ optpt->flagaddr[0] = atoi(*┆ 0x04f200…09e600 61 72 67 76 29 3b 0a 09 09 65 6c 73 65 0a 09 09 20 20 20 20 6f 70 74 70 74 2d 3e 66 6c 61 67 61 ┆argv); else optpt->flaga┆ 0x04f200…09e600 64 64 72 5b 30 5d 20 3d 20 31 3b 09 2f 2a 20 64 65 66 61 75 6c 74 20 4e 55 4d 42 45 52 73 20 74 ┆ddr[0] = 1; /* default NUMBERs t┆ 0x04f200…09e600 6f 20 31 20 2a 2f 0a 09 7d 0a 09 65 6c 73 65 09 2f 2a 20 28 6f 70 74 70 74 2d 3e 61 72 67 74 79 ┆o 1 */ } else /* (optpt->argty┆ 0x04f200…09e600 70 65 20 3d 3d 20 53 54 52 49 4e 47 29 20 2a 2f 0a 09 7b 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20 ┆pe == STRING) */ { /* ┆ 0x04f200…09e600 20 20 2a 20 50 69 63 6b 20 75 70 20 61 20 70 69 65 63 65 20 6f 66 20 61 20 73 74 72 69 6e 67 20 ┆ * Pick up a piece of a string ┆ 0x04f200…09e600 61 6e 64 20 70 75 74 20 69 74 20 69 6e 74 6f 0a 09 20 20 20 20 20 2a 20 74 68 65 20 61 70 70 72 ┆and put it into * the appr┆ 0x04f200…09e600 6f 70 72 69 61 74 65 20 62 75 66 66 65 72 2e 0a 09 20 20 20 20 20 2a 2f 0a 09 20 20 20 20 69 66 ┆opriate buffer. */ if┆ 0x04f200…09e600 20 28 73 74 72 6c 65 6e 28 2a 61 72 67 76 29 20 2b 20 31 20 3e 3d 20 6c 65 6e 29 0a 09 09 78 65 ┆ (strlen(*argv) + 1 >= len) xe┆ 0x04f200…09e600 72 72 6f 72 28 22 41 72 67 75 6d 65 6e 74 20 73 74 72 69 6e 67 20 74 6f 6f 20 6c 6f 6e 67 22 29 ┆rror("Argument string too long")┆ 0x04f200…09e600 3b 0a 09 20 20 20 20 69 66 20 28 70 74 72 20 3e 20 62 75 66 20 26 26 20 2a 28 70 74 72 2d 31 29 ┆; if (ptr > buf && *(ptr-1)┆ 0x04f200…09e600 20 21 3d 20 66 69 6c 63 68 61 72 29 0a 09 09 2a 70 74 72 2b 2b 20 3d 20 66 69 6c 63 68 61 72 3b ┆ != filchar) *ptr++ = filchar;┆ 0x04f200…09e600 0a 09 20 20 20 20 28 76 6f 69 64 29 20 73 74 72 63 70 79 28 70 74 72 2c 20 2a 61 72 67 76 29 3b ┆ (void) strcpy(ptr, *argv);┆ 0x04f200…09e600 0a 09 20 20 20 20 74 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 70 74 72 29 3b 0a 09 20 20 20 20 70 ┆ tlen = strlen(ptr); p┆ 0x04f200…09e600 74 72 20 2b 3d 20 74 6c 65 6e 3b 20 6c 65 6e 20 2d 3d 20 74 6c 65 6e 3b 0a 09 20 20 20 20 2a 70 ┆tr += tlen; len -= tlen; *p┆ 0x04f200…09e600 74 72 20 3d 20 27 5c 30 27 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 65 74 75 72 6e 28 ┆tr = '\0'; } } return(┆ 0x04f200…09e600 73 74 61 74 65 29 3b 0a 7d 0a 0a 69 6e 74 20 76 63 72 61 63 6b 28 6c 69 6e 65 2c 20 6c 61 72 67 ┆state); } int vcrack(line, larg┆ 0x04f200…09e600 76 2c 20 6d 61 78 61 72 67 29 0a 2f 2a 20 63 72 61 63 6b 20 61 20 6c 69 6e 65 20 6f 66 20 74 65 ┆v, maxarg) /* crack a line of te┆ 0x04f200…09e600 78 74 20 69 6e 74 6f 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 76 65 63 74 6f 72 20 2a 2f 0a 63 68 ┆xt into an argument vector */ ch┆ 0x04f200…09e600 61 72 09 2a 6c 69 6e 65 3b 0a 63 68 61 72 20 20 20 20 2a 6c 61 72 67 76 5b 5d 3b 0a 69 6e 74 09 ┆ar *line; char *largv[]; int ┆ 0x04f200…09e600 6d 61 78 61 72 67 3b 0a 7b 0a 20 20 20 20 69 6e 74 09 20 20 20 20 6c 61 72 67 63 20 3d 20 30 3b ┆maxarg; { int largc = 0;┆ 0x04f200…09e600 0a 20 20 20 20 63 68 61 72 20 20 20 20 2a 63 70 3b 0a 0a 20 20 20 20 2f 2a 20 63 72 61 63 6b 20 ┆ char *cp; /* crack ┆ 0x04f200…09e600 74 68 65 20 61 72 67 75 6d 65 6e 74 20 6c 69 73 74 20 69 6e 74 6f 20 61 20 64 6f 70 65 20 76 65 ┆the argument list into a dope ve┆ 0x04f200…09e600 63 74 6f 72 20 2a 2f 0a 20 20 20 20 66 6f 72 20 28 63 70 20 3d 20 6c 69 6e 65 3b 20 2a 63 70 3b ┆ctor */ for (cp = line; *cp;┆ 0x04f200…09e600 20 63 70 2b 2b 29 0a 20 20 20 20 7b 0a 09 69 66 20 28 69 73 73 70 61 63 65 28 2a 63 70 29 29 0a ┆ cp++) { if (isspace(*cp)) ┆ 0x04f200…09e600 09 20 20 20 20 2a 63 70 20 3d 20 27 5c 30 27 3b 0a 09 65 6c 73 65 20 69 66 20 28 63 70 20 3d 3d ┆ *cp = '\0'; else if (cp ==┆ 0x04f200…09e600 20 6c 69 6e 65 20 7c 7c 20 63 70 5b 2d 31 5d 20 3d 3d 20 30 29 0a 09 7b 0a 09 20 20 20 20 69 66 ┆ line || cp[-1] == 0) { if┆ 0x04f200…09e600 20 28 6c 61 72 67 63 20 3e 3d 20 6d 61 78 61 72 67 20 2d 20 31 29 0a 09 09 72 65 74 75 72 6e 28 ┆ (largc >= maxarg - 1) return(┆ 0x04f200…09e600 46 41 49 4c 29 3b 0a 0a 09 20 20 20 20 6c 61 72 67 76 5b 6c 61 72 67 63 2b 2b 5d 20 3d 20 63 70 ┆FAIL); largv[largc++] = cp┆ 0x04f200…09e600 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6c 61 72 67 76 5b 6c 61 72 67 63 5d 20 3d 20 28 ┆; } } largv[largc] = (┆ 0x04f200…09e600 63 68 61 72 20 2a 29 20 4e 55 4c 4c 3b 0a 20 20 20 20 72 65 74 75 72 6e 28 6c 61 72 67 63 29 3b ┆char *) NULL; return(largc);┆ 0x04f200…09e600 0a 7d 0a 0a 2f 2a 20 70 72 6f 63 6f 70 74 73 2e 63 20 65 6e 64 73 20 68 65 72 65 20 2a 2f 0a 28 ┆ } /* procopts.c ends here */ (┆ 0x04f200…09e600 73 74 61 74 65 29 3b 0a 7d 0a 0a 69 6e 74 20 76 63 72 61 63 6b 28 6c 69 6e 65 2c 20 6c 61 72 67 ┆state); } int vcrack(line, larg┆ 0x04f200…09e600 76 2c 20 6d 61 78 61 72 67 29 0a 2f 2a 20 63 72 61 63 6b 20 61 20 6c 69 6e 65 20 6f 66 20 74 65 ┆v, maxarg) /* crack a line of te┆ 0x04f200…09e600 78 74 20 69 6e 74 6f 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 76 65 63 74 6f 72 20 2a 2f 0a 63 68 ┆xt into an argument vector */ ch┆ 0x04f200…09e600 61 72 09 2a 6c 69 6e 65 3b 0a 63 68 61 72 20 20 20 20 2a 6c 61 72 67 76 5b 5d 3b 0a 69 6e 74 09 ┆ar *line; char *largv[]; int ┆ 0x04f200…09e600 6d 61 78 61 72 67 3b 0a 7b 0a 20 20 20 20 69 6e 74 09 20 20 20 20 6c 61 72 67 63 20 3d 20 30 3b ┆maxarg; { int largc = 0;┆ 0x04f200…09e600 0a 20 20 20 20 63 68 61 72 20 20 20 20 2a 63 70 3b 0a 0a 20 20 20 20 2f 2a 20 63 72 61 63 6b 20 ┆ char *cp; /* crack ┆ 0x04f200…09e600 74 68 65 20 61 72 67 75 6d 65 6e 74 20 6c 69 73 74 20 69 6e 74 6f 20 61 20 64 6f 70 65 20 76 65 ┆the argument list into a dope ve┆ 0x04f200…09e600 63 74 6f 72 20 2a 2f 0a 20 20 20 20 66 6f 72 20 28 63 70 20 3d 20 6c 69 6e 65 3b 20 2a 63 70 3b ┆ctor */ for (cp = line; *cp;┆ 0x04f200…09e600 20 63 70 2b 2b 29 0a 20 20 20 20 7b 0a 09 69 66 20 28 69 73 73 70 61 63 65 28 2a 63 70 29 29 0a ┆ cp++) { if (isspace(*cp)) ┆ 0x04f200…09e600 09 20 20 20 20 2a 63 70 20 3d 20 27 5c 30 27 3b 0a 73 72 63 2f 44 2e 70 6f 72 74 2f 70 72 6f 63 ┆ *cp = '\0'; src/D.port/proc┆ 0x04f200…09e600 6f 70 74 73 2e 68 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆opts.h ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆ ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 20 20 20 34 34 34 20 00 20 20 20 ┆ 444 ┆ 0x04f200…09e600 31 34 35 20 00 20 20 20 20 20 31 20 00 20 20 20 20 20 20 20 31 34 37 32 20 20 34 34 35 36 31 35 ┆145 1 1472 445615┆ 0x04f200…09e600 34 30 35 37 20 20 31 30 30 35 33 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆4057 10053 ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆ ┆ […0x9…] 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 2f 2a 20 70 72 6f 63 6f 70 74 73 2e 68 20 2d ┆ /* procopts.h -┆ 0x04f200…09e600 2d 20 73 74 75 66 66 20 75 73 65 64 20 74 6f 20 65 6e 63 6f 64 65 20 69 6e 66 6f 72 6d 61 74 69 ┆- stuff used to encode informati┆ 0x04f200…09e600 6f 6e 20 6f 6e 20 70 72 6f 67 72 61 6d 20 6f 70 74 69 6f 6e 73 20 2a 2f 0a 0a 23 64 65 66 69 6e ┆on on program options */ #defin┆ 0x04f200…09e600 65 20 4f 50 54 49 4f 4e 09 30 09 2f 2a 20 70 69 63 6b 20 75 70 20 61 6e 20 6f 70 74 69 6f 6e 20 ┆e OPTION 0 /* pick up an option ┆ 0x04f200…09e600 73 74 72 69 6e 67 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53 54 52 49 4e 47 09 31 09 2f 2a 20 70 69 ┆string */ #define STRING 1 /* pi┆ 0x04f200…09e600 63 6b 20 75 70 20 61 20 73 74 72 69 6e 67 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 23 ┆ck up a string of arguments */ #┆ 0x04f200…09e600 64 65 66 69 6e 65 20 4e 55 4d 42 45 52 09 32 09 2f 2a 20 70 69 63 6b 20 75 70 20 61 6e 20 69 6e ┆define NUMBER 2 /* pick up an in┆ 0x04f200…09e600 74 65 67 65 72 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 41 58 41 52 47 ┆teger argument */ #define MAXARG┆ 0x04f200…09e600 53 09 33 32 09 2f 2a 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 73 20 77 ┆S 32 /* maximum number of args w┆ 0x04f200…09e600 65 20 63 61 6e 20 63 72 61 63 6b 20 6f 75 74 20 2a 2f 0a 0a 23 64 65 66 69 6e 65 20 4e 4f 4e 45 ┆e can crack out */ #define NONE┆ 0x04f200…09e600 09 28 69 6e 74 20 2a 29 30 20 20 20 20 2f 2a 20 75 73 65 64 20 74 6f 20 66 6c 61 67 20 6f 70 74 ┆ (int *)0 /* used to flag opt┆ 0x04f200…09e600 69 6f 6e 73 20 77 69 74 68 20 6e 6f 20 76 61 6c 75 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 44 4e ┆ions with no value */ #define DN┆ 0x04f200…09e600 43 09 20 20 20 20 30 78 30 30 20 20 20 20 2f 2a 20 73 74 61 74 65 20 6e 6f 74 20 73 65 74 2c 20 ┆C 0x00 /* state not set, ┆ 0x04f200…09e600 77 65 20 64 6f 6e 27 74 20 63 61 72 65 20 2a 2f 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 ┆we don't care */ typedef struct┆ 0x04f200…09e600 0a 7b 0a 20 20 20 20 63 68 61 72 09 6f 70 74 6c 65 74 3b 09 09 2f 2a 20 6f 70 74 69 6f 6e 20 63 ┆ { char optlet; /* option c┆ 0x04f200…09e600 68 61 72 61 63 74 65 72 2e 20 2a 2f 0a 20 20 20 20 63 68 61 72 09 66 69 6c 63 68 61 72 3b 09 2f ┆haracter. */ char filchar; /┆ 0x04f200…09e600 2a 20 69 66 20 74 6f 20 70 69 63 6b 75 70 20 73 74 72 69 6e 67 2c 20 66 69 6c 6c 20 63 68 61 72 ┆* if to pickup string, fill char┆ 0x04f200…09e600 61 63 74 65 72 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 09 09 2a 66 6c 61 67 61 64 64 72 3b 09 2f 2a ┆acter. */ int *flagaddr; /*┆ 0x04f200…09e600 20 67 65 74 73 20 73 65 74 20 74 6f 20 6f 70 74 69 6f 6e 20 76 61 6c 75 65 20 2a 2f 0a 20 20 20 ┆ gets set to option value */ ┆ 0x04f200…09e600 20 69 6e 74 09 09 6f 6c 64 73 74 61 74 65 3b 09 2f 2a 20 73 74 61 74 65 73 20 77 65 20 63 61 6e ┆ int oldstate; /* states we can┆ 0x04f200…09e600 20 65 6e 74 65 72 20 66 72 6f 6d 20 2a 2f 0a 20 20 20 20 69 6e 74 09 09 6e 65 77 73 74 61 74 65 ┆ enter from */ int newstate┆ 0x04f200…09e600 3b 09 2f 2a 20 73 74 61 74 65 20 77 65 20 6c 65 61 76 65 20 74 68 65 20 70 72 6f 67 72 61 6d 20 ┆; /* state we leave the program ┆ 0x04f200…09e600 69 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 09 09 61 72 67 74 79 70 65 3b 09 2f 2a 20 53 54 52 49 4e ┆in */ int argtype; /* STRIN┆ 0x04f200…09e600 47 20 69 66 20 74 61 6b 65 73 20 61 72 67 2c 20 65 6c 73 65 20 4f 50 54 49 4f 4e 20 2a 2f 0a 20 ┆G if takes arg, else OPTION */ ┆ 0x04f200…09e600 20 20 20 63 68 61 72 09 2a 62 75 66 3b 09 09 2f 2a 20 73 74 72 69 6e 67 20 62 75 66 66 65 72 20 ┆ char *buf; /* string buffer ┆ 0x04f200…09e600 2a 2f 0a 7d 0a 6f 70 74 69 6f 6e 5f 74 3b 0a 0a 2f 2a 20 70 72 6f 63 6f 70 74 73 2e 68 20 65 6e ┆*/ } option_t; /* procopts.h en┆ 0x04f200…09e600 64 73 20 68 65 72 65 20 2a 2f 0a 20 20 2f 2a 20 75 73 65 64 20 74 6f 20 66 6c 61 67 20 6f 70 74 ┆ds here */ /* used to flag opt┆ 0x04f200…09e600 69 6f 6e 73 20 77 69 74 68 20 6e 6f 20 76 61 6c 75 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 44 4e ┆ions with no value */ #define DN┆ 0x04f200…09e600 43 09 20 20 20 20 30 78 30 30 20 20 20 20 2f 2a 20 73 74 61 74 65 20 6e 6f 74 20 73 65 74 2c 20 ┆C 0x00 /* state not set, ┆ 0x04f200…09e600 77 65 20 64 6f 6e 27 74 20 63 61 72 65 20 2a 2f 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 ┆we don't care */ typedef struct┆ 0x04f200…09e600 0a 7b 0a 20 20 20 20 63 68 61 72 09 6f 70 74 6c 65 74 3b 09 09 2f 2a 20 6f 70 74 69 6f 6e 20 63 ┆ { char optlet; /* option c┆ 0x04f200…09e600 68 61 72 61 63 74 65 72 2e 20 2a 2f 0a 20 20 20 20 63 68 61 72 09 66 69 6c 63 68 61 72 3b 09 2f ┆haracter. */ char filchar; /┆ 0x04f200…09e600 2a 20 69 66 20 74 6f 20 70 69 63 6b 75 70 20 73 74 73 72 63 2f 44 2e 70 6f 72 74 2f 72 65 67 65 ┆* if to pickup stsrc/D.port/rege┆ 0x04f200…09e600 78 70 2e 63 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆xp.c ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆ ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 20 20 20 34 34 34 20 00 20 20 20 ┆ 444 ┆ 0x04f200…09e600 31 34 35 20 00 20 20 20 20 20 31 20 00 20 20 20 20 20 20 35 34 34 33 36 20 20 34 34 35 36 31 35 ┆145 1 54436 445615┆ 0x04f200…09e600 34 30 36 30 20 20 20 37 35 31 31 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆4060 7511 ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆ ┆ […0x9…] 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆ /**************┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆********************************┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 0a ┆****************************** ┆ 0x04f200…09e600 4e 41 4d 45 0a 20 20 20 72 65 67 63 6f 6d 70 20 61 6e 64 20 72 65 67 65 78 65 63 20 2d 2d 20 63 ┆NAME regcomp and regexec -- c┆ 0x04f200…09e600 6f 6d 70 69 6c 65 20 61 6e 64 20 74 65 73 74 20 66 6f 72 20 72 65 67 75 6c 61 72 20 65 78 70 72 ┆ompile and test for regular expr┆ 0x04f200…09e600 65 73 73 69 6f 6e 20 6d 61 74 63 68 65 73 0a 0a 53 59 4e 4f 50 53 49 53 0a 20 20 20 23 69 6e 63 ┆ession matches SYNOPSIS #inc┆ 0x04f200…09e600 6c 75 64 65 20 22 72 65 67 65 78 70 2e 68 22 0a 0a 20 20 20 72 65 67 65 78 70 20 2a 72 65 67 63 ┆lude "regexp.h" regexp *regc┆ 0x04f200…09e600 6f 6d 70 28 65 78 70 29 09 09 2d 2d 20 63 6f 6d 70 69 6c 65 20 61 20 72 65 67 75 6c 61 72 20 65 ┆omp(exp) -- compile a regular e┆ 0x04f200…09e600 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 63 68 61 72 20 2a 65 78 70 3b 0a 0a 20 20 20 69 6e 74 20 ┆xpression char *exp; int ┆ 0x04f200…09e600 72 65 67 65 78 65 63 28 70 72 6f 67 2c 20 73 74 72 69 6e 67 29 09 2d 2d 20 6d 61 74 63 68 20 61 ┆regexec(prog, string) -- match a┆ 0x04f200…09e600 20 72 65 67 75 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e 20 61 67 61 69 6e 73 74 20 61 20 73 74 ┆ regular expression against a st┆ 0x04f200…09e600 72 69 6e 67 0a 20 20 20 72 65 67 65 78 70 20 2a 70 72 6f 67 3b 20 63 68 61 72 20 2a 73 74 72 69 ┆ring regexp *prog; char *stri┆ 0x04f200…09e600 6e 67 3b 0a 0a 44 45 53 43 52 49 50 54 49 4f 4e 0a 20 20 20 54 68 65 73 65 20 72 6f 75 74 69 6e ┆ng; DESCRIPTION These routin┆ 0x04f200…09e600 65 73 20 70 72 6f 76 69 64 65 20 56 38 2d 63 6f 6d 70 61 74 69 62 6c 65 20 65 78 70 72 65 73 73 ┆es provide V8-compatible express┆ 0x04f200…09e600 69 6f 6e 20 6d 61 74 63 68 69 6e 67 20 66 6f 72 20 74 68 65 0a 6e 65 77 73 20 63 6f 64 65 2e 20 ┆ion matching for the news code. ┆ 0x04f200…09e600 0a 0a 52 45 56 49 53 45 44 20 42 59 0a 20 20 20 45 72 69 63 20 53 2e 20 52 61 79 6d 6f 6e 64 0a ┆ REVISED BY Eric S. Raymond ┆ 0x04f200…09e600 54 68 65 73 65 20 61 72 65 20 61 20 74 72 75 6e 63 61 74 65 64 20 61 6e 64 20 73 6c 69 67 68 74 ┆These are a truncated and slight┆ 0x04f200…09e600 6c 79 20 6d 75 6e 67 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 48 65 6e 72 79 20 53 70 65 6e 63 ┆ly munged version of Henry Spenc┆ 0x04f200…09e600 65 72 27 73 20 72 65 67 65 78 70 28 33 29 0a 70 61 63 6b 61 67 65 3b 20 63 72 65 64 69 74 20 68 ┆er's regexp(3) package; credit h┆ 0x04f200…09e600 69 6d 20 69 66 20 74 68 65 79 20 77 6f 72 6b 20 4f 4b 2c 20 72 65 73 65 72 76 65 20 66 6c 61 6d ┆im if they work OK, reserve flam┆ 0x04f200…09e600 65 73 20 66 6f 72 20 6d 65 20 69 66 20 74 68 65 79 20 64 6f 6e 27 74 2e 0a 20 20 20 54 68 69 73 ┆es for me if they don't. This┆ 0x04f200…09e600 20 73 6f 66 74 77 61 72 65 20 69 73 20 43 6f 70 79 72 69 67 68 74 20 28 43 29 20 31 39 38 39 20 ┆ software is Copyright (C) 1989 ┆ 0x04f200…09e600 62 79 20 45 72 69 63 20 53 2e 20 52 61 79 6d 6f 6e 64 20 66 6f 72 20 74 68 65 20 73 6f 6c 65 20 ┆by Eric S. Raymond for the sole ┆ 0x04f200…09e600 70 75 72 70 6f 73 65 0a 6f 66 20 70 72 6f 74 65 63 74 69 6e 67 20 66 72 65 65 20 72 65 64 69 73 ┆purpose of protecting free redis┆ 0x04f200…09e600 74 72 69 62 75 74 69 6f 6e 3b 20 73 65 65 20 74 68 65 20 4c 49 43 45 4e 53 45 20 66 69 6c 65 20 ┆tribution; see the LICENSE file ┆ 0x04f200…09e600 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆for details. ******************┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆********************************┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 4c 49 ┆**************************/ /*LI┆ 0x04f200…09e600 4e 54 4c 49 42 52 41 52 59 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 6c 69 62 70 6f 72 74 2e 68 22 ┆NTLIBRARY*/ #include "libport.h"┆ 0x04f200…09e600 0a 23 69 6e 63 6c 75 64 65 20 22 72 65 67 65 78 70 2e 68 22 0a 0a 23 64 65 66 69 6e 65 09 4d 41 ┆ #include "regexp.h" #define MA┆ 0x04f200…09e600 47 49 43 09 30 32 33 34 09 2f 2a 20 69 6e 69 74 69 61 6c 20 6d 61 67 69 63 20 6e 75 6d 62 65 72 ┆GIC 0234 /* initial magic number┆ 0x04f200…09e600 20 66 6f 72 20 63 6f 6d 70 69 6c 65 64 20 65 78 70 72 65 73 73 69 6f 6e 73 20 2a 2f 0a 0a 2f 2a ┆ for compiled expressions */ /*┆ 0x04f200…09e600 20 64 65 66 69 6e 69 74 69 6f 6e 09 6e 75 6d 62 65 72 09 6f 70 6e 64 3f 09 6d 65 61 6e 69 6e 67 ┆ definition number opnd? meaning┆ 0x04f200…09e600 20 2a 2f 0a 23 64 65 66 69 6e 65 09 45 4e 44 09 30 09 2f 2a 20 6e 6f 09 45 6e 64 20 6f 66 20 70 ┆ */ #define END 0 /* no End of p┆ 0x04f200…09e600 72 6f 67 72 61 6d 2e 20 2a 2f 0a 23 64 65 66 69 6e 65 09 42 4f 4c 09 31 09 2f 2a 20 6e 6f 09 4d ┆rogram. */ #define BOL 1 /* no M┆ 0x04f200…09e600 61 74 63 68 20 22 22 20 61 74 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 6c 69 6e 65 2e 20 2a 2f ┆atch "" at beginning of line. */┆ 0x04f200…09e600 0a 23 64 65 66 69 6e 65 09 45 4f 4c 09 32 09 2f 2a 20 6e 6f 09 4d 61 74 63 68 20 22 22 20 61 74 ┆ #define EOL 2 /* no Match "" at┆ 0x04f200…09e600 20 65 6e 64 20 6f 66 20 6c 69 6e 65 2e 20 2a 2f 0a 23 64 65 66 69 6e 65 09 41 4e 59 09 33 09 2f ┆ end of line. */ #define ANY 3 /┆ 0x04f200…09e600 2a 20 6e 6f 09 4d 61 74 63 68 20 61 6e 79 20 6f 6e 65 20 63 68 61 72 61 63 74 65 72 2e 20 2a 2f ┆* no Match any one character. */┆ 0x04f200…09e600 0a 23 64 65 66 69 6e 65 09 41 4e 59 4f 46 09 34 09 2f 2a 20 73 74 72 09 4d 61 74 63 68 20 61 6e ┆ #define ANYOF 4 /* str Match an┆ 0x04f200…09e600 79 20 63 68 61 72 61 63 74 65 72 20 69 6e 20 74 68 69 73 20 73 74 72 69 6e 67 2e 20 2a 2f 0a 23 ┆y character in this string. */ #┆ 0x04f200…09e600 64 65 66 69 6e 65 09 41 4e 59 42 55 54 09 35 09 2f 2a 20 73 74 72 09 4d 61 74 63 68 20 61 6e 79 ┆define ANYBUT 5 /* str Match any┆ 0x04f200…09e600 20 63 68 61 72 61 63 74 65 72 20 6e 6f 74 20 69 6e 20 74 68 69 73 20 73 74 72 69 6e 67 2e 20 2a ┆ character not in this string. *┆ 0x04f200…09e600 2f 0a 23 64 65 66 69 6e 65 09 42 52 41 4e 43 48 09 36 09 2f 2a 20 6e 6f 64 65 09 4d 61 74 63 68 ┆/ #define BRANCH 6 /* node Match┆ 0x04f200…09e600 20 74 68 69 73 20 61 6c 74 65 72 6e 61 74 69 76 65 2c 20 6f 72 20 74 68 65 20 6e 65 78 74 2e 2e ┆ this alternative, or the next..┆ 0x04f200…09e600 2e 20 2a 2f 0a 23 64 65 66 69 6e 65 09 42 41 43 4b 09 37 09 2f 2a 20 6e 6f 09 4d 61 74 63 68 20 ┆. */ #define BACK 7 /* no Match ┆ 0x04f200…09e600 22 22 2c 20 22 6e 65 78 74 22 20 70 74 72 20 70 6f 69 6e 74 73 20 62 61 63 6b 77 61 72 64 2e 20 ┆"", "next" ptr points backward. ┆ 0x04f200…09e600 2a 2f 0a 23 64 65 66 69 6e 65 09 45 58 41 43 54 4c 59 09 38 09 2f 2a 20 73 74 72 09 4d 61 74 63 ┆*/ #define EXACTLY 8 /* str Matc┆ 0x04f200…09e600 68 20 74 68 69 73 20 73 74 72 69 6e 67 2e 20 2a 2f 0a 23 64 65 66 69 6e 65 09 4e 4f 54 48 49 4e ┆h this string. */ #define NOTHIN┆ 0x04f200…09e600 47 09 39 09 2f 2a 20 6e 6f 09 4d 61 74 63 68 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2e 20 2a 2f ┆G 9 /* no Match empty string. */┆ 0x04f200…09e600 0a 23 64 65 66 69 6e 65 09 53 54 41 52 09 31 30 09 2f 2a 20 6e 6f 64 65 09 4d 61 74 63 68 20 74 ┆ #define STAR 10 /* node Match t┆ 0x04f200…09e600 68 69 73 20 28 73 69 6d 70 6c 65 29 20 74 68 69 6e 67 20 30 20 6f 72 20 6d 6f 72 65 20 74 69 6d ┆his (simple) thing 0 or more tim┆ 0x04f200…09e600 65 73 2e 20 2a 2f 0a 23 64 65 66 69 6e 65 09 50 4c 55 53 09 31 31 09 2f 2a 20 6e 6f 64 65 09 4d ┆es. */ #define PLUS 11 /* node M┆ 0x04f200…09e600 61 74 63 68 20 74 68 69 73 20 28 73 69 6d 70 6c 65 29 20 74 68 69 6e 67 20 31 20 6f 72 20 6d 6f ┆atch this (simple) thing 1 or mo┆ 0x04f200…09e600 72 65 20 74 69 6d 65 73 2e 20 2a 2f 0a 23 64 65 66 69 6e 65 09 4f 50 45 4e 09 32 30 09 2f 2a 20 ┆re times. */ #define OPEN 20 /* ┆ 0x04f200…09e600 6e 6f 09 4d 61 72 6b 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e 20 69 6e 70 75 74 20 61 73 20 73 ┆no Mark this point in input as s┆ 0x04f200…09e600 74 61 72 74 20 6f 66 20 23 6e 2e 20 2a 2f 0a 09 09 09 2f 2a 09 4f 50 45 4e 2b 31 20 69 73 20 6e ┆tart of #n. */ /* OPEN+1 is n┆ 0x04f200…09e600 75 6d 62 65 72 20 31 2c 20 65 74 63 2e 20 2a 2f 0a 23 64 65 66 69 6e 65 09 43 4c 4f 53 45 09 33 ┆umber 1, etc. */ #define CLOSE 3┆ 0x04f200…09e600 30 09 2f 2a 20 6e 6f 09 41 6e 61 6c 6f 67 6f 75 73 20 74 6f 20 4f 50 45 4e 2e 20 2a 2f 0a 0a 2f ┆0 /* no Analogous to OPEN. */ /┆ 0x04f200…09e600 2a 0a 20 2a 20 41 20 6e 6f 64 65 20 69 73 20 6f 6e 65 20 63 68 61 72 20 6f 66 20 6f 70 63 6f 64 ┆* * A node is one char of opcod┆ 0x04f200…09e600 65 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 74 77 6f 20 63 68 61 72 73 20 6f 66 20 22 6e 65 78 74 ┆e followed by two chars of "next┆ 0x04f200…09e600 22 20 70 6f 69 6e 74 65 72 2e 0a 20 2a 20 22 4e 65 78 74 22 20 70 6f 69 6e 74 65 72 73 20 61 72 ┆" pointer. * "Next" pointers ar┆ 0x04f200…09e600 65 20 73 74 6f 72 65 64 20 61 73 20 74 77 6f 20 38 2d 62 69 74 20 70 69 65 63 65 73 2c 20 68 69 ┆e stored as two 8-bit pieces, hi┆ 0x04f200…09e600 67 68 20 6f 72 64 65 72 20 66 69 72 73 74 2e 20 20 54 68 65 0a 20 2a 20 76 61 6c 75 65 20 69 73 ┆gh order first. The * value is┆ 0x04f200…09e600 20 61 20 70 6f 73 69 74 69 76 65 20 6f 66 66 73 65 74 20 66 72 6f 6d 20 74 68 65 20 6f 70 63 6f ┆ a positive offset from the opco┆ 0x04f200…09e600 64 65 20 6f 66 20 74 68 65 20 6e 6f 64 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 69 74 2e 0a 20 2a ┆de of the node containing it. *┆ 0x04f200…09e600 20 41 6e 20 6f 70 65 72 61 6e 64 2c 20 69 66 20 61 6e 79 2c 20 73 69 6d 70 6c 79 20 66 6f 6c 6c ┆ An operand, if any, simply foll┆ 0x04f200…09e600 6f 77 73 20 74 68 65 20 6e 6f 64 65 2e 20 20 28 4e 6f 74 65 20 74 68 61 74 20 6d 75 63 68 20 6f ┆ows the node. (Note that much o┆ 0x04f200…09e600 66 20 74 68 65 0a 20 2a 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6f 6e 20 6b 6e 6f 77 73 20 61 ┆f the * code generation knows a┆ 0x04f200…09e600 62 6f 75 74 20 74 68 69 73 20 69 6d 70 6c 69 63 69 74 20 72 65 6c 61 74 69 6f 6e 73 68 69 70 2e ┆bout this implicit relationship.┆ 0x04f200…09e600 29 0a 20 2a 0a 20 2a 20 55 73 69 6e 67 20 74 77 6f 20 62 79 74 65 73 20 66 6f 72 20 74 68 65 20 ┆) * * Using two bytes for the ┆ 0x04f200…09e600 22 6e 65 78 74 22 20 70 6f 69 6e 74 65 72 20 69 73 20 76 61 73 74 20 6f 76 65 72 6b 69 6c 6c 20 ┆"next" pointer is vast overkill ┆ 0x04f200…09e600 66 6f 72 20 6d 6f 73 74 20 74 68 69 6e 67 73 2c 0a 20 2a 20 62 75 74 20 61 6c 6c 6f 77 73 20 70 ┆for most things, * but allows p┆ 0x04f200…09e600 61 74 74 65 72 6e 73 20 74 6f 20 67 65 74 20 62 69 67 20 77 69 74 68 6f 75 74 20 64 69 73 61 73 ┆atterns to get big without disas┆ 0x04f200…09e600 74 65 72 73 2e 0a 20 2a 2f 0a 23 64 65 66 69 6e 65 09 4f 50 28 70 29 09 28 2a 28 70 29 29 0a 23 ┆ters. */ #define OP(p) (*(p)) #┆ 0x04f200…09e600 64 65 66 69 6e 65 09 4e 45 58 54 28 70 29 09 28 28 28 2a 28 28 70 29 2b 31 29 26 30 33 37 37 29 ┆define NEXT(p) (((*((p)+1)&0377)┆ 0x04f200…09e600 3c 3c 38 29 20 2b 20 2a 28 28 70 29 2b 32 29 26 30 33 37 37 29 0a 23 64 65 66 69 6e 65 09 4f 50 ┆<<8) + *((p)+2)&0377) #define OP┆ 0x04f200…09e600 45 52 41 4e 44 28 70 29 09 28 28 70 29 20 2b 20 33 29 0a 0a 2f 2a 0a 20 2a 20 55 74 69 6c 69 74 ┆ERAND(p) ((p) + 3) /* * Utilit┆ 0x04f200…09e600 79 20 64 65 66 69 6e 69 74 69 6f 6e 73 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 43 48 41 52 42 ┆y definitions. */ #ifndef CHARB┆ 0x04f200…09e600 49 54 53 0a 23 64 65 66 69 6e 65 09 55 43 48 41 52 41 54 28 70 29 09 28 28 69 6e 74 29 2a 28 75 ┆ITS #define UCHARAT(p) ((int)*(u┆ 0x04f200…09e600 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 28 70 29 29 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e ┆nsigned char *)(p)) #else #defin┆ 0x04f200…09e600 65 09 55 43 48 41 52 41 54 28 70 29 09 28 28 69 6e 74 29 2a 28 70 29 26 43 48 41 52 42 49 54 53 ┆e UCHARAT(p) ((int)*(p)&CHARBITS┆ 0x04f200…09e600 29 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 09 41 42 4f 52 54 28 6d 29 09 7b 20 78 65 72 ┆) #endif #define ABORT(m) { xer┆ 0x04f200…09e600 72 6f 72 28 6d 29 3b 20 72 65 74 75 72 6e 28 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 20 7d 0a ┆ror(m); return((char *)NULL); } ┆ 0x04f200…09e600 23 64 65 66 69 6e 65 09 49 53 4d 55 4c 54 28 63 29 09 28 28 63 29 20 3d 3d 20 27 2a 27 20 7c 7c ┆#define ISMULT(c) ((c) == '*' ||┆ 0x04f200…09e600 20 28 63 29 20 3d 3d 20 27 2b 27 20 7c 7c 20 28 63 29 20 3d 3d 20 27 3f 27 29 0a 23 64 65 66 69 ┆ (c) == '+' || (c) == '?') #defi┆ 0x04f200…09e600 6e 65 09 4d 45 54 41 09 22 5e 24 2e 5b 28 29 7c 3f 2b 2a 5c 5c 22 0a 0a 2f 2a 0a 20 2a 20 46 6c ┆ne META "^$.[()|?+*\\" /* * Fl┆ 0x04f200…09e600 61 67 73 20 74 6f 20 62 65 20 70 61 73 73 65 64 20 75 70 20 61 6e 64 20 64 6f 77 6e 2e 0a 20 2a ┆ags to be passed up and down. *┆ 0x04f200…09e600 2f 0a 23 64 65 66 69 6e 65 09 48 41 53 57 49 44 54 48 09 30 31 09 2f 2a 20 4b 6e 6f 77 6e 20 6e ┆/ #define HASWIDTH 01 /* Known n┆ 0x04f200…09e600 65 76 65 72 20 74 6f 20 6d 61 74 63 68 20 6e 75 6c 6c 20 73 74 72 69 6e 67 2e 20 2a 2f 0a 23 64 ┆ever to match null string. */ #d┆ 0x04f200…09e600 65 66 69 6e 65 09 53 49 4d 50 4c 45 09 09 30 32 09 2f 2a 20 53 69 6d 70 6c 65 20 65 6e 6f 75 67 ┆efine SIMPLE 02 /* Simple enoug┆ 0x04f200…09e600 68 20 74 6f 20 62 65 20 53 54 41 52 2f 50 4c 55 53 20 6f 70 65 72 61 6e 64 2e 20 2a 2f 0a 23 64 ┆h to be STAR/PLUS operand. */ #d┆ 0x04f200…09e600 65 66 69 6e 65 09 53 50 53 54 41 52 54 09 09 30 34 09 2f 2a 20 53 74 61 72 74 73 20 77 69 74 68 ┆efine SPSTART 04 /* Starts with┆ 0x04f200…09e600 20 2a 20 6f 72 20 2b 2e 20 2a 2f 0a 23 64 65 66 69 6e 65 09 57 4f 52 53 54 09 09 30 09 2f 2a 20 ┆ * or +. */ #define WORST 0 /* ┆ 0x04f200…09e600 57 6f 72 73 74 20 63 61 73 65 2e 20 2a 2f 0a 0a 2f 2a 0a 20 2a 20 47 6c 6f 62 61 6c 20 77 6f 72 ┆Worst case. */ /* * Global wor┆ 0x04f200…09e600 6b 20 76 61 72 69 61 62 6c 65 73 20 66 6f 72 20 72 65 67 63 6f 6d 70 28 29 2e 0a 20 2a 2f 0a 73 ┆k variables for regcomp(). */ s┆ 0x04f200…09e600 74 61 74 69 63 20 63 68 61 72 20 2a 72 65 67 70 61 72 73 65 3b 09 09 2f 2a 20 49 6e 70 75 74 2d ┆tatic char *regparse; /* Input-┆ 0x04f200…09e600 73 63 61 6e 20 70 6f 69 6e 74 65 72 2e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 67 6e ┆scan pointer. */ static int regn┆ 0x04f200…09e600 70 61 72 3b 09 09 2f 2a 20 28 29 20 63 6f 75 6e 74 2e 20 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 ┆par; /* () count. */ static cha┆ 0x04f200…09e600 72 20 72 65 67 64 75 6d 6d 79 3b 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 72 65 67 63 6f 64 65 ┆r regdummy; static char *regcode┆ 0x04f200…09e600 3b 09 09 2f 2a 20 43 6f 64 65 2d 65 6d 69 74 20 70 6f 69 6e 74 65 72 3b 20 26 72 65 67 64 75 6d ┆; /* Code-emit pointer; ®dum┆ 0x04f200…09e600 6d 79 20 3d 20 64 6f 6e 27 74 2e 20 2a 2f 0a 73 74 61 74 69 63 20 6c 6f 6e 67 20 72 65 67 73 69 ┆my = don't. */ static long regsi┆ 0x04f200…09e600 7a 65 3b 09 09 2f 2a 20 43 6f 64 65 20 73 69 7a 65 2e 20 2a 2f 0a 0a 2f 2a 0a 20 2a 20 46 6f 72 ┆ze; /* Code size. */ /* * For┆ 0x04f200…09e600 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 66 6f 72 20 72 65 67 63 6f 6d 70 28 29 27 ┆ward declarations for regcomp()'┆ 0x04f200…09e600 73 20 66 72 69 65 6e 64 73 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 72 65 67 28 ┆s friends. */ static char *reg(┆ 0x04f200…09e600 29 3b 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 72 65 67 62 72 61 6e 63 68 28 29 3b 0a 73 74 61 ┆); static char *regbranch(); sta┆ 0x04f200…09e600 74 69 63 20 63 68 61 72 20 2a 72 65 67 70 69 65 63 65 28 29 3b 0a 73 74 61 74 69 63 20 63 68 61 ┆tic char *regpiece(); static cha┆ 0x04f200…09e600 72 20 2a 72 65 67 61 74 6f 6d 28 29 3b 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 72 65 67 6e 6f ┆r *regatom(); static char *regno┆ 0x04f200…09e600 64 65 28 29 3b 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 72 65 67 6e 65 78 74 28 29 3b 0a 73 74 ┆de(); static char *regnext(); st┆ 0x04f200…09e600 61 74 69 63 20 76 6f 69 64 20 72 65 67 63 28 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 ┆atic void regc(); static void re┆ 0x04f200…09e600 67 69 6e 73 65 72 74 28 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 67 74 61 69 6c 28 29 ┆ginsert(); static void regtail()┆ 0x04f200…09e600 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 67 6f 70 74 61 69 6c 28 29 3b 0a 23 69 66 6e 64 ┆; static void regoptail(); #ifnd┆ 0x04f200…09e600 65 66 20 55 53 47 0a 73 74 61 74 69 63 20 69 6e 74 20 73 74 72 63 73 70 6e 28 29 3b 0a 23 65 6e ┆ef USG static int strcspn(); #en┆ 0x04f200…09e600 64 69 66 0a 0a 2f 2a 0a 20 2d 20 72 65 67 63 6f 6d 70 20 2d 20 63 6f 6d 70 69 6c 65 20 61 20 72 ┆dif /* - regcomp - compile a r┆ 0x04f200…09e600 65 67 75 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 74 6f 20 69 6e 74 65 72 6e 61 6c 20 ┆egular expression into internal ┆ 0x04f200…09e600 63 6f 64 65 0a 20 2a 0a 20 2a 20 57 65 20 63 61 6e 27 74 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 ┆code * * We can't allocate spa┆ 0x04f200…09e600 63 65 20 75 6e 74 69 6c 20 77 65 20 6b 6e 6f 77 20 68 6f 77 20 62 69 67 20 74 68 65 20 63 6f 6d ┆ce until we know how big the com┆ 0x04f200…09e600 70 69 6c 65 64 20 66 6f 72 6d 20 77 69 6c 6c 20 62 65 2c 0a 20 2a 20 62 75 74 20 77 65 20 63 61 ┆piled form will be, * but we ca┆ 0x04f200…09e600 6e 27 74 20 63 6f 6d 70 69 6c 65 20 69 74 20 28 61 6e 64 20 74 68 75 73 20 6b 6e 6f 77 20 68 6f ┆n't compile it (and thus know ho┆ 0x04f200…09e600 77 20 62 69 67 20 69 74 20 69 73 29 20 75 6e 74 69 6c 20 77 65 27 76 65 20 67 6f 74 20 61 0a 20 ┆w big it is) until we've got a ┆ 0x04f200…09e600 2a 20 70 6c 61 63 65 20 74 6f 20 70 75 74 20 74 68 65 20 63 6f 64 65 2e 20 20 53 6f 20 77 65 20 ┆* place to put the code. So we ┆ 0x04f200…09e600 63 68 65 61 74 3a 20 20 77 65 20 63 6f 6d 70 69 6c 65 20 69 74 20 74 77 69 63 65 2c 20 6f 6e 63 ┆cheat: we compile it twice, onc┆ 0x04f200…09e600 65 20 77 69 74 68 20 63 6f 64 65 0a 20 2a 20 67 65 6e 65 72 61 74 69 6f 6e 20 74 75 72 6e 65 64 ┆e with code * generation turned┆ 0x04f200…09e600 20 6f 66 66 20 61 6e 64 20 73 69 7a 65 20 63 6f 75 6e 74 69 6e 67 20 74 75 72 6e 65 64 20 6f 6e ┆ off and size counting turned on┆ 0x04f200…09e600 2c 20 61 6e 64 20 6f 6e 63 65 20 22 66 6f 72 20 72 65 61 6c 22 2e 0a 20 2a 20 54 68 69 73 20 61 ┆, and once "for real". * This a┆ 0x04f200…09e600 6c 73 6f 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 64 6f 6e 27 74 20 61 6c 6c 6f 63 61 74 65 ┆lso means that we don't allocate┆ 0x04f200…09e600 20 73 70 61 63 65 20 75 6e 74 69 6c 20 77 65 20 61 72 65 20 73 75 72 65 20 74 68 61 74 20 74 68 ┆ space until we are sure that th┆ 0x04f200…09e600 65 0a 20 2a 20 74 68 69 6e 67 20 72 65 61 6c 6c 79 20 77 69 6c 6c 20 63 6f 6d 70 69 6c 65 20 73 ┆e * thing really will compile s┆ 0x04f200…09e600 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 61 6e 64 20 77 65 20 6e 65 76 65 72 20 68 61 76 65 20 74 ┆uccessfully, and we never have t┆ 0x04f200…09e600 6f 20 6d 6f 76 65 20 74 68 65 0a 20 2a 20 63 6f 64 65 20 61 6e 64 20 74 68 75 73 20 69 6e 76 61 ┆o move the * code and thus inva┆ 0x04f200…09e600 6c 69 64 61 74 65 20 70 6f 69 6e 74 65 72 73 20 69 6e 74 6f 20 69 74 2e 20 20 28 4e 6f 74 65 20 ┆lidate pointers into it. (Note ┆ 0x04f200…09e600 74 68 61 74 20 69 74 20 68 61 73 20 74 6f 20 62 65 20 69 6e 0a 20 2a 20 6f 6e 65 20 70 69 65 63 ┆that it has to be in * one piec┆ 0x04f200…09e600 65 20 62 65 63 61 75 73 65 20 66 72 65 65 28 29 20 6d 75 73 74 20 62 65 20 61 62 6c 65 20 74 6f ┆e because free() must be able to┆ 0x04f200…09e600 20 66 72 65 65 20 69 74 20 61 6c 6c 2e 29 0a 20 2a 0a 20 2a 20 42 65 77 61 72 65 20 74 68 61 74 ┆ free it all.) * * Beware that┆ 0x04f200…09e600 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2d 70 72 65 70 61 72 61 74 69 6f 6e 20 63 6f ┆ the optimization-preparation co┆ 0x04f200…09e600 64 65 20 69 6e 20 68 65 72 65 20 6b 6e 6f 77 73 20 61 62 6f 75 74 20 73 6f 6d 65 0a 20 2a 20 6f ┆de in here knows about some * o┆ 0x04f200…09e600 66 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20 6f 66 20 74 68 65 20 63 6f 6d 70 69 6c 65 64 20 ┆f the structure of the compiled ┆ 0x04f200…09e600 72 65 67 65 78 70 2e 0a 20 2a 2f 0a 72 65 67 65 78 70 20 2a 0a 72 65 67 63 6f 6d 70 28 65 78 70 ┆regexp. */ regexp * regcomp(exp┆ 0x04f200…09e600 29 0a 63 68 61 72 20 2a 65 78 70 3b 0a 7b 0a 20 20 20 20 72 65 67 69 73 74 65 72 20 72 65 67 65 ┆) char *exp; { register rege┆ 0x04f200…09e600 78 70 20 2a 72 3b 0a 20 20 20 20 72 65 67 69 73 74 65 72 20 63 68 61 72 20 2a 73 63 61 6e 3b 0a ┆xp *r; register char *scan; ┆ 0x04f200…09e600 20 20 20 20 72 65 67 69 73 74 65 72 20 63 68 61 72 20 2a 6c 6f 6e 67 65 73 74 3b 0a 20 20 20 20 ┆ register char *longest; ┆ 0x04f200…09e600 72 65 67 69 73 74 65 72 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73 3b ┆register int len; int flags;┆ 0x04f200…09e600 0a 0a 20 20 20 20 69 66 20 28 65 78 70 20 3d 3d 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 0a 20 ┆ if (exp == (char *)NULL) ┆ 0x04f200…09e600 20 20 20 7b 0a 09 78 65 72 72 6f 72 28 22 72 65 67 75 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e ┆ { xerror("regular expression┆ 0x04f200…09e600 20 62 6f 74 63 68 2c 20 4e 55 4c 4c 20 61 72 67 75 6d 65 6e 74 22 29 3b 0a 09 72 65 74 75 72 6e ┆ botch, NULL argument"); return┆ 0x04f200…09e600 28 28 72 65 67 65 78 70 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a ┆((regexp *) NULL); } /*┆ 0x04f200…09e600 20 46 69 72 73 74 20 70 61 73 73 3a 20 64 65 74 65 72 6d 69 6e 65 20 73 69 7a 65 2c 20 6c 65 67 ┆ First pass: determine size, leg┆ 0x04f200…09e600 61 6c 69 74 79 2e 20 2a 2f 0a 20 20 20 20 72 65 67 70 61 72 73 65 20 3d 20 65 78 70 3b 0a 20 20 ┆ality. */ regparse = exp; ┆ 0x04f200…09e600 20 20 72 65 67 6e 70 61 72 20 3d 20 31 3b 0a 20 20 20 20 72 65 67 73 69 7a 65 20 3d 20 30 3b 0a ┆ regnpar = 1; regsize = 0; ┆ 0x04f200…09e600 20 20 20 20 72 65 67 63 6f 64 65 20 3d 20 26 72 65 67 64 75 6d 6d 79 3b 0a 20 20 20 20 72 65 67 ┆ regcode = ®dummy; reg┆ 0x04f200…09e600 63 28 4d 41 47 49 43 29 3b 0a 20 20 20 20 69 66 20 28 72 65 67 28 30 2c 20 26 66 6c 61 67 73 29 ┆c(MAGIC); if (reg(0, &flags)┆ 0x04f200…09e600 20 3d 3d 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 0a 09 72 65 74 75 72 6e 28 28 72 65 67 65 78 ┆ == (char *)NULL) return((regex┆ 0x04f200…09e600 70 20 2a 29 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 6d 61 6c 6c 20 65 6e 6f 75 67 68 20 ┆p *)NULL); /* Small enough ┆ 0x04f200…09e600 66 6f 72 20 70 6f 69 6e 74 65 72 2d 73 74 6f 72 61 67 65 20 63 6f 6e 76 65 6e 74 69 6f 6e 3f 20 ┆for pointer-storage convention? ┆ 0x04f200…09e600 2a 2f 0a 20 20 20 20 69 66 20 28 72 65 67 73 69 7a 65 20 3e 3d 20 33 32 37 36 37 4c 29 09 09 2f ┆*/ if (regsize >= 32767L) /┆ 0x04f200…09e600 2a 20 50 72 6f 62 61 62 6c 79 20 63 6f 75 6c 64 20 62 65 20 36 35 35 33 35 4c 2e 20 2a 2f 0a 20 ┆* Probably could be 65535L. */ ┆ 0x04f200…09e600 20 20 20 7b 0a 09 78 65 72 72 6f 72 28 22 72 65 67 75 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e ┆ { xerror("regular expression┆ 0x04f200…09e600 20 62 6f 74 63 68 2c 20 72 65 67 65 78 70 20 74 6f 6f 20 62 69 67 22 29 3b 0a 09 72 65 74 75 72 ┆ botch, regexp too big"); retur┆ 0x04f200…09e600 6e 28 28 72 65 67 65 78 70 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f ┆n((regexp *) NULL); } /┆ 0x04f200…09e600 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 2e 20 2a 2f 0a 23 69 66 6e 64 65 66 20 6c 69 6e ┆* Allocate space. */ #ifndef lin┆ 0x04f200…09e600 74 0a 20 20 20 20 72 20 3d 20 28 72 65 67 65 78 70 20 2a 29 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f ┆t r = (regexp *)malloc(sizeo┆ 0x04f200…09e600 66 28 72 65 67 65 78 70 29 20 2b 20 28 75 6e 73 69 67 6e 65 64 29 72 65 67 73 69 7a 65 29 3b 0a ┆f(regexp) + (unsigned)regsize); ┆ 0x04f200…09e600 23 65 6c 73 65 0a 20 20 20 20 72 20 3d 20 28 72 65 67 65 78 70 20 2a 29 4e 55 4c 4c 3b 0a 23 65 ┆#else r = (regexp *)NULL; #e┆ 0x04f200…09e600 6e 64 69 66 20 2f 2a 20 6c 69 6e 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 72 20 3d 3d 20 28 72 65 ┆ndif /* lint */ if (r == (re┆ 0x04f200…09e600 67 65 78 70 20 2a 29 4e 55 4c 4c 29 0a 20 20 20 20 7b 0a 09 78 65 72 72 6f 72 28 22 72 65 67 75 ┆gexp *)NULL) { xerror("regu┆ 0x04f200…09e600 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e 20 62 6f 74 63 68 2c 20 6f 75 74 20 6f 66 20 73 70 61 ┆lar expression botch, out of spa┆ 0x04f200…09e600 63 65 22 29 3b 0a 09 72 65 74 75 72 6e 28 28 72 65 67 65 78 70 20 2a 29 20 4e 55 4c 4c 29 3b 0a ┆ce"); return((regexp *) NULL); ┆ 0x04f200…09e600 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 70 61 73 73 3a 20 65 6d 69 74 20 ┆ } /* Second pass: emit ┆ 0x04f200…09e600 63 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 72 65 67 70 61 72 73 65 20 3d 20 65 78 70 3b 0a 20 20 20 ┆code. */ regparse = exp; ┆ 0x04f200…09e600 20 72 65 67 6e 70 61 72 20 3d 20 31 3b 0a 20 20 20 20 72 65 67 63 6f 64 65 20 3d 20 72 2d 3e 70 ┆ regnpar = 1; regcode = r->p┆ 0x04f200…09e600 72 6f 67 72 61 6d 3b 0a 20 20 20 20 72 65 67 63 28 4d 41 47 49 43 29 3b 0a 20 20 20 20 69 66 20 ┆rogram; regc(MAGIC); if ┆ 0x04f200…09e600 28 72 65 67 28 30 2c 20 26 66 6c 61 67 73 29 20 3d 3d 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 ┆(reg(0, &flags) == (char *)NULL)┆ 0x04f200…09e600 0a 09 72 65 74 75 72 6e 28 28 72 65 67 65 78 70 20 2a 29 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 2f ┆ return((regexp *)NULL); /┆ 0x04f200…09e600 2a 20 44 69 67 20 6f 75 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 6f 70 74 69 6d 69 ┆* Dig out information for optimi┆ 0x04f200…09e600 7a 61 74 69 6f 6e 73 2e 20 2a 2f 0a 20 20 20 20 72 2d 3e 72 65 67 73 74 61 72 74 20 3d 20 27 5c ┆zations. */ r->regstart = '\┆ 0x04f200…09e600 30 27 3b 09 2f 2a 20 57 6f 72 73 74 2d 63 61 73 65 20 64 65 66 61 75 6c 74 73 2e 20 2a 2f 0a 20 ┆0'; /* Worst-case defaults. */ ┆ 0x04f200…09e600 20 20 20 72 2d 3e 72 65 67 61 6e 63 68 20 3d 20 30 3b 0a 20 20 20 20 72 2d 3e 72 65 67 6d 75 73 ┆ r->reganch = 0; r->regmus┆ 0x04f200…09e600 74 20 3d 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 3b 0a 20 20 20 20 72 2d 3e 72 65 67 6d 6c 65 6e ┆t = (char *)NULL; r->regmlen┆ 0x04f200…09e600 20 3d 20 30 3b 0a 20 20 20 20 73 63 61 6e 20 3d 20 72 2d 3e 70 72 6f 67 72 61 6d 2b 31 3b 09 09 ┆ = 0; scan = r->program+1; ┆ 0x04f200…09e600 2f 2a 20 46 69 72 73 74 20 42 52 41 4e 43 48 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28 4f 50 28 72 ┆/* First BRANCH. */ if (OP(r┆ 0x04f200…09e600 65 67 6e 65 78 74 28 73 63 61 6e 29 29 20 3d 3d 20 45 4e 44 29 20 7b 09 2f 2a 20 4f 6e 6c 79 20 ┆egnext(scan)) == END) { /* Only ┆ 0x04f200…09e600 6f 6e 65 20 74 6f 70 2d 6c 65 76 65 6c 20 63 68 6f 69 63 65 2e 20 2a 2f 0a 09 73 63 61 6e 20 3d ┆one top-level choice. */ scan =┆ 0x04f200…09e600 20 4f 50 45 52 41 4e 44 28 73 63 61 6e 29 3b 0a 0a 09 2f 2a 20 53 74 61 72 74 69 6e 67 2d 70 6f ┆ OPERAND(scan); /* Starting-po┆ 0x04f200…09e600 69 6e 74 20 69 6e 66 6f 2e 20 2a 2f 0a 09 69 66 20 28 4f 50 28 73 63 61 6e 29 20 3d 3d 20 45 58 ┆int info. */ if (OP(scan) == EX┆ 0x04f200…09e600 41 43 54 4c 59 29 0a 09 20 20 20 20 72 2d 3e 72 65 67 73 74 61 72 74 20 3d 20 2a 4f 50 45 52 41 ┆ACTLY) r->regstart = *OPERA┆ 0x04f200…09e600 4e 44 28 73 63 61 6e 29 3b 0a 09 65 6c 73 65 20 69 66 20 28 4f 50 28 73 63 61 6e 29 20 3d 3d 20 ┆ND(scan); else if (OP(scan) == ┆ 0x04f200…09e600 42 4f 4c 29 0a 09 20 20 20 20 72 2d 3e 72 65 67 61 6e 63 68 2b 2b 3b 0a 0a 09 2f 2a 0a 09 20 2a ┆BOL) r->reganch++; /* *┆ 0x04f200…09e600 20 49 66 20 74 68 65 72 65 27 73 20 73 6f 6d 65 74 68 69 6e 67 20 65 78 70 65 6e 73 69 76 65 20 ┆ If there's something expensive ┆ 0x04f200…09e600 69 6e 20 74 68 65 20 72 2e 65 2e 2c 20 66 69 6e 64 20 74 68 65 0a 09 20 2a 20 6c 6f 6e 67 65 73 ┆in the r.e., find the * longes┆ 0x04f200…09e600 74 20 6c 69 74 65 72 61 6c 20 73 74 72 69 6e 67 20 74 68 61 74 20 6d 75 73 74 20 61 70 70 65 61 ┆t literal string that must appea┆ 0x04f200…09e600 72 20 61 6e 64 20 6d 61 6b 65 20 69 74 20 74 68 65 0a 09 20 2a 20 72 65 67 6d 75 73 74 2e 20 20 ┆r and make it the * regmust. ┆ 0x04f200…09e600 52 65 73 6f 6c 76 65 20 74 69 65 73 20 69 6e 20 66 61 76 6f 72 20 6f 66 20 6c 61 74 65 72 20 73 ┆Resolve ties in favor of later s┆ 0x04f200…09e600 74 72 69 6e 67 73 2c 20 73 69 6e 63 65 0a 09 20 2a 20 74 68 65 20 72 65 67 73 74 61 72 74 20 63 ┆trings, since * the regstart c┆ 0x04f200…09e600 68 65 63 6b 20 77 6f 72 6b 73 20 77 69 74 68 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 ┆heck works with the beginning of┆ 0x04f200…09e600 20 74 68 65 20 72 2e 65 2e 0a 09 20 2a 20 61 6e 64 20 61 76 6f 69 64 69 6e 67 20 64 75 70 6c 69 ┆ the r.e. * and avoiding dupli┆ 0x04f200…09e600 63 61 74 69 6f 6e 20 73 74 72 65 6e 67 74 68 65 6e 73 20 63 68 65 63 6b 69 6e 67 2e 20 20 4e 6f ┆cation strengthens checking. No┆ 0x04f200…09e600 74 20 61 0a 09 20 2a 20 73 74 72 6f 6e 67 20 72 65 61 73 6f 6e 2c 20 62 75 74 20 73 75 66 66 69 ┆t a * strong reason, but suffi┆ 0x04f200…09e600 63 69 65 6e 74 20 69 6e 20 74 68 65 20 61 62 73 65 6e 63 65 20 6f 66 20 6f 74 68 65 72 73 2e 0a ┆cient in the absence of others. ┆ 0x04f200…09e600 09 20 2a 2f 0a 09 69 66 20 28 66 6c 61 67 73 26 53 50 53 54 41 52 54 29 20 7b 0a 09 20 20 20 20 ┆ */ if (flags&SPSTART) { ┆ 0x04f200…09e600 6c 6f 6e 67 65 73 74 20 3d 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 3b 0a 09 20 20 20 20 6c 65 6e ┆longest = (char *)NULL; len┆ 0x04f200…09e600 20 3d 20 30 3b 0a 09 20 20 20 20 66 6f 72 20 28 3b 20 73 63 61 6e 20 21 3d 20 28 63 68 61 72 20 ┆ = 0; for (; scan != (char ┆ 0x04f200…09e600 2a 29 4e 55 4c 4c 3b 20 73 63 61 6e 20 3d 20 72 65 67 6e 65 78 74 28 73 63 61 6e 29 29 0a 09 09 ┆*)NULL; scan = regnext(scan)) ┆ 0x04f200…09e600 69 66 20 28 4f 50 28 73 63 61 6e 29 20 3d 3d 20 45 58 41 43 54 4c 59 20 26 26 20 73 74 72 6c 65 ┆if (OP(scan) == EXACTLY && strle┆ 0x04f200…09e600 6e 28 4f 50 45 52 41 4e 44 28 73 63 61 6e 29 29 20 3e 3d 20 6c 65 6e 29 20 7b 0a 09 09 20 20 20 ┆n(OPERAND(scan)) >= len) { ┆ 0x04f200…09e600 20 6c 6f 6e 67 65 73 74 20 3d 20 4f 50 45 52 41 4e 44 28 73 63 61 6e 29 3b 0a 09 09 20 20 20 20 ┆ longest = OPERAND(scan); ┆ 0x04f200…09e600 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 4f 50 45 52 41 4e 44 28 73 63 61 6e 29 29 3b 0a 09 09 7d ┆len = strlen(OPERAND(scan)); }┆ 0x04f200…09e600 0a 09 20 20 20 20 72 2d 3e 72 65 67 6d 75 73 74 20 3d 20 6c 6f 6e 67 65 73 74 3b 0a 09 20 20 20 ┆ r->regmust = longest; ┆ 0x04f200…09e600 20 72 2d 3e 72 65 67 6d 6c 65 6e 20 3d 20 6c 65 6e 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 ┆ r->regmlen = len; } } ┆ 0x04f200…09e600 20 72 65 74 75 72 6e 28 72 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2d 20 72 65 67 20 2d 20 72 65 67 75 6c ┆ return(r); } /* - reg - regul┆ 0x04f200…09e600 61 72 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 69 2e 65 2e 20 6d 61 69 6e 20 62 6f 64 79 20 6f 72 ┆ar expression, i.e. main body or┆ 0x04f200…09e600 20 70 61 72 65 6e 74 68 65 73 69 7a 65 64 20 74 68 69 6e 67 0a 20 2a 0a 20 2a 20 43 61 6c 6c 65 ┆ parenthesized thing * * Calle┆ 0x04f200…09e600 72 20 6d 75 73 74 20 61 62 73 6f 72 62 20 6f 70 65 6e 69 6e 67 20 70 61 72 65 6e 74 68 65 73 69 ┆r must absorb opening parenthesi┆ 0x04f200…09e600 73 2e 0a 20 2a 0a 20 2a 20 43 6f 6d 62 69 6e 69 6e 67 20 70 61 72 65 6e 74 68 65 73 69 73 20 68 ┆s. * * Combining parenthesis h┆ 0x04f200…09e600 61 6e 64 6c 69 6e 67 20 77 69 74 68 20 74 68 65 20 62 61 73 65 20 6c 65 76 65 6c 20 6f 66 20 72 ┆andling with the base level of r┆ 0x04f200…09e600 65 67 75 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 2a 20 69 73 20 61 20 74 72 69 66 6c 65 ┆egular expression * is a trifle┆ 0x04f200…09e600 20 66 6f 72 63 65 64 2c 20 62 75 74 20 74 68 65 20 6e 65 65 64 20 74 6f 20 74 69 65 20 74 68 65 ┆ forced, but the need to tie the┆ 0x04f200…09e600 20 74 61 69 6c 73 20 6f 66 20 74 68 65 20 62 72 61 6e 63 68 65 73 20 74 6f 20 77 68 61 74 0a 20 ┆ tails of the branches to what ┆ 0x04f200…09e600 2a 20 66 6f 6c 6c 6f 77 73 20 6d 61 6b 65 73 20 69 74 20 68 61 72 64 20 74 6f 20 61 76 6f 69 64 ┆* follows makes it hard to avoid┆ 0x04f200…09e600 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 0a 72 65 67 28 70 61 72 65 6e 2c 20 66 ┆. */ static char * reg(paren, f┆ 0x04f200…09e600 6c 61 67 70 29 0a 69 6e 74 20 70 61 72 65 6e 3b 09 09 09 2f 2a 20 50 61 72 65 6e 74 68 65 73 69 ┆lagp) int paren; /* Parenthesi┆ 0x04f200…09e600 7a 65 64 3f 20 2a 2f 0a 69 6e 74 20 2a 66 6c 61 67 70 3b 0a 7b 0a 20 20 20 20 72 65 67 69 73 74 ┆zed? */ int *flagp; { regist┆ 0x04f200…09e600 65 72 20 63 68 61 72 20 2a 72 65 74 3b 0a 20 20 20 20 72 65 67 69 73 74 65 72 20 63 68 61 72 20 ┆er char *ret; register char ┆ 0x04f200…09e600 2a 62 72 3b 0a 20 20 20 20 72 65 67 69 73 74 65 72 20 63 68 61 72 20 2a 65 6e 64 65 72 3b 0a 20 ┆*br; register char *ender; ┆ 0x04f200…09e600 20 20 20 72 65 67 69 73 74 65 72 20 69 6e 74 20 70 61 72 6e 6f 3b 0a 20 20 20 20 69 6e 74 20 66 ┆ register int parno; int f┆ 0x04f200…09e600 6c 61 67 73 3b 0a 0a 20 20 20 20 2a 66 6c 61 67 70 20 3d 20 48 41 53 57 49 44 54 48 3b 09 2f 2a ┆lags; *flagp = HASWIDTH; /*┆ 0x04f200…09e600 20 54 65 6e 74 61 74 69 76 65 6c 79 2e 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 61 6e ┆ Tentatively. */ /* Make an┆ 0x04f200…09e600 20 4f 50 45 4e 20 6e 6f 64 65 2c 20 69 66 20 70 61 72 65 6e 74 68 65 73 69 7a 65 64 2e 20 2a 2f ┆ OPEN node, if parenthesized. */┆ 0x04f200…09e600 0a 20 20 20 20 69 66 20 28 70 61 72 65 6e 29 20 7b 0a 09 69 66 20 28 72 65 67 6e 70 61 72 20 3e ┆ if (paren) { if (regnpar >┆ 0x04f200…09e600 3d 20 4e 53 55 42 45 58 50 29 0a 09 20 20 20 20 41 42 4f 52 54 28 22 74 6f 6f 20 6d 61 6e 79 20 ┆= NSUBEXP) ABORT("too many ┆ 0x04f200…09e600 28 29 22 29 3b 0a 09 70 61 72 6e 6f 20 3d 20 72 65 67 6e 70 61 72 3b 0a 09 72 65 67 6e 70 61 72 ┆()"); parno = regnpar; regnpar┆ 0x04f200…09e600 2b 2b 3b 0a 09 72 65 74 20 3d 20 72 65 67 6e 6f 64 65 28 4f 50 45 4e 2b 70 61 72 6e 6f 29 3b 0a ┆++; ret = regnode(OPEN+parno); ┆ 0x04f200…09e600 20 20 20 20 7d 20 65 6c 73 65 0a 09 72 65 74 20 3d 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 3b 0a ┆ } else ret = (char *)NULL; ┆ 0x04f200…09e600 0a 20 20 20 20 2f 2a 20 50 69 63 6b 20 75 70 20 74 68 65 20 62 72 61 6e 63 68 65 73 2c 20 6c 69 ┆ /* Pick up the branches, li┆ 0x04f200…09e600 6e 6b 69 6e 67 20 74 68 65 6d 20 74 6f 67 65 74 68 65 72 2e 20 2a 2f 0a 20 20 20 20 62 72 20 3d ┆nking them together. */ br =┆ 0x04f200…09e600 20 72 65 67 62 72 61 6e 63 68 28 26 66 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 20 28 62 72 20 3d ┆ regbranch(&flags); if (br =┆ 0x04f200…09e600 3d 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 0a 09 72 65 74 75 72 6e 28 28 63 68 61 72 20 2a 29 ┆= (char *)NULL) return((char *)┆ 0x04f200…09e600 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28 72 65 74 20 21 3d 20 28 63 68 61 72 20 2a 29 4e 55 ┆NULL); if (ret != (char *)NU┆ 0x04f200…09e600 4c 4c 29 0a 09 72 65 67 74 61 69 6c 28 72 65 74 2c 20 62 72 29 3b 09 2f 2a 20 4f 50 45 4e 20 2d ┆LL) regtail(ret, br); /* OPEN -┆ 0x04f200…09e600 3e 20 66 69 72 73 74 2e 20 2a 2f 0a 20 20 20 20 65 6c 73 65 0a 09 72 65 74 20 3d 20 62 72 3b 0a ┆> first. */ else ret = br; ┆ 0x04f200…09e600 09 69 66 20 28 21 28 66 6c 61 67 73 26 48 41 53 57 49 44 54 48 29 29 0a 09 20 20 20 20 2a 66 6c ┆ if (!(flags&HASWIDTH)) *fl┆ 0x04f200…09e600 61 67 70 20 26 3d 20 7e 48 41 53 57 49 44 54 48 3b 0a 20 20 20 20 2a 66 6c 61 67 70 20 7c 3d 20 ┆agp &= ~HASWIDTH; *flagp |= ┆ 0x04f200…09e600 66 6c 61 67 73 26 53 50 53 54 41 52 54 3b 0a 20 20 20 20 77 68 69 6c 65 20 28 2a 72 65 67 70 61 ┆flags&SPSTART; while (*regpa┆ 0x04f200…09e600 72 73 65 20 3d 3d 20 27 7c 27 29 20 7b 0a 09 72 65 67 70 61 72 73 65 2b 2b 3b 0a 09 62 72 20 3d ┆rse == '|') { regparse++; br =┆ 0x04f200…09e600 20 72 65 67 62 72 61 6e 63 68 28 26 66 6c 61 67 73 29 3b 0a 09 69 66 20 28 62 72 20 3d 3d 20 28 ┆ regbranch(&flags); if (br == (┆ 0x04f200…09e600 63 68 61 72 20 2a 29 4e 55 4c 4c 29 0a 09 20 20 20 20 72 65 74 75 72 6e 28 28 63 68 61 72 20 2a ┆char *)NULL) return((char *┆ 0x04f200…09e600 29 4e 55 4c 4c 29 3b 0a 09 72 65 67 74 61 69 6c 28 72 65 74 2c 20 62 72 29 3b 09 2f 2a 20 42 52 ┆)NULL); regtail(ret, br); /* BR┆ 0x04f200…09e600 41 4e 43 48 20 2d 3e 20 42 52 41 4e 43 48 2e 20 2a 2f 0a 09 69 66 20 28 21 28 66 6c 61 67 73 26 ┆ANCH -> BRANCH. */ if (!(flags&┆ 0x04f200…09e600 48 41 53 57 49 44 54 48 29 29 0a 09 20 20 20 20 2a 66 6c 61 67 70 20 26 3d 20 7e 48 41 53 57 49 ┆HASWIDTH)) *flagp &= ~HASWI┆ 0x04f200…09e600 44 54 48 3b 0a 09 2a 66 6c 61 67 70 20 7c 3d 20 66 6c 61 67 73 26 53 50 53 54 41 52 54 3b 0a 20 ┆DTH; *flagp |= flags&SPSTART; ┆ 0x04f200…09e600 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 61 20 63 6c 6f 73 69 6e 67 20 6e 6f 64 65 ┆ } /* Make a closing node┆ 0x04f200…09e600 2c 20 61 6e 64 20 68 6f 6f 6b 20 69 74 20 6f 6e 20 74 68 65 20 65 6e 64 2e 20 2a 2f 0a 20 20 20 ┆, and hook it on the end. */ ┆ 0x04f200…09e600 20 65 6e 64 65 72 20 3d 20 72 65 67 6e 6f 64 65 28 28 70 61 72 65 6e 29 20 3f 20 43 4c 4f 53 45 ┆ ender = regnode((paren) ? CLOSE┆ 0x04f200…09e600 2b 70 61 72 6e 6f 20 3a 20 45 4e 44 29 3b 09 0a 20 20 20 20 72 65 67 74 61 69 6c 28 72 65 74 2c ┆+parno : END); regtail(ret,┆ 0x04f200…09e600 20 65 6e 64 65 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 48 6f 6f 6b 20 74 68 65 20 74 61 69 6c 73 20 ┆ ender); /* Hook the tails ┆ 0x04f200…09e600 6f 66 20 74 68 65 20 62 72 61 6e 63 68 65 73 20 74 6f 20 74 68 65 20 63 6c 6f 73 69 6e 67 20 6e ┆of the branches to the closing n┆ 0x04f200…09e600 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 20 28 62 72 20 3d 20 72 65 74 3b 20 62 72 20 21 3d ┆ode. */ for (br = ret; br !=┆ 0x04f200…09e600 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 3b 20 62 72 20 3d 20 72 65 67 6e 65 78 74 28 62 72 29 29 ┆ (char *)NULL; br = regnext(br))┆ 0x04f200…09e600 0a 09 72 65 67 6f 70 74 61 69 6c 28 62 72 2c 20 65 6e 64 65 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 ┆ regoptail(br, ender); /* ┆ 0x04f200…09e600 43 68 65 63 6b 20 66 6f 72 20 70 72 6f 70 65 72 20 74 65 72 6d 69 6e 61 74 69 6f 6e 2e 20 2a 2f ┆Check for proper termination. */┆ 0x04f200…09e600 0a 20 20 20 20 69 66 20 28 70 61 72 65 6e 20 26 26 20 2a 72 65 67 70 61 72 73 65 2b 2b 20 21 3d ┆ if (paren && *regparse++ !=┆ 0x04f200…09e600 20 27 29 27 29 20 7b 0a 09 41 42 4f 52 54 28 22 75 6e 6d 61 74 63 68 65 64 20 28 29 22 29 3b 0a ┆ ')') { ABORT("unmatched ()"); ┆ 0x04f200…09e600 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 21 70 61 72 65 6e 20 26 26 20 2a 72 65 67 70 61 72 ┆ } else if (!paren && *regpar┆ 0x04f200…09e600 73 65 20 21 3d 20 27 5c 30 27 29 20 7b 0a 09 69 66 20 28 2a 72 65 67 70 61 72 73 65 20 3d 3d 20 ┆se != '\0') { if (*regparse == ┆ 0x04f200…09e600 27 29 27 29 20 7b 0a 09 20 20 20 20 41 42 4f 52 54 28 22 75 6e 6d 61 74 63 68 65 64 20 28 29 22 ┆')') { ABORT("unmatched ()"┆ 0x04f200…09e600 29 3b 0a 09 7d 20 65 6c 73 65 0a 09 20 20 20 20 41 42 4f 52 54 28 22 6a 75 6e 6b 20 6f 6e 20 65 ┆); } else ABORT("junk on e┆ 0x04f200…09e600 6e 64 22 29 3b 09 2f 2a 20 22 43 61 6e 27 74 20 68 61 70 70 65 6e 22 2e 20 2a 2f 0a 09 2f 2a 20 ┆nd"); /* "Can't happen". */ /* ┆ 0x04f200…09e600 4e 4f 54 52 45 41 43 48 45 44 20 2a 2f 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 65 74 75 72 6e 28 ┆NOTREACHED */ } return(┆ 0x04f200…09e600 72 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2d 20 72 65 67 62 72 61 6e 63 68 20 2d 20 6f 6e 65 20 61 ┆ret); } /* - regbranch - one a┆ 0x04f200…09e600 6c 74 65 72 6e 61 74 69 76 65 20 6f 66 20 61 6e 20 7c 20 6f 70 65 72 61 74 6f 72 0a 20 2a 0a 20 ┆lternative of an | operator * ┆ 0x04f200…09e600 2a 20 49 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 63 6f 6e 63 61 74 65 6e 61 74 69 6f 6e 20 6f ┆* Implements the concatenation o┆ 0x04f200…09e600 70 65 72 61 74 6f 72 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 0a 72 65 67 62 72 ┆perator. */ static char * regbr┆ 0x04f200…09e600 61 6e 63 68 28 66 6c 61 67 70 29 0a 69 6e 74 20 2a 66 6c 61 67 70 3b 0a 7b 0a 20 20 20 20 72 65 ┆anch(flagp) int *flagp; { re┆ 0x04f200…09e600 67 69 73 74 65 72 20 63 68 61 72 20 2a 72 65 74 3b 0a 20 20 20 20 72 65 67 69 73 74 65 72 20 63 ┆gister char *ret; register c┆ 0x04f200…09e600 68 61 72 20 2a 63 68 61 69 6e 3b 0a 20 20 20 20 72 65 67 69 73 74 65 72 20 63 68 61 72 20 2a 6c ┆har *chain; register char *l┆ 0x04f200…09e600 61 74 65 73 74 3b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73 3b 0a 0a 20 20 20 20 2a 66 6c 61 67 ┆atest; int flags; *flag┆ 0x04f200…09e600 70 20 3d 20 57 4f 52 53 54 3b 09 09 2f 2a 20 54 65 6e 74 61 74 69 76 65 6c 79 2e 20 2a 2f 0a 0a ┆p = WORST; /* Tentatively. */ ┆ 0x04f200…09e600 20 20 20 20 72 65 74 20 3d 20 72 65 67 6e 6f 64 65 28 42 52 41 4e 43 48 29 3b 0a 20 20 20 20 63 ┆ ret = regnode(BRANCH); c┆ 0x04f200…09e600 68 61 69 6e 20 3d 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 3b 0a 20 20 20 20 77 68 69 6c 65 20 28 ┆hain = (char *)NULL; while (┆ 0x04f200…09e600 2a 72 65 67 70 61 72 73 65 20 21 3d 20 27 5c 30 27 20 26 26 20 2a 72 65 67 70 61 72 73 65 20 21 ┆*regparse != '\0' && *regparse !┆ 0x04f200…09e600 3d 20 27 7c 27 20 26 26 20 2a 72 65 67 70 61 72 73 65 20 21 3d 20 27 29 27 29 20 7b 0a 09 6c 61 ┆= '|' && *regparse != ')') { la┆ 0x04f200…09e600 74 65 73 74 20 3d 20 72 65 67 70 69 65 63 65 28 26 66 6c 61 67 73 29 3b 0a 09 69 66 20 28 6c 61 ┆test = regpiece(&flags); if (la┆ 0x04f200…09e600 74 65 73 74 20 3d 3d 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 0a 09 20 20 20 20 72 65 74 75 72 ┆test == (char *)NULL) retur┆ 0x04f200…09e600 6e 28 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 2a 66 6c 61 67 70 20 7c 3d 20 66 6c 61 67 ┆n((char *)NULL); *flagp |= flag┆ 0x04f200…09e600 73 26 48 41 53 57 49 44 54 48 3b 0a 09 69 66 20 28 63 68 61 69 6e 20 3d 3d 20 28 63 68 61 72 20 ┆s&HASWIDTH; if (chain == (char ┆ 0x04f200…09e600 2a 29 4e 55 4c 4c 29 09 2f 2a 20 46 69 72 73 74 20 70 69 65 63 65 2e 20 2a 2f 0a 09 20 20 20 20 ┆*)NULL) /* First piece. */ ┆ 0x04f200…09e600 2a 66 6c 61 67 70 20 7c 3d 20 66 6c 61 67 73 26 53 50 53 54 41 52 54 3b 0a 09 65 6c 73 65 0a 09 ┆*flagp |= flags&SPSTART; else ┆ 0x04f200…09e600 20 20 20 20 72 65 67 74 61 69 6c 28 63 68 61 69 6e 2c 20 6c 61 74 65 73 74 29 3b 0a 09 63 68 61 ┆ regtail(chain, latest); cha┆ 0x04f200…09e600 69 6e 20 3d 20 6c 61 74 65 73 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 63 68 61 69 6e ┆in = latest; } if (chain┆ 0x04f200…09e600 20 3d 3d 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 09 2f 2a 20 4c 6f 6f 70 20 72 61 6e 20 7a 65 ┆ == (char *)NULL) /* Loop ran ze┆ 0x04f200…09e600 72 6f 20 74 69 6d 65 73 2e 20 2a 2f 0a 09 28 76 6f 69 64 29 20 72 65 67 6e 6f 64 65 28 4e 4f 54 ┆ro times. */ (void) regnode(NOT┆ 0x04f200…09e600 48 49 4e 47 29 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e 28 72 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 20 ┆HING); return(ret); } /* ┆ 0x04f200…09e600 2d 20 72 65 67 70 69 65 63 65 20 2d 20 73 6f 6d 65 74 68 69 6e 67 20 66 6f 6c 6c 6f 77 65 64 20 ┆- regpiece - something followed ┆ 0x04f200…09e600 62 79 20 70 6f 73 73 69 62 6c 65 20 5b 2a 2b 3f 5d 0a 20 2a 0a 20 2a 20 4e 6f 74 65 20 74 68 61 ┆by possible [*+?] * * Note tha┆ 0x04f200…09e600 74 20 74 68 65 20 62 72 61 6e 63 68 69 6e 67 20 63 6f 64 65 20 73 65 71 75 65 6e 63 65 73 20 75 ┆t the branching code sequences u┆ 0x04f200…09e600 73 65 64 20 66 6f 72 20 3f 20 61 6e 64 20 74 68 65 20 67 65 6e 65 72 61 6c 20 63 61 73 65 73 0a ┆sed for ? and the general cases ┆ 0x04f200…09e600 20 2a 20 6f 66 20 2a 20 61 6e 64 20 2b 20 61 72 65 20 73 6f 6d 65 77 68 61 74 20 6f 70 74 69 6d ┆ * of * and + are somewhat optim┆ 0x04f200…09e600 69 7a 65 64 3a 20 20 74 68 65 79 20 75 73 65 20 74 68 65 20 73 61 6d 65 20 4e 4f 54 48 49 4e 47 ┆ized: they use the same NOTHING┆ 0x04f200…09e600 20 6e 6f 64 65 20 61 73 0a 20 2a 20 62 6f 74 68 20 74 68 65 20 65 6e 64 6d 61 72 6b 65 72 20 66 ┆ node as * both the endmarker f┆ 0x04f200…09e600 6f 72 20 74 68 65 69 72 20 62 72 61 6e 63 68 20 6c 69 73 74 20 61 6e 64 20 74 68 65 20 62 6f 64 ┆or their branch list and the bod┆ 0x04f200…09e600 79 20 6f 66 20 74 68 65 20 6c 61 73 74 20 62 72 61 6e 63 68 2e 0a 20 2a 20 49 74 20 6d 69 67 68 ┆y of the last branch. * It migh┆ 0x04f200…09e600 74 20 73 65 65 6d 20 74 68 61 74 20 74 68 69 73 20 6e 6f 64 65 20 63 6f 75 6c 64 20 62 65 20 64 ┆t seem that this node could be d┆ 0x04f200…09e600 69 73 70 65 6e 73 65 64 20 77 69 74 68 20 65 6e 74 69 72 65 6c 79 2c 20 62 75 74 20 74 68 65 0a ┆ispensed with entirely, but the ┆ 0x04f200…09e600 20 2a 20 65 6e 64 6d 61 72 6b 65 72 20 72 6f 6c 65 20 69 73 20 6e 6f 74 20 72 65 64 75 6e 64 61 ┆ * endmarker role is not redunda┆ 0x04f200…09e600 6e 74 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 0a 72 65 67 70 69 65 63 65 28 66 ┆nt. */ static char * regpiece(f┆ 0x04f200…09e600 6c 61 67 70 29 0a 69 6e 74 20 2a 66 6c 61 67 70 3b 0a 7b 0a 20 20 20 20 72 65 67 69 73 74 65 72 ┆lagp) int *flagp; { register┆ 0x04f200…09e600 20 63 68 61 72 20 2a 72 65 74 3b 0a 20 20 20 20 72 65 67 69 73 74 65 72 20 63 68 61 72 20 6f 70 ┆ char *ret; register char op┆ 0x04f200…09e600 3b 0a 20 20 20 20 72 65 67 69 73 74 65 72 20 63 68 61 72 20 2a 6e 65 78 74 3b 0a 20 20 20 20 69 ┆; register char *next; i┆ 0x04f200…09e600 6e 74 20 66 6c 61 67 73 3b 0a 0a 20 20 20 20 72 65 74 20 3d 20 72 65 67 61 74 6f 6d 28 26 66 6c ┆nt flags; ret = regatom(&fl┆ 0x04f200…09e600 61 67 73 29 3b 0a 20 20 20 20 69 66 20 28 72 65 74 20 3d 3d 20 28 63 68 61 72 20 2a 29 4e 55 4c ┆ags); if (ret == (char *)NUL┆ 0x04f200…09e600 4c 29 0a 09 72 65 74 75 72 6e 28 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 6f ┆L) return((char *)NULL); o┆ 0x04f200…09e600 70 20 3d 20 2a 72 65 67 70 61 72 73 65 3b 0a 20 20 20 20 69 66 20 28 21 49 53 4d 55 4c 54 28 6f ┆p = *regparse; if (!ISMULT(o┆ 0x04f200…09e600 70 29 29 20 7b 0a 09 2a 66 6c 61 67 70 20 3d 20 66 6c 61 67 73 3b 0a 09 72 65 74 75 72 6e 28 72 ┆p)) { *flagp = flags; return(r┆ 0x04f200…09e600 65 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 21 28 66 6c 61 67 73 26 48 41 53 57 ┆et); } if (!(flags&HASW┆ 0x04f200…09e600 49 44 54 48 29 20 26 26 20 6f 70 20 21 3d 20 27 3f 27 29 0a 09 41 42 4f 52 54 28 22 2a 2b 20 6f ┆IDTH) && op != '?') ABORT("*+ o┆ 0x04f200…09e600 70 65 72 61 6e 64 20 63 6f 75 6c 64 20 62 65 20 65 6d 70 74 79 22 29 3b 0a 20 20 20 20 2a 66 6c ┆perand could be empty"); *fl┆ 0x04f200…09e600 61 67 70 20 3d 20 28 6f 70 20 21 3d 20 27 2b 27 29 20 3f 20 28 57 4f 52 53 54 7c 53 50 53 54 41 ┆agp = (op != '+') ? (WORST|SPSTA┆ 0x04f200…09e600 52 54 29 20 3a 20 28 57 4f 52 53 54 7c 48 41 53 57 49 44 54 48 29 3b 0a 0a 20 20 20 20 69 66 20 ┆RT) : (WORST|HASWIDTH); if ┆ 0x04f200…09e600 28 6f 70 20 3d 3d 20 27 2a 27 20 26 26 20 28 66 6c 61 67 73 26 53 49 4d 50 4c 45 29 29 0a 09 72 ┆(op == '*' && (flags&SIMPLE)) r┆ 0x04f200…09e600 65 67 69 6e 73 65 72 74 28 53 54 41 52 2c 20 72 65 74 29 3b 0a 20 20 20 20 65 6c 73 65 20 69 66 ┆eginsert(STAR, ret); else if┆ 0x04f200…09e600 20 28 6f 70 20 3d 3d 20 27 2a 27 29 20 7b 0a 09 2f 2a 20 45 6d 69 74 20 78 2a 20 61 73 20 28 78 ┆ (op == '*') { /* Emit x* as (x┆ 0x04f200…09e600 26 7c 29 2c 20 77 68 65 72 65 20 26 20 6d 65 61 6e 73 20 22 73 65 6c 66 22 2e 20 2a 2f 0a 09 72 ┆&|), where & means "self". */ r┆ 0x04f200…09e600 65 67 69 6e 73 65 72 74 28 42 52 41 4e 43 48 2c 20 72 65 74 29 3b 09 09 09 2f 2a 20 45 69 74 68 ┆eginsert(BRANCH, ret); /* Eith┆ 0x04f200…09e600 65 72 20 78 20 2a 2f 0a 09 72 65 67 6f 70 74 61 69 6c 28 72 65 74 2c 20 72 65 67 6e 6f 64 65 28 ┆er x */ regoptail(ret, regnode(┆ 0x04f200…09e600 42 41 43 4b 29 29 3b 09 09 2f 2a 20 61 6e 64 20 6c 6f 6f 70 20 2a 2f 0a 09 72 65 67 6f 70 74 61 ┆BACK)); /* and loop */ regopta┆ 0x04f200…09e600 69 6c 28 72 65 74 2c 20 72 65 74 29 3b 09 09 09 2f 2a 20 62 61 63 6b 20 2a 2f 0a 09 72 65 67 74 ┆il(ret, ret); /* back */ regt┆ 0x04f200…09e600 61 69 6c 28 72 65 74 2c 20 72 65 67 6e 6f 64 65 28 42 52 41 4e 43 48 29 29 3b 09 09 2f 2a 20 6f ┆ail(ret, regnode(BRANCH)); /* o┆ 0x04f200…09e600 72 20 2a 2f 0a 09 72 65 67 74 61 69 6c 28 72 65 74 2c 20 72 65 67 6e 6f 64 65 28 4e 4f 54 48 49 ┆r */ regtail(ret, regnode(NOTHI┆ 0x04f200…09e600 4e 47 29 29 3b 09 09 2f 2a 20 6e 75 6c 6c 2e 20 2a 2f 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 ┆NG)); /* null. */ } else if┆ 0x04f200…09e600 20 28 6f 70 20 3d 3d 20 27 2b 27 20 26 26 20 28 66 6c 61 67 73 26 53 49 4d 50 4c 45 29 29 0a 09 ┆ (op == '+' && (flags&SIMPLE)) ┆ 0x04f200…09e600 72 65 67 69 6e 73 65 72 74 28 50 4c 55 53 2c 20 72 65 74 29 3b 0a 20 20 20 20 65 6c 73 65 20 69 ┆reginsert(PLUS, ret); else i┆ 0x04f200…09e600 66 20 28 6f 70 20 3d 3d 20 27 2b 27 29 20 7b 0a 09 2f 2a 20 45 6d 69 74 20 78 2b 20 61 73 20 78 ┆f (op == '+') { /* Emit x+ as x┆ 0x04f200…09e600 28 26 7c 29 2c 20 77 68 65 72 65 20 26 20 6d 65 61 6e 73 20 22 73 65 6c 66 22 2e 20 2a 2f 0a 09 ┆(&|), where & means "self". */ ┆ 0x04f200…09e600 6e 65 78 74 20 3d 20 72 65 67 6e 6f 64 65 28 42 52 41 4e 43 48 29 3b 09 09 09 2f 2a 20 45 69 74 ┆next = regnode(BRANCH); /* Eit┆ 0x04f200…09e600 68 65 72 20 2a 2f 0a 09 72 65 67 74 61 69 6c 28 72 65 74 2c 20 6e 65 78 74 29 3b 0a 09 72 65 67 ┆her */ regtail(ret, next); reg┆ 0x04f200…09e600 74 61 69 6c 28 72 65 67 6e 6f 64 65 28 42 41 43 4b 29 2c 20 72 65 74 29 3b 09 09 2f 2a 20 6c 6f ┆tail(regnode(BACK), ret); /* lo┆ 0x04f200…09e600 6f 70 20 62 61 63 6b 20 2a 2f 0a 09 72 65 67 74 61 69 6c 28 6e 65 78 74 2c 20 72 65 67 6e 6f 64 ┆op back */ regtail(next, regnod┆ 0x04f200…09e600 65 28 42 52 41 4e 43 48 29 29 3b 09 09 2f 2a 20 6f 72 20 2a 2f 0a 09 72 65 67 74 61 69 6c 28 72 ┆e(BRANCH)); /* or */ regtail(r┆ 0x04f200…09e600 65 74 2c 20 72 65 67 6e 6f 64 65 28 4e 4f 54 48 49 4e 47 29 29 3b 09 09 2f 2a 20 6e 75 6c 6c 2e ┆et, regnode(NOTHING)); /* null.┆ 0x04f200…09e600 20 2a 2f 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 6f 70 20 3d 3d 20 27 3f 27 29 20 7b 0a ┆ */ } else if (op == '?') { ┆ 0x04f200…09e600 09 2f 2a 20 45 6d 69 74 20 78 3f 20 61 73 20 28 78 7c 29 20 2a 2f 0a 09 72 65 67 69 6e 73 65 72 ┆ /* Emit x? as (x|) */ reginser┆ 0x04f200…09e600 74 28 42 52 41 4e 43 48 2c 20 72 65 74 29 3b 09 09 09 2f 2a 20 45 69 74 68 65 72 20 78 20 2a 2f ┆t(BRANCH, ret); /* Either x */┆ 0x04f200…09e600 0a 09 72 65 67 74 61 69 6c 28 72 65 74 2c 20 72 65 67 6e 6f 64 65 28 42 52 41 4e 43 48 29 29 3b ┆ regtail(ret, regnode(BRANCH));┆ 0x04f200…09e600 09 09 2f 2a 20 6f 72 20 2a 2f 0a 09 6e 65 78 74 20 3d 20 72 65 67 6e 6f 64 65 28 4e 4f 54 48 49 ┆ /* or */ next = regnode(NOTHI┆ 0x04f200…09e600 4e 47 29 3b 09 09 2f 2a 20 6e 75 6c 6c 2e 20 2a 2f 0a 09 72 65 67 74 61 69 6c 28 72 65 74 2c 20 ┆NG); /* null. */ regtail(ret, ┆ 0x04f200…09e600 6e 65 78 74 29 3b 0a 09 72 65 67 6f 70 74 61 69 6c 28 72 65 74 2c 20 6e 65 78 74 29 3b 0a 20 20 ┆next); regoptail(ret, next); ┆ 0x04f200…09e600 20 20 7d 0a 20 20 20 20 72 65 67 70 61 72 73 65 2b 2b 3b 0a 20 20 20 20 69 66 20 28 49 53 4d 55 ┆ } regparse++; if (ISMU┆ 0x04f200…09e600 4c 54 28 2a 72 65 67 70 61 72 73 65 29 29 0a 09 41 42 4f 52 54 28 22 6e 65 73 74 65 64 20 2a 3f ┆LT(*regparse)) ABORT("nested *?┆ 0x04f200…09e600 2b 22 29 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e 28 72 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2d 20 ┆+"); return(ret); } /* - ┆ 0x04f200…09e600 72 65 67 61 74 6f 6d 20 2d 20 74 68 65 20 6c 6f 77 65 73 74 20 6c 65 76 65 6c 0a 20 2a 0a 20 2a ┆regatom - the lowest level * *┆ 0x04f200…09e600 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 3a 20 20 67 6f 62 62 6c 65 73 20 61 6e 20 65 6e 74 69 72 ┆ Optimization: gobbles an entir┆ 0x04f200…09e600 65 20 73 65 71 75 65 6e 63 65 20 6f 66 20 6f 72 64 69 6e 61 72 79 20 63 68 61 72 61 63 74 65 72 ┆e sequence of ordinary character┆ 0x04f200…09e600 73 20 73 6f 20 74 68 61 74 0a 20 2a 20 69 74 20 63 61 6e 20 74 75 72 6e 20 74 68 65 6d 20 69 6e ┆s so that * it can turn them in┆ 0x04f200…09e600 74 6f 20 61 20 73 69 6e 67 6c 65 20 6e 6f 64 65 2c 20 77 68 69 63 68 20 69 73 20 73 6d 61 6c 6c ┆to a single node, which is small┆ 0x04f200…09e600 65 72 20 74 6f 20 73 74 6f 72 65 20 61 6e 64 0a 20 2a 20 66 61 73 74 65 72 20 74 6f 20 72 75 6e ┆er to store and * faster to run┆ 0x04f200…09e600 2e 20 20 42 61 63 6b 73 6c 61 73 68 65 64 20 63 68 61 72 61 63 74 65 72 73 20 61 72 65 20 65 78 ┆. Backslashed characters are ex┆ 0x04f200…09e600 63 65 70 74 69 6f 6e 73 2c 20 65 61 63 68 20 62 65 63 6f 6d 69 6e 67 20 61 0a 20 2a 20 73 65 70 ┆ceptions, each becoming a * sep┆ 0x04f200…09e600 61 72 61 74 65 20 6e 6f 64 65 3b 20 74 68 65 20 63 6f 64 65 20 69 73 20 73 69 6d 70 6c 65 72 20 ┆arate node; the code is simpler ┆ 0x04f200…09e600 74 68 61 74 20 77 61 79 20 61 6e 64 20 69 74 27 73 20 6e 6f 74 20 77 6f 72 74 68 20 66 69 78 69 ┆that way and it's not worth fixi┆ 0x04f200…09e600 6e 67 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 0a 72 65 67 61 74 6f 6d 28 66 6c ┆ng. */ static char * regatom(fl┆ 0x04f200…09e600 61 67 70 29 0a 69 6e 74 20 2a 66 6c 61 67 70 3b 0a 7b 0a 20 20 20 20 72 65 67 69 73 74 65 72 20 ┆agp) int *flagp; { register ┆ 0x04f200…09e600 63 68 61 72 20 2a 72 65 74 3b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73 3b 0a 0a 20 20 20 20 2a ┆char *ret; int flags; *┆ 0x04f200…09e600 66 6c 61 67 70 20 3d 20 57 4f 52 53 54 3b 09 09 2f 2a 20 54 65 6e 74 61 74 69 76 65 6c 79 2e 20 ┆flagp = WORST; /* Tentatively. ┆ 0x04f200…09e600 2a 2f 0a 0a 20 20 20 20 73 77 69 74 63 68 20 28 2a 72 65 67 70 61 72 73 65 2b 2b 29 20 7b 0a 20 ┆*/ switch (*regparse++) { ┆ 0x04f200…09e600 20 20 20 63 61 73 65 20 27 5e 27 3a 0a 09 72 65 74 20 3d 20 72 65 67 6e 6f 64 65 28 42 4f 4c 29 ┆ case '^': ret = regnode(BOL)┆ 0x04f200…09e600 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 27 24 27 3a 0a 09 72 65 74 20 3d 20 72 ┆; break; case '$': ret = r┆ 0x04f200…09e600 65 67 6e 6f 64 65 28 45 4f 4c 29 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 27 2e ┆egnode(EOL); break; case '.┆ 0x04f200…09e600 27 3a 0a 09 72 65 74 20 3d 20 72 65 67 6e 6f 64 65 28 41 4e 59 29 3b 0a 09 2a 66 6c 61 67 70 20 ┆': ret = regnode(ANY); *flagp ┆ 0x04f200…09e600 7c 3d 20 48 41 53 57 49 44 54 48 7c 53 49 4d 50 4c 45 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 ┆|= HASWIDTH|SIMPLE; break; ┆ 0x04f200…09e600 63 61 73 65 20 27 5b 27 3a 20 7b 0a 09 72 65 67 69 73 74 65 72 20 69 6e 74 20 63 6c 61 73 73 3b ┆case '[': { register int class;┆ 0x04f200…09e600 0a 09 72 65 67 69 73 74 65 72 20 69 6e 74 20 63 6c 61 73 73 65 6e 64 3b 0a 0a 09 69 66 20 28 2a ┆ register int classend; if (*┆ 0x04f200…09e600 72 65 67 70 61 72 73 65 20 3d 3d 20 27 5e 27 29 20 7b 09 2f 2a 20 43 6f 6d 70 6c 65 6d 65 6e 74 ┆regparse == '^') { /* Complement┆ 0x04f200…09e600 20 6f 66 20 72 61 6e 67 65 2e 20 2a 2f 0a 09 20 20 20 20 72 65 74 20 3d 20 72 65 67 6e 6f 64 65 ┆ of range. */ ret = regnode┆ 0x04f200…09e600 28 41 4e 59 42 55 54 29 3b 0a 09 20 20 20 20 72 65 67 70 61 72 73 65 2b 2b 3b 0a 09 7d 20 65 6c ┆(ANYBUT); regparse++; } el┆ 0x04f200…09e600 73 65 0a 09 20 20 20 20 72 65 74 20 3d 20 72 65 67 6e 6f 64 65 28 41 4e 59 4f 46 29 3b 0a 09 69 ┆se ret = regnode(ANYOF); i┆ 0x04f200…09e600 66 20 28 2a 72 65 67 70 61 72 73 65 20 3d 3d 20 27 5d 27 20 7c 7c 20 2a 72 65 67 70 61 72 73 65 ┆f (*regparse == ']' || *regparse┆ 0x04f200…09e600 20 3d 3d 20 27 2d 27 29 0a 09 20 20 20 20 72 65 67 63 28 2a 72 65 67 70 61 72 73 65 2b 2b 29 3b ┆ == '-') regc(*regparse++);┆ 0x04f200…09e600 0a 09 77 68 69 6c 65 20 28 2a 72 65 67 70 61 72 73 65 20 21 3d 20 27 5c 30 27 20 26 26 20 2a 72 ┆ while (*regparse != '\0' && *r┆ 0x04f200…09e600 65 67 70 61 72 73 65 20 21 3d 20 27 5d 27 29 20 7b 0a 09 20 20 20 20 69 66 20 28 2a 72 65 67 70 ┆egparse != ']') { if (*regp┆ 0x04f200…09e600 61 72 73 65 20 3d 3d 20 27 2d 27 29 20 7b 0a 09 09 72 65 67 70 61 72 73 65 2b 2b 3b 0a 09 09 69 ┆arse == '-') { regparse++; i┆ 0x04f200…09e600 66 20 28 2a 72 65 67 70 61 72 73 65 20 3d 3d 20 27 5d 27 20 7c 7c 20 2a 72 65 67 70 61 72 73 65 ┆f (*regparse == ']' || *regparse┆ 0x04f200…09e600 20 3d 3d 20 27 5c 30 27 29 0a 09 09 20 20 20 20 72 65 67 63 28 27 2d 27 29 3b 0a 09 09 65 6c 73 ┆ == '\0') regc('-'); els┆ 0x04f200…09e600 65 20 7b 0a 09 09 20 20 20 20 63 6c 61 73 73 20 3d 20 55 43 48 41 52 41 54 28 72 65 67 70 61 72 ┆e { class = UCHARAT(regpar┆ 0x04f200…09e600 73 65 2d 32 29 2b 31 3b 0a 09 09 20 20 20 20 63 6c 61 73 73 65 6e 64 20 3d 20 55 43 48 41 52 41 ┆se-2)+1; classend = UCHARA┆ 0x04f200…09e600 54 28 72 65 67 70 61 72 73 65 29 3b 0a 09 09 20 20 20 20 69 66 20 28 63 6c 61 73 73 20 3e 20 63 ┆T(regparse); if (class > c┆ 0x04f200…09e600 6c 61 73 73 65 6e 64 2b 31 29 0a 09 09 09 41 42 4f 52 54 28 22 69 6e 76 61 6c 69 64 20 5b 5d 20 ┆lassend+1) ABORT("invalid [] ┆ 0x04f200…09e600 72 61 6e 67 65 22 29 3b 0a 09 09 20 20 20 20 66 6f 72 20 28 3b 20 63 6c 61 73 73 20 3c 3d 20 63 ┆range"); for (; class <= c┆ 0x04f200…09e600 6c 61 73 73 65 6e 64 3b 20 63 6c 61 73 73 2b 2b 29 0a 09 09 09 72 65 67 63 28 63 6c 61 73 73 29 ┆lassend; class++) regc(class)┆ 0x04f200…09e600 3b 0a 09 09 20 20 20 20 72 65 67 70 61 72 73 65 2b 2b 3b 0a 09 09 7d 0a 09 20 20 20 20 7d 20 65 ┆; regparse++; } } e┆ 0x04f200…09e600 6c 73 65 0a 09 09 72 65 67 63 28 2a 72 65 67 70 61 72 73 65 2b 2b 29 3b 0a 09 7d 0a 09 72 65 67 ┆lse regc(*regparse++); } reg┆ 0x04f200…09e600 63 28 27 5c 30 27 29 3b 0a 09 69 66 20 28 2a 72 65 67 70 61 72 73 65 20 21 3d 20 27 5d 27 29 0a ┆c('\0'); if (*regparse != ']') ┆ 0x04f200…09e600 09 20 20 20 20 41 42 4f 52 54 28 22 75 6e 6d 61 74 63 68 65 64 20 5b 5d 22 29 3b 0a 09 72 65 67 ┆ ABORT("unmatched []"); reg┆ 0x04f200…09e600 70 61 72 73 65 2b 2b 3b 0a 09 2a 66 6c 61 67 70 20 7c 3d 20 48 41 53 57 49 44 54 48 7c 53 49 4d ┆parse++; *flagp |= HASWIDTH|SIM┆ 0x04f200…09e600 50 4c 45 3b 0a 09 7d 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 27 28 27 3a 0a 09 72 ┆PLE; } break; case '(': r┆ 0x04f200…09e600 65 74 20 3d 20 72 65 67 28 31 2c 20 26 66 6c 61 67 73 29 3b 0a 09 69 66 20 28 72 65 74 20 3d 3d ┆et = reg(1, &flags); if (ret ==┆ 0x04f200…09e600 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 0a 09 20 20 20 20 72 65 74 75 72 6e 28 28 63 68 61 72 ┆ (char *)NULL) return((char┆ 0x04f200…09e600 20 2a 29 4e 55 4c 4c 29 3b 0a 09 2a 66 6c 61 67 70 20 7c 3d 20 66 6c 61 67 73 26 28 48 41 53 57 ┆ *)NULL); *flagp |= flags&(HASW┆ 0x04f200…09e600 49 44 54 48 7c 53 50 53 54 41 52 54 29 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 ┆IDTH|SPSTART); break; case ┆ 0x04f200…09e600 27 5c 30 27 3a 0a 20 20 20 20 63 61 73 65 20 27 7c 27 3a 0a 20 20 20 20 63 61 73 65 20 27 29 27 ┆'\0': case '|': case ')'┆ 0x04f200…09e600 3a 0a 09 41 42 4f 52 54 28 22 69 6e 74 65 72 6e 61 6c 20 75 72 70 22 29 3b 09 2f 2a 20 53 75 70 ┆: ABORT("internal urp"); /* Sup┆ 0x04f200…09e600 70 6f 73 65 64 20 74 6f 20 62 65 20 63 61 75 67 68 74 20 65 61 72 6c 69 65 72 2e 20 2a 2f 0a 2f ┆posed to be caught earlier. */ /┆ 0x04f200…09e600 2a 09 62 72 65 61 6b 3b 09 09 09 2a 2f 0a 20 20 20 20 63 61 73 65 20 27 3f 27 3a 0a 20 20 20 20 ┆* break; */ case '?': ┆ 0x04f200…09e600 63 61 73 65 20 27 2b 27 3a 0a 20 20 20 20 63 61 73 65 20 27 2a 27 3a 0a 09 41 42 4f 52 54 28 22 ┆case '+': case '*': ABORT("┆ 0x04f200…09e600 3f 2b 2a 20 66 6f 6c 6c 6f 77 73 20 6e 6f 74 68 69 6e 67 22 29 3b 0a 2f 2a 09 62 72 65 61 6b 3b ┆?+* follows nothing"); /* break;┆ 0x04f200…09e600 09 09 09 2a 2f 0a 20 20 20 20 63 61 73 65 20 27 5c 5c 27 3a 0a 09 69 66 20 28 2a 72 65 67 70 61 ┆ */ case '\\': if (*regpa┆ 0x04f200…09e600 72 73 65 20 3d 3d 20 27 5c 30 27 29 0a 09 20 20 20 20 41 42 4f 52 54 28 22 74 72 61 69 6c 69 6e ┆rse == '\0') ABORT("trailin┆ 0x04f200…09e600 67 20 5c 5c 22 29 3b 0a 09 72 65 74 20 3d 20 72 65 67 6e 6f 64 65 28 45 58 41 43 54 4c 59 29 3b ┆g \\"); ret = regnode(EXACTLY);┆ 0x04f200…09e600 0a 09 72 65 67 63 28 2a 72 65 67 70 61 72 73 65 2b 2b 29 3b 0a 09 72 65 67 63 28 27 5c 30 27 29 ┆ regc(*regparse++); regc('\0')┆ 0x04f200…09e600 3b 0a 09 2a 66 6c 61 67 70 20 7c 3d 20 48 41 53 57 49 44 54 48 7c 53 49 4d 50 4c 45 3b 0a 09 62 ┆; *flagp |= HASWIDTH|SIMPLE; b┆ 0x04f200…09e600 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 09 72 65 67 69 73 74 65 72 20 69 ┆reak; default: { register i┆ 0x04f200…09e600 6e 74 20 6c 65 6e 3b 0a 09 72 65 67 69 73 74 65 72 20 63 68 61 72 20 65 6e 64 65 72 3b 0a 0a 09 ┆nt len; register char ender; ┆ 0x04f200…09e600 72 65 67 70 61 72 73 65 2d 2d 3b 0a 09 6c 65 6e 20 3d 20 73 74 72 63 73 70 6e 28 72 65 67 70 61 ┆regparse--; len = strcspn(regpa┆ 0x04f200…09e600 72 73 65 2c 20 4d 45 54 41 29 3b 0a 09 69 66 20 28 6c 65 6e 20 3c 3d 20 30 29 0a 09 20 20 20 20 ┆rse, META); if (len <= 0) ┆ 0x04f200…09e600 41 42 4f 52 54 28 22 69 6e 74 65 72 6e 61 6c 20 64 69 73 61 73 74 65 72 22 29 3b 0a 09 65 6e 64 ┆ABORT("internal disaster"); end┆ 0x04f200…09e600 65 72 20 3d 20 2a 28 72 65 67 70 61 72 73 65 2b 6c 65 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 20 3e ┆er = *(regparse+len); if (len >┆ 0x04f200…09e600 20 31 20 26 26 20 49 53 4d 55 4c 54 28 65 6e 64 65 72 29 29 0a 09 20 20 20 20 6c 65 6e 2d 2d 3b ┆ 1 && ISMULT(ender)) len--;┆ 0x04f200…09e600 09 09 2f 2a 20 42 61 63 6b 20 6f 66 66 20 63 6c 65 61 72 20 6f 66 20 3f 2b 2a 20 6f 70 65 72 61 ┆ /* Back off clear of ?+* opera┆ 0x04f200…09e600 6e 64 2e 20 2a 2f 0a 09 2a 66 6c 61 67 70 20 7c 3d 20 48 41 53 57 49 44 54 48 3b 0a 09 69 66 20 ┆nd. */ *flagp |= HASWIDTH; if ┆ 0x04f200…09e600 28 6c 65 6e 20 3d 3d 20 31 29 0a 09 20 20 20 20 2a 66 6c 61 67 70 20 7c 3d 20 53 49 4d 50 4c 45 ┆(len == 1) *flagp |= SIMPLE┆ 0x04f200…09e600 3b 0a 09 72 65 74 20 3d 20 72 65 67 6e 6f 64 65 28 45 58 41 43 54 4c 59 29 3b 0a 09 77 68 69 6c ┆; ret = regnode(EXACTLY); whil┆ 0x04f200…09e600 65 20 28 6c 65 6e 20 3e 20 30 29 20 7b 0a 09 20 20 20 20 72 65 67 63 28 2a 72 65 67 70 61 72 73 ┆e (len > 0) { regc(*regpars┆ 0x04f200…09e600 65 2b 2b 29 3b 0a 09 20 20 20 20 6c 65 6e 2d 2d 3b 0a 09 7d 0a 09 72 65 67 63 28 27 5c 30 27 29 ┆e++); len--; } regc('\0')┆ 0x04f200…09e600 3b 0a 09 7d 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 65 74 75 72 6e 28 72 ┆; } break; } return(r┆ 0x04f200…09e600 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2d 20 72 65 67 6e 6f 64 65 20 2d 20 65 6d 69 74 20 61 20 6e ┆et); } /* - regnode - emit a n┆ 0x04f200…09e600 6f 64 65 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 09 09 09 2f 2a 20 4c 6f 63 61 74 ┆ode */ static char * /* Locat┆ 0x04f200…09e600 69 6f 6e 2e 20 2a 2f 0a 72 65 67 6e 6f 64 65 28 6f 70 29 0a 63 68 61 72 20 6f 70 3b 0a 7b 0a 20 ┆ion. */ regnode(op) char op; { ┆ 0x04f200…09e600 20 20 20 72 65 67 69 73 74 65 72 20 63 68 61 72 20 2a 72 65 74 3b 0a 20 20 20 20 72 65 67 69 73 ┆ register char *ret; regis┆ 0x04f200…09e600 74 65 72 20 63 68 61 72 20 2a 70 74 72 3b 0a 0a 20 20 20 20 72 65 74 20 3d 20 72 65 67 63 6f 64 ┆ter char *ptr; ret = regcod┆ 0x04f200…09e600 65 3b 0a 20 20 20 20 69 66 20 28 72 65 74 20 3d 3d 20 26 72 65 67 64 75 6d 6d 79 29 20 7b 0a 09 ┆e; if (ret == ®dummy) { ┆ 0x04f200…09e600 72 65 67 73 69 7a 65 20 2b 3d 20 33 3b 0a 09 72 65 74 75 72 6e 28 72 65 74 29 3b 0a 20 20 20 20 ┆regsize += 3; return(ret); ┆ 0x04f200…09e600 7d 0a 0a 20 20 20 20 70 74 72 20 3d 20 72 65 74 3b 0a 20 20 20 20 2a 70 74 72 2b 2b 20 3d 20 6f ┆} ptr = ret; *ptr++ = o┆ 0x04f200…09e600 70 3b 0a 20 20 20 20 2a 70 74 72 2b 2b 20 3d 20 27 5c 30 27 3b 09 09 2f 2a 20 4e 75 6c 6c 20 22 ┆p; *ptr++ = '\0'; /* Null "┆ 0x04f200…09e600 6e 65 78 74 22 20 70 6f 69 6e 74 65 72 2e 20 2a 2f 0a 20 20 20 20 2a 70 74 72 2b 2b 20 3d 20 27 ┆next" pointer. */ *ptr++ = '┆ 0x04f200…09e600 5c 30 27 3b 0a 20 20 20 20 72 65 67 63 6f 64 65 20 3d 20 70 74 72 3b 0a 0a 20 20 20 20 72 65 74 ┆\0'; regcode = ptr; ret┆ 0x04f200…09e600 75 72 6e 28 72 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2d 20 72 65 67 63 20 2d 20 65 6d 69 74 20 28 ┆urn(ret); } /* - regc - emit (┆ 0x04f200…09e600 69 66 20 61 70 70 72 6f 70 72 69 61 74 65 29 20 61 20 62 79 74 65 20 6f 66 20 63 6f 64 65 0a 20 ┆if appropriate) a byte of code ┆ 0x04f200…09e600 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 72 65 67 63 28 62 29 0a 63 68 61 72 20 62 3b 0a 7b ┆*/ static void regc(b) char b; {┆ 0x04f200…09e600 0a 20 20 20 20 69 66 20 28 72 65 67 63 6f 64 65 20 21 3d 20 26 72 65 67 64 75 6d 6d 79 29 0a 09 ┆ if (regcode != ®dummy) ┆ 0x04f200…09e600 2a 72 65 67 63 6f 64 65 2b 2b 20 3d 20 62 3b 0a 20 20 20 20 65 6c 73 65 0a 09 72 65 67 73 69 7a ┆*regcode++ = b; else regsiz┆ 0x04f200…09e600 65 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 20 2d 20 72 65 67 69 6e 73 65 72 74 20 2d 20 69 6e 73 65 72 74 ┆e++; } /* - reginsert - insert┆ 0x04f200…09e600 20 61 6e 20 6f 70 65 72 61 74 6f 72 20 69 6e 20 66 72 6f 6e 74 20 6f 66 20 61 6c 72 65 61 64 79 ┆ an operator in front of already┆ 0x04f200…09e600 2d 65 6d 69 74 74 65 64 20 6f 70 65 72 61 6e 64 0a 20 2a 0a 20 2a 20 4d 65 61 6e 73 20 72 65 6c ┆-emitted operand * * Means rel┆ 0x04f200…09e600 6f 63 61 74 69 6e 67 20 74 68 65 20 6f 70 65 72 61 6e 64 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 ┆ocating the operand. */ static ┆ 0x04f200…09e600 76 6f 69 64 0a 72 65 67 69 6e 73 65 72 74 28 6f 70 2c 20 6f 70 6e 64 29 0a 63 68 61 72 20 6f 70 ┆void reginsert(op, opnd) char op┆ 0x04f200…09e600 3b 0a 63 68 61 72 20 2a 6f 70 6e 64 3b 0a 7b 0a 20 20 20 20 72 65 67 69 73 74 65 72 20 63 68 61 ┆; char *opnd; { register cha┆ 0x04f200…09e600 72 20 2a 73 72 63 3b 0a 20 20 20 20 72 65 67 69 73 74 65 72 20 63 68 61 72 20 2a 64 73 74 3b 0a ┆r *src; register char *dst; ┆ 0x04f200…09e600 20 20 20 20 72 65 67 69 73 74 65 72 20 63 68 61 72 20 2a 70 6c 61 63 65 3b 0a 0a 20 20 20 20 69 ┆ register char *place; i┆ 0x04f200…09e600 66 20 28 72 65 67 63 6f 64 65 20 3d 3d 20 26 72 65 67 64 75 6d 6d 79 29 20 7b 0a 09 72 65 67 73 ┆f (regcode == ®dummy) { regs┆ 0x04f200…09e600 69 7a 65 20 2b 3d 20 33 3b 0a 09 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 72 ┆ize += 3; return; } sr┆ 0x04f200…09e600 63 20 3d 20 72 65 67 63 6f 64 65 3b 0a 20 20 20 20 72 65 67 63 6f 64 65 20 2b 3d 20 33 3b 0a 20 ┆c = regcode; regcode += 3; ┆ 0x04f200…09e600 20 20 20 64 73 74 20 3d 20 72 65 67 63 6f 64 65 3b 0a 20 20 20 20 77 68 69 6c 65 20 28 73 72 63 ┆ dst = regcode; while (src┆ 0x04f200…09e600 20 3e 20 6f 70 6e 64 29 0a 09 2a 2d 2d 64 73 74 20 3d 20 2a 2d 2d 73 72 63 3b 0a 0a 20 20 20 20 ┆ > opnd) *--dst = *--src; ┆ 0x04f200…09e600 70 6c 61 63 65 20 3d 20 6f 70 6e 64 3b 09 09 2f 2a 20 4f 70 20 6e 6f 64 65 2c 20 77 68 65 72 65 ┆place = opnd; /* Op node, where┆ 0x04f200…09e600 20 6f 70 65 72 61 6e 64 20 75 73 65 64 20 74 6f 20 62 65 2e 20 2a 2f 0a 20 20 20 20 2a 70 6c 61 ┆ operand used to be. */ *pla┆ 0x04f200…09e600 63 65 2b 2b 20 3d 20 6f 70 3b 0a 20 20 20 20 2a 70 6c 61 63 65 2b 2b 20 3d 20 27 5c 30 27 3b 0a ┆ce++ = op; *place++ = '\0'; ┆ 0x04f200…09e600 20 20 20 20 2a 70 6c 61 63 65 2b 2b 20 3d 20 27 5c 30 27 3b 0a 7d 0a 0a 2f 2a 0a 20 2d 20 72 65 ┆ *place++ = '\0'; } /* - re┆ 0x04f200…09e600 67 74 61 69 6c 20 2d 20 73 65 74 20 74 68 65 20 6e 65 78 74 2d 70 6f 69 6e 74 65 72 20 61 74 20 ┆gtail - set the next-pointer at ┆ 0x04f200…09e600 74 68 65 20 65 6e 64 20 6f 66 20 61 20 6e 6f 64 65 20 63 68 61 69 6e 0a 20 2a 2f 0a 73 74 61 74 ┆the end of a node chain */ stat┆ 0x04f200…09e600 69 63 20 76 6f 69 64 0a 72 65 67 74 61 69 6c 28 70 2c 20 76 61 6c 29 0a 63 68 61 72 20 2a 70 3b ┆ic void regtail(p, val) char *p;┆ 0x04f200…09e600 0a 63 68 61 72 20 2a 76 61 6c 3b 0a 7b 0a 20 20 20 20 72 65 67 69 73 74 65 72 20 63 68 61 72 20 ┆ char *val; { register char ┆ 0x04f200…09e600 2a 73 63 61 6e 3b 0a 20 20 20 20 72 65 67 69 73 74 65 72 20 63 68 61 72 20 2a 74 65 6d 70 3b 0a ┆*scan; register char *temp; ┆ 0x04f200…09e600 20 20 20 20 72 65 67 69 73 74 65 72 20 69 6e 74 20 6f 66 66 73 65 74 3b 0a 0a 20 20 20 20 69 66 ┆ register int offset; if┆ 0x04f200…09e600 20 28 70 20 3d 3d 20 26 72 65 67 64 75 6d 6d 79 29 0a 09 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20 ┆ (p == ®dummy) return; ┆ 0x04f200…09e600 2f 2a 20 46 69 6e 64 20 6c 61 73 74 20 6e 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 73 63 61 6e 20 3d ┆/* Find last node. */ scan =┆ 0x04f200…09e600 20 70 3b 0a 20 20 20 20 66 6f 72 20 28 3b 3b 29 20 7b 0a 09 74 65 6d 70 20 3d 20 72 65 67 6e 65 ┆ p; for (;;) { temp = regne┆ 0x04f200…09e600 78 74 28 73 63 61 6e 29 3b 0a 09 69 66 20 28 74 65 6d 70 20 3d 3d 20 28 63 68 61 72 20 2a 29 4e ┆xt(scan); if (temp == (char *)N┆ 0x04f200…09e600 55 4c 4c 29 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 73 63 61 6e 20 3d 20 74 65 6d 70 3b 0a 20 ┆ULL) break; scan = temp; ┆ 0x04f200…09e600 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 4f 50 28 73 63 61 6e 29 20 3d 3d 20 42 41 43 4b 29 0a ┆ } if (OP(scan) == BACK) ┆ 0x04f200…09e600 09 6f 66 66 73 65 74 20 3d 20 73 63 61 6e 20 2d 20 76 61 6c 3b 0a 20 20 20 20 65 6c 73 65 0a 09 ┆ offset = scan - val; else ┆ 0x04f200…09e600 6f 66 66 73 65 74 20 3d 20 76 61 6c 20 2d 20 73 63 61 6e 3b 0a 20 20 20 20 2a 28 73 63 61 6e 2b ┆offset = val - scan; *(scan+┆ 0x04f200…09e600 31 29 20 3d 20 28 6f 66 66 73 65 74 3e 3e 38 29 26 30 33 37 37 3b 0a 20 20 20 20 2a 28 73 63 61 ┆1) = (offset>>8)&0377; *(sca┆ 0x04f200…09e600 6e 2b 32 29 20 3d 20 6f 66 66 73 65 74 26 30 33 37 37 3b 0a 7d 0a 0a 2f 2a 0a 20 2d 20 72 65 67 ┆n+2) = offset&0377; } /* - reg┆ 0x04f200…09e600 6f 70 74 61 69 6c 20 2d 20 72 65 67 74 61 69 6c 20 6f 6e 20 6f 70 65 72 61 6e 64 20 6f 66 20 66 ┆optail - regtail on operand of f┆ 0x04f200…09e600 69 72 73 74 20 61 72 67 75 6d 65 6e 74 3b 20 6e 6f 70 20 69 66 20 6f 70 65 72 61 6e 64 6c 65 73 ┆irst argument; nop if operandles┆ 0x04f200…09e600 73 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 72 65 67 6f 70 74 61 69 6c 28 70 2c 20 76 ┆s */ static void regoptail(p, v┆ 0x04f200…09e600 61 6c 29 0a 63 68 61 72 20 2a 70 3b 0a 63 68 61 72 20 2a 76 61 6c 3b 0a 7b 0a 20 20 20 20 2f 2a ┆al) char *p; char *val; { /*┆ 0x04f200…09e600 20 22 4f 70 65 72 61 6e 64 6c 65 73 73 22 20 61 6e 64 20 22 6f 70 20 21 3d 20 42 52 41 4e 43 48 ┆ "Operandless" and "op != BRANCH┆ 0x04f200…09e600 22 20 61 72 65 20 73 79 6e 6f 6e 79 6d 6f 75 73 20 69 6e 20 70 72 61 63 74 69 63 65 2e 20 2a 2f ┆" are synonymous in practice. */┆ 0x04f200…09e600 0a 20 20 20 20 69 66 20 28 70 20 3d 3d 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 20 7c 7c 20 70 20 ┆ if (p == (char *)NULL || p ┆ 0x04f200…09e600 3d 3d 20 26 72 65 67 64 75 6d 6d 79 20 7c 7c 20 4f 50 28 70 29 20 21 3d 20 42 52 41 4e 43 48 29 ┆== ®dummy || OP(p) != BRANCH)┆ 0x04f200…09e600 0a 09 72 65 74 75 72 6e 3b 0a 20 20 20 20 72 65 67 74 61 69 6c 28 4f 50 45 52 41 4e 44 28 70 29 ┆ return; regtail(OPERAND(p)┆ 0x04f200…09e600 2c 20 76 61 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 72 65 67 65 78 65 63 20 61 6e 64 20 66 72 69 ┆, val); } /* * regexec and fri┆ 0x04f200…09e600 65 6e 64 73 0a 20 2a 2f 0a 0a 2f 2a 0a 20 2a 20 47 6c 6f 62 61 6c 20 77 6f 72 6b 20 76 61 72 69 ┆ends */ /* * Global work vari┆ 0x04f200…09e600 61 62 6c 65 73 20 66 6f 72 20 72 65 67 65 78 65 63 28 29 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 ┆ables for regexec(). */ static ┆ 0x04f200…09e600 63 68 61 72 20 2a 72 65 67 69 6e 70 75 74 3b 09 09 2f 2a 20 53 74 72 69 6e 67 2d 69 6e 70 75 74 ┆char *reginput; /* String-input┆ 0x04f200…09e600 20 70 6f 69 6e 74 65 72 2e 20 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 72 65 67 62 6f 6c ┆ pointer. */ static char *regbol┆ 0x04f200…09e600 3b 09 09 2f 2a 20 42 65 67 69 6e 6e 69 6e 67 20 6f 66 20 69 6e 70 75 74 2c 20 66 6f 72 20 5e 20 ┆; /* Beginning of input, for ^ ┆ 0x04f200…09e600 63 68 65 63 6b 2e 20 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 2a 72 65 67 73 74 61 72 74 ┆check. */ static char **regstart┆ 0x04f200…09e600 70 3b 09 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 74 61 72 74 70 20 61 72 72 61 79 2e 20 2a ┆p; /* Pointer to startp array. *┆ 0x04f200…09e600 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 2a 72 65 67 65 6e 64 70 3b 09 09 2f 2a 20 44 69 74 ┆/ static char **regendp; /* Dit┆ 0x04f200…09e600 74 6f 20 66 6f 72 20 65 6e 64 70 2e 20 2a 2f 0a 0a 2f 2a 0a 20 2a 20 46 6f 72 77 61 72 64 73 2e ┆to for endp. */ /* * Forwards.┆ 0x04f200…09e600 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 67 74 72 79 28 29 3b 0a 73 74 61 74 69 63 ┆ */ static int regtry(); static┆ 0x04f200…09e600 20 69 6e 74 20 72 65 67 6d 61 74 63 68 28 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 67 72 ┆ int regmatch(); static int regr┆ 0x04f200…09e600 65 70 65 61 74 28 29 3b 0a 0a 2f 2a 0a 20 2d 20 72 65 67 65 78 65 63 20 2d 20 6d 61 74 63 68 20 ┆epeat(); /* - regexec - match ┆ 0x04f200…09e600 61 20 72 65 67 65 78 70 20 61 67 61 69 6e 73 74 20 61 20 73 74 72 69 6e 67 0a 20 2a 2f 0a 69 6e ┆a regexp against a string */ in┆ 0x04f200…09e600 74 0a 72 65 67 65 78 65 63 28 70 72 6f 67 2c 20 73 74 72 69 6e 67 29 0a 72 65 67 69 73 74 65 72 ┆t regexec(prog, string) register┆ 0x04f200…09e600 20 72 65 67 65 78 70 20 2a 70 72 6f 67 3b 0a 72 65 67 69 73 74 65 72 20 63 68 61 72 20 2a 73 74 ┆ regexp *prog; register char *st┆ 0x04f200…09e600 72 69 6e 67 3b 0a 7b 0a 20 20 20 20 72 65 67 69 73 74 65 72 20 63 68 61 72 20 2a 73 3b 0a 20 20 ┆ring; { register char *s; ┆ 0x04f200…09e600 20 20 65 78 74 65 72 6e 20 63 68 61 72 20 2a 73 74 72 63 68 72 28 29 3b 0a 0a 20 20 20 20 2f 2a ┆ extern char *strchr(); /*┆ 0x04f200…09e600 20 42 65 20 70 61 72 61 6e 6f 69 64 2e 2e 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 72 6f 67 20 ┆ Be paranoid... */ if (prog ┆ 0x04f200…09e600 3d 3d 20 28 72 65 67 65 78 70 20 2a 29 4e 55 4c 4c 20 7c 7c 20 73 74 72 69 6e 67 20 3d 3d 20 28 ┆== (regexp *)NULL || string == (┆ 0x04f200…09e600 63 68 61 72 20 2a 29 4e 55 4c 4c 29 20 7b 0a 09 78 65 72 72 6f 72 28 22 72 65 67 75 6c 61 72 20 ┆char *)NULL) { xerror("regular ┆ 0x04f200…09e600 65 78 70 72 65 73 73 69 6f 6e 20 62 6f 74 63 68 2c 20 4e 55 4c 4c 20 70 61 72 61 6d 65 74 65 72 ┆expression botch, NULL parameter┆ 0x04f200…09e600 22 29 3b 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 ┆"); return(0); } /* Ch┆ 0x04f200…09e600 65 63 6b 20 76 61 6c 69 64 69 74 79 20 6f 66 20 70 72 6f 67 72 61 6d 2e 20 2a 2f 0a 20 20 20 20 ┆eck validity of program. */ ┆ 0x04f200…09e600 69 66 20 28 55 43 48 41 52 41 54 28 70 72 6f 67 2d 3e 70 72 6f 67 72 61 6d 29 20 21 3d 20 4d 41 ┆if (UCHARAT(prog->program) != MA┆ 0x04f200…09e600 47 49 43 29 20 7b 0a 09 78 65 72 72 6f 72 28 22 72 65 67 75 6c 61 72 20 65 78 70 72 65 73 73 69 ┆GIC) { xerror("regular expressi┆ 0x04f200…09e600 6f 6e 20 62 6f 74 63 68 2c 20 63 6f 72 72 75 70 74 65 64 20 70 72 6f 67 72 61 6d 22 29 3b 0a 09 ┆on botch, corrupted program"); ┆ 0x04f200…09e600 72 65 74 75 72 6e 28 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 ┆return(0); } /* If ther┆ 0x04f200…09e600 65 20 69 73 20 61 20 22 6d 75 73 74 20 61 70 70 65 61 72 22 20 73 74 72 69 6e 67 2c 20 6c 6f 6f ┆e is a "must appear" string, loo┆ 0x04f200…09e600 6b 20 66 6f 72 20 69 74 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 72 6f 67 2d 3e 72 65 67 6d 75 ┆k for it. */ if (prog->regmu┆ 0x04f200…09e600 73 74 20 21 3d 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 20 7b 0a 09 73 20 3d 20 73 74 72 69 6e ┆st != (char *)NULL) { s = strin┆ 0x04f200…09e600 67 3b 0a 09 77 68 69 6c 65 20 28 28 73 20 3d 20 73 74 72 63 68 72 28 73 2c 20 70 72 6f 67 2d 3e ┆g; while ((s = strchr(s, prog->┆ 0x04f200…09e600 72 65 67 6d 75 73 74 5b 30 5d 29 29 20 21 3d 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 20 7b 0a ┆regmust[0])) != (char *)NULL) { ┆ 0x04f200…09e600 09 20 20 20 20 69 66 20 28 73 74 72 6e 63 6d 70 28 73 2c 20 70 72 6f 67 2d 3e 72 65 67 6d 75 73 ┆ if (strncmp(s, prog->regmus┆ 0x04f200…09e600 74 2c 20 70 72 6f 67 2d 3e 72 65 67 6d 6c 65 6e 29 20 3d 3d 20 30 29 0a 09 09 62 72 65 61 6b 3b ┆t, prog->regmlen) == 0) break;┆ 0x04f200…09e600 09 2f 2a 20 46 6f 75 6e 64 20 69 74 2e 20 2a 2f 0a 09 20 20 20 20 73 2b 2b 3b 0a 09 7d 0a 09 69 ┆ /* Found it. */ s++; } i┆ 0x04f200…09e600 66 20 28 73 20 3d 3d 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 09 2f 2a 20 4e 6f 74 20 70 72 65 ┆f (s == (char *)NULL) /* Not pre┆ 0x04f200…09e600 73 65 6e 74 2e 20 2a 2f 0a 09 20 20 20 20 72 65 74 75 72 6e 28 30 29 3b 0a 20 20 20 20 7d 0a 0a ┆sent. */ return(0); } ┆ 0x04f200…09e600 20 20 20 20 2f 2a 20 4d 61 72 6b 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 6c 69 6e 65 20 66 6f ┆ /* Mark beginning of line fo┆ 0x04f200…09e600 72 20 5e 20 2e 20 2a 2f 0a 20 20 20 20 72 65 67 62 6f 6c 20 3d 20 73 74 72 69 6e 67 3b 0a 0a 20 ┆r ^ . */ regbol = string; ┆ 0x04f200…09e600 20 20 20 2f 2a 20 53 69 6d 70 6c 65 73 74 20 63 61 73 65 3a 20 20 61 6e 63 68 6f 72 65 64 20 6d ┆ /* Simplest case: anchored m┆ 0x04f200…09e600 61 74 63 68 20 6e 65 65 64 20 62 65 20 74 72 69 65 64 20 6f 6e 6c 79 20 6f 6e 63 65 2e 20 2a 2f ┆atch need be tried only once. */┆ 0x04f200…09e600 0a 20 20 20 20 69 66 20 28 70 72 6f 67 2d 3e 72 65 67 61 6e 63 68 29 0a 09 72 65 74 75 72 6e 28 ┆ if (prog->reganch) return(┆ 0x04f200…09e600 72 65 67 74 72 79 28 70 72 6f 67 2c 20 73 74 72 69 6e 67 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 4d ┆regtry(prog, string)); /* M┆ 0x04f200…09e600 65 73 73 79 20 63 61 73 65 73 3a 20 20 75 6e 61 6e 63 68 6f 72 65 64 20 6d 61 74 63 68 2e 20 2a ┆essy cases: unanchored match. *┆ 0x04f200…09e600 2f 0a 20 20 20 20 73 20 3d 20 73 74 72 69 6e 67 3b 0a 20 20 20 20 69 66 20 28 70 72 6f 67 2d 3e ┆/ s = string; if (prog->┆ 0x04f200…09e600 72 65 67 73 74 61 72 74 20 21 3d 20 27 5c 30 27 29 0a 09 2f 2a 20 57 65 20 6b 6e 6f 77 20 77 68 ┆regstart != '\0') /* We know wh┆ 0x04f200…09e600 61 74 20 63 68 61 72 20 69 74 20 6d 75 73 74 20 73 74 61 72 74 20 77 69 74 68 2e 20 2a 2f 0a 09 ┆at char it must start with. */ ┆ 0x04f200…09e600 77 68 69 6c 65 20 28 28 73 20 3d 20 73 74 72 63 68 72 28 73 2c 20 70 72 6f 67 2d 3e 72 65 67 73 ┆while ((s = strchr(s, prog->regs┆ 0x04f200…09e600 74 61 72 74 29 29 20 21 3d 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 69 ┆tart)) != (char *)NULL) { i┆ 0x04f200…09e600 66 20 28 72 65 67 74 72 79 28 70 72 6f 67 2c 20 73 29 29 0a 09 09 72 65 74 75 72 6e 28 31 29 3b ┆f (regtry(prog, s)) return(1);┆ 0x04f200…09e600 0a 09 20 20 20 20 73 2b 2b 3b 0a 09 7d 0a 20 20 20 20 65 6c 73 65 0a 09 2f 2a 20 57 65 20 64 6f ┆ s++; } else /* We do┆ 0x04f200…09e600 6e 27 74 20 2d 2d 20 67 65 6e 65 72 61 6c 20 63 61 73 65 2e 20 2a 2f 0a 09 64 6f 20 7b 0a 09 20 ┆n't -- general case. */ do { ┆ 0x04f200…09e600 20 20 20 69 66 20 28 72 65 67 74 72 79 28 70 72 6f 67 2c 20 73 29 29 0a 09 09 72 65 74 75 72 6e ┆ if (regtry(prog, s)) return┆ 0x04f200…09e600 28 31 29 3b 0a 09 7d 20 77 68 69 6c 65 20 28 2a 73 2b 2b 20 21 3d 20 27 5c 30 27 29 3b 0a 0a 20 ┆(1); } while (*s++ != '\0'); ┆ 0x04f200…09e600 20 20 20 2f 2a 20 46 61 69 6c 75 72 65 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 28 30 29 3b ┆ /* Failure. */ return(0);┆ 0x04f200…09e600 0a 7d 0a 0a 2f 2a 0a 20 2d 20 72 65 67 74 72 79 20 2d 20 74 72 79 20 6d 61 74 63 68 20 61 74 20 ┆ } /* - regtry - try match at ┆ 0x04f200…09e600 73 70 65 63 69 66 69 63 20 70 6f 69 6e 74 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 09 09 09 ┆specific point */ static int ┆ 0x04f200…09e600 2f 2a 20 30 20 66 61 69 6c 75 72 65 2c 20 31 20 73 75 63 63 65 73 73 20 2a 2f 0a 72 65 67 74 72 ┆/* 0 failure, 1 success */ regtr┆ 0x04f200…09e600 79 28 70 72 6f 67 2c 20 73 74 72 69 6e 67 29 0a 72 65 67 65 78 70 20 2a 70 72 6f 67 3b 0a 63 68 ┆y(prog, string) regexp *prog; ch┆ 0x04f200…09e600 61 72 20 2a 73 74 72 69 6e 67 3b 0a 7b 0a 20 20 20 20 72 65 67 69 73 74 65 72 20 69 6e 74 20 69 ┆ar *string; { register int i┆ 0x04f200…09e600 3b 0a 20 20 20 20 72 65 67 69 73 74 65 72 20 63 68 61 72 20 2a 2a 73 70 3b 0a 20 20 20 20 72 65 ┆; register char **sp; re┆ 0x04f200…09e600 67 69 73 74 65 72 20 63 68 61 72 20 2a 2a 65 70 3b 0a 0a 20 20 20 20 72 65 67 69 6e 70 75 74 20 ┆gister char **ep; reginput ┆ 0x04f200…09e600 3d 20 73 74 72 69 6e 67 3b 0a 20 20 20 20 72 65 67 73 74 61 72 74 70 20 3d 20 70 72 6f 67 2d 3e ┆= string; regstartp = prog->┆ 0x04f200…09e600 73 74 61 72 74 70 3b 0a 20 20 20 20 72 65 67 65 6e 64 70 20 3d 20 70 72 6f 67 2d 3e 65 6e 64 70 ┆startp; regendp = prog->endp┆ 0x04f200…09e600 3b 0a 0a 20 20 20 20 73 70 20 3d 20 70 72 6f 67 2d 3e 73 74 61 72 74 70 3b 0a 20 20 20 20 65 70 ┆; sp = prog->startp; ep┆ 0x04f200…09e600 20 3d 20 70 72 6f 67 2d 3e 65 6e 64 70 3b 0a 20 20 20 20 66 6f 72 20 28 69 20 3d 20 4e 53 55 42 ┆ = prog->endp; for (i = NSUB┆ 0x04f200…09e600 45 58 50 3b 20 69 20 3e 20 30 3b 20 69 2d 2d 29 20 7b 0a 09 2a 73 70 2b 2b 20 3d 20 28 63 68 61 ┆EXP; i > 0; i--) { *sp++ = (cha┆ 0x04f200…09e600 72 20 2a 29 4e 55 4c 4c 3b 0a 09 2a 65 70 2b 2b 20 3d 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 3b ┆r *)NULL; *ep++ = (char *)NULL;┆ 0x04f200…09e600 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 72 65 67 6d 61 74 63 68 28 70 72 6f 67 2d 3e 70 72 ┆ } if (regmatch(prog->pr┆ 0x04f200…09e600 6f 67 72 61 6d 20 2b 20 31 29 29 20 7b 0a 09 70 72 6f 67 2d 3e 73 74 61 72 74 70 5b 30 5d 20 3d ┆ogram + 1)) { prog->startp[0] =┆ 0x04f200…09e600 20 73 74 72 69 6e 67 3b 0a 09 70 72 6f 67 2d 3e 65 6e 64 70 5b 30 5d 20 3d 20 72 65 67 69 6e 70 ┆ string; prog->endp[0] = reginp┆ 0x04f200…09e600 75 74 3b 0a 09 72 65 74 75 72 6e 28 31 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 0a 09 72 65 74 75 ┆ut; return(1); } else retu┆ 0x04f200…09e600 72 6e 28 30 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2d 20 72 65 67 6d 61 74 63 68 20 2d 20 6d 61 69 6e 20 ┆rn(0); } /* - regmatch - main ┆ 0x04f200…09e600 6d 61 74 63 68 69 6e 67 20 72 6f 75 74 69 6e 65 0a 20 2a 0a 20 2a 20 43 6f 6e 63 65 70 74 75 61 ┆matching routine * * Conceptua┆ 0x04f200…09e600 6c 6c 79 20 74 68 65 20 73 74 72 61 74 65 67 79 20 69 73 20 73 69 6d 70 6c 65 3a 20 20 63 68 65 ┆lly the strategy is simple: che┆ 0x04f200…09e600 63 6b 20 74 6f 20 73 65 65 20 77 68 65 74 68 65 72 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20 2a ┆ck to see whether the current *┆ 0x04f200…09e600 20 6e 6f 64 65 20 6d 61 74 63 68 65 73 2c 20 63 61 6c 6c 20 73 65 6c 66 20 72 65 63 75 72 73 69 ┆ node matches, call self recursi┆ 0x04f200…09e600 76 65 6c 79 20 74 6f 20 73 65 65 20 77 68 65 74 68 65 72 20 74 68 65 20 72 65 73 74 20 6d 61 74 ┆vely to see whether the rest mat┆ 0x04f200…09e600 63 68 65 73 2c 0a 20 2a 20 61 6e 64 20 74 68 65 6e 20 61 63 74 20 61 63 63 6f 72 64 69 6e 67 6c ┆ches, * and then act accordingl┆ 0x04f200…09e600 79 2e 20 20 49 6e 20 70 72 61 63 74 69 63 65 20 77 65 20 6d 61 6b 65 20 73 6f 6d 65 20 65 66 66 ┆y. In practice we make some eff┆ 0x04f200…09e600 6f 72 74 20 74 6f 20 61 76 6f 69 64 0a 20 2a 20 72 65 63 75 72 73 69 6f 6e 2c 20 69 6e 20 70 61 ┆ort to avoid * recursion, in pa┆ 0x04f200…09e600 72 74 69 63 75 6c 61 72 20 62 79 20 67 6f 69 6e 67 20 74 68 72 6f 75 67 68 20 22 6f 72 64 69 6e ┆rticular by going through "ordin┆ 0x04f200…09e600 61 72 79 22 20 6e 6f 64 65 73 20 28 74 68 61 74 20 64 6f 6e 27 74 0a 20 2a 20 6e 65 65 64 20 74 ┆ary" nodes (that don't * need t┆ 0x04f200…09e600 6f 20 6b 6e 6f 77 20 77 68 65 74 68 65 72 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 65 20 6d ┆o know whether the rest of the m┆ 0x04f200…09e600 61 74 63 68 20 66 61 69 6c 65 64 29 20 62 79 20 61 20 6c 6f 6f 70 20 69 6e 73 74 65 61 64 20 6f ┆atch failed) by a loop instead o┆ 0x04f200…09e600 66 0a 20 2a 20 62 79 20 72 65 63 75 72 73 69 6f 6e 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e ┆f * by recursion. */ static in┆ 0x04f200…09e600 74 09 09 09 2f 2a 20 30 20 66 61 69 6c 75 72 65 2c 20 31 20 73 75 63 63 65 73 73 20 2a 2f 0a 72 ┆t /* 0 failure, 1 success */ r┆ 0x04f200…09e600 65 67 6d 61 74 63 68 28 70 72 6f 67 29 0a 63 68 61 72 20 2a 70 72 6f 67 3b 0a 7b 0a 20 20 20 20 ┆egmatch(prog) char *prog; { ┆ 0x04f200…09e600 72 65 67 69 73 74 65 72 20 63 68 61 72 20 2a 73 63 61 6e 3b 09 2f 2a 20 43 75 72 72 65 6e 74 20 ┆register char *scan; /* Current ┆ 0x04f200…09e600 6e 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 6e 65 78 74 3b 09 09 2f 2a 20 4e 65 78 ┆node. */ char *next; /* Nex┆ 0x04f200…09e600 74 20 6e 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 65 78 74 65 72 6e 20 63 68 61 72 20 2a 73 74 72 63 ┆t node. */ extern char *strc┆ 0x04f200…09e600 68 72 28 29 3b 0a 0a 20 20 20 20 73 63 61 6e 20 3d 20 70 72 6f 67 3b 0a 20 20 20 20 77 68 69 6c ┆hr(); scan = prog; whil┆ 0x04f200…09e600 65 20 28 73 63 61 6e 20 21 3d 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 20 7b 0a 09 6e 65 78 74 ┆e (scan != (char *)NULL) { next┆ 0x04f200…09e600 20 3d 20 72 65 67 6e 65 78 74 28 73 63 61 6e 29 3b 0a 0a 09 73 77 69 74 63 68 20 28 4f 50 28 73 ┆ = regnext(scan); switch (OP(s┆ 0x04f200…09e600 63 61 6e 29 29 20 7b 0a 09 63 61 73 65 20 42 4f 4c 3a 0a 09 20 20 20 20 69 66 20 28 72 65 67 69 ┆can)) { case BOL: if (regi┆ 0x04f200…09e600 6e 70 75 74 20 21 3d 20 72 65 67 62 6f 6c 29 0a 09 09 72 65 74 75 72 6e 28 30 29 3b 0a 09 20 20 ┆nput != regbol) return(0); ┆ 0x04f200…09e600 20 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 45 4f 4c 3a 0a 09 20 20 20 20 69 66 20 28 2a 72 65 ┆ break; case EOL: if (*re┆ 0x04f200…09e600 67 69 6e 70 75 74 20 21 3d 20 27 5c 30 27 29 0a 09 09 72 65 74 75 72 6e 28 30 29 3b 0a 09 20 20 ┆ginput != '\0') return(0); ┆ 0x04f200…09e600 20 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 41 4e 59 3a 0a 09 20 20 20 20 69 66 20 28 2a 72 65 ┆ break; case ANY: if (*re┆ 0x04f200…09e600 67 69 6e 70 75 74 20 3d 3d 20 27 5c 30 27 29 0a 09 09 72 65 74 75 72 6e 28 30 29 3b 0a 09 20 20 ┆ginput == '\0') return(0); ┆ 0x04f200…09e600 20 20 72 65 67 69 6e 70 75 74 2b 2b 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 ┆ reginput++; break; case ┆ 0x04f200…09e600 45 58 41 43 54 4c 59 3a 20 7b 0a 09 20 20 20 20 72 65 67 69 73 74 65 72 20 69 6e 74 20 6c 65 6e ┆EXACTLY: { register int len┆ 0x04f200…09e600 3b 0a 09 20 20 20 20 72 65 67 69 73 74 65 72 20 63 68 61 72 20 2a 6f 70 6e 64 3b 0a 0a 09 20 20 ┆; register char *opnd; ┆ 0x04f200…09e600 20 20 6f 70 6e 64 20 3d 20 4f 50 45 52 41 4e 44 28 73 63 61 6e 29 3b 0a 09 20 20 20 20 2f 2a 20 ┆ opnd = OPERAND(scan); /* ┆ 0x04f200…09e600 49 6e 6c 69 6e 65 20 74 68 65 20 66 69 72 73 74 20 63 68 61 72 61 63 74 65 72 2c 20 66 6f 72 20 ┆Inline the first character, for ┆ 0x04f200…09e600 73 70 65 65 64 2e 20 2a 2f 0a 09 20 20 20 20 69 66 20 28 2a 6f 70 6e 64 20 21 3d 20 2a 72 65 67 ┆speed. */ if (*opnd != *reg┆ 0x04f200…09e600 69 6e 70 75 74 29 0a 09 09 72 65 74 75 72 6e 28 30 29 3b 0a 09 20 20 20 20 6c 65 6e 20 3d 20 73 ┆input) return(0); len = s┆ 0x04f200…09e600 74 72 6c 65 6e 28 6f 70 6e 64 29 3b 0a 09 20 20 20 20 69 66 20 28 6c 65 6e 20 3e 20 31 20 26 26 ┆trlen(opnd); if (len > 1 &&┆ 0x04f200…09e600 20 73 74 72 6e 63 6d 70 28 6f 70 6e 64 2c 20 72 65 67 69 6e 70 75 74 2c 20 6c 65 6e 29 20 21 3d ┆ strncmp(opnd, reginput, len) !=┆ 0x04f200…09e600 20 30 29 0a 09 09 72 65 74 75 72 6e 28 30 29 3b 0a 09 20 20 20 20 72 65 67 69 6e 70 75 74 20 2b ┆ 0) return(0); reginput +┆ 0x04f200…09e600 3d 20 6c 65 6e 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 ┆= len; } break; case ┆ 0x04f200…09e600 41 4e 59 4f 46 3a 0a 09 20 20 20 20 69 66 20 28 73 74 72 63 68 72 28 4f 50 45 52 41 4e 44 28 73 ┆ANYOF: if (strchr(OPERAND(s┆ 0x04f200…09e600 63 61 6e 29 2c 20 2a 72 65 67 69 6e 70 75 74 29 20 3d 3d 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c ┆can), *reginput) == (char *)NULL┆ 0x04f200…09e600 29 0a 09 09 72 65 74 75 72 6e 28 30 29 3b 0a 09 20 20 20 20 72 65 67 69 6e 70 75 74 2b 2b 3b 0a ┆) return(0); reginput++; ┆ 0x04f200…09e600 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 41 4e 59 42 55 54 3a 0a 09 20 20 20 20 69 ┆ break; case ANYBUT: i┆ 0x04f200…09e600 66 20 28 73 74 72 63 68 72 28 4f 50 45 52 41 4e 44 28 73 63 61 6e 29 2c 20 2a 72 65 67 69 6e 70 ┆f (strchr(OPERAND(scan), *reginp┆ 0x04f200…09e600 75 74 29 20 21 3d 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 0a 09 09 72 65 74 75 72 6e 28 30 29 ┆ut) != (char *)NULL) return(0)┆ 0x04f200…09e600 3b 0a 09 20 20 20 20 72 65 67 69 6e 70 75 74 2b 2b 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 ┆; reginput++; break; ┆ 0x04f200…09e600 63 61 73 65 20 4e 4f 54 48 49 4e 47 3a 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 ┆case NOTHING: break; case ┆ 0x04f200…09e600 42 41 43 4b 3a 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 4f 50 45 4e 2b 31 3a 0a ┆BACK: break; case OPEN+1: ┆ 0x04f200…09e600 09 63 61 73 65 20 4f 50 45 4e 2b 32 3a 0a 09 63 61 73 65 20 4f 50 45 4e 2b 33 3a 0a 09 63 61 73 ┆ case OPEN+2: case OPEN+3: cas┆ 0x04f200…09e600 65 20 4f 50 45 4e 2b 34 3a 0a 09 63 61 73 65 20 4f 50 45 4e 2b 35 3a 0a 09 63 61 73 65 20 4f 50 ┆e OPEN+4: case OPEN+5: case OP┆ 0x04f200…09e600 45 4e 2b 36 3a 0a 09 63 61 73 65 20 4f 50 45 4e 2b 37 3a 0a 09 63 61 73 65 20 4f 50 45 4e 2b 38 ┆EN+6: case OPEN+7: case OPEN+8┆ 0x04f200…09e600 3a 0a 09 63 61 73 65 20 4f 50 45 4e 2b 39 3a 20 7b 0a 09 20 20 20 20 72 65 67 69 73 74 65 72 20 ┆: case OPEN+9: { register ┆ 0x04f200…09e600 69 6e 74 20 6e 6f 3b 0a 09 20 20 20 20 72 65 67 69 73 74 65 72 20 63 68 61 72 20 2a 73 61 76 65 ┆int no; register char *save┆ 0x04f200…09e600 3b 0a 0a 09 20 20 20 20 6e 6f 20 3d 20 4f 50 28 73 63 61 6e 29 20 2d 20 4f 50 45 4e 3b 0a 09 20 ┆; no = OP(scan) - OPEN; ┆ 0x04f200…09e600 20 20 20 73 61 76 65 20 3d 20 72 65 67 69 6e 70 75 74 3b 0a 0a 09 20 20 20 20 69 66 20 28 72 65 ┆ save = reginput; if (re┆ 0x04f200…09e600 67 6d 61 74 63 68 28 6e 65 78 74 29 29 20 7b 0a 09 09 2f 2a 0a 09 09 20 2a 20 44 6f 6e 27 74 20 ┆gmatch(next)) { /* * Don't ┆ 0x04f200…09e600 73 65 74 20 73 74 61 72 74 70 20 69 66 20 73 6f 6d 65 20 6c 61 74 65 72 0a 09 09 20 2a 20 69 6e ┆set startp if some later * in┆ 0x04f200…09e600 76 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 61 6d 65 20 70 61 72 65 6e 74 68 65 73 65 73 ┆vocation of the same parentheses┆ 0x04f200…09e600 0a 09 09 20 2a 20 61 6c 72 65 61 64 79 20 68 61 73 2e 0a 09 09 20 2a 2f 0a 09 09 69 66 20 28 72 ┆ * already has. */ if (r┆ 0x04f200…09e600 65 67 73 74 61 72 74 70 5b 6e 6f 5d 20 3d 3d 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 0a 09 09 ┆egstartp[no] == (char *)NULL) ┆ 0x04f200…09e600 20 20 20 20 72 65 67 73 74 61 72 74 70 5b 6e 6f 5d 20 3d 20 73 61 76 65 3b 0a 09 09 72 65 74 75 ┆ regstartp[no] = save; retu┆ 0x04f200…09e600 72 6e 28 31 29 3b 0a 09 20 20 20 20 7d 20 65 6c 73 65 0a 09 09 72 65 74 75 72 6e 28 30 29 3b 0a ┆rn(1); } else return(0); ┆ 0x04f200…09e600 09 7d 0a 2f 2a 09 62 72 65 61 6b 3b 09 09 2a 2f 0a 09 63 61 73 65 20 43 4c 4f 53 45 2b 31 3a 0a ┆ } /* break; */ case CLOSE+1: ┆ 0x04f200…09e600 09 63 61 73 65 20 43 4c 4f 53 45 2b 32 3a 0a 09 63 61 73 65 20 43 4c 4f 53 45 2b 33 3a 0a 09 63 ┆ case CLOSE+2: case CLOSE+3: c┆ 0x04f200…09e600 61 73 65 20 43 4c 4f 53 45 2b 34 3a 0a 09 63 61 73 65 20 43 4c 4f 53 45 2b 35 3a 0a 09 63 61 73 ┆ase CLOSE+4: case CLOSE+5: cas┆ 0x04f200…09e600 65 20 43 4c 4f 53 45 2b 36 3a 0a 09 63 61 73 65 20 43 4c 4f 53 45 2b 37 3a 0a 09 63 61 73 65 20 ┆e CLOSE+6: case CLOSE+7: case ┆ 0x04f200…09e600 43 4c 4f 53 45 2b 38 3a 0a 09 63 61 73 65 20 43 4c 4f 53 45 2b 39 3a 20 7b 0a 09 20 20 20 20 72 ┆CLOSE+8: case CLOSE+9: { r┆ 0x04f200…09e600 65 67 69 73 74 65 72 20 69 6e 74 20 6e 6f 3b 0a 09 20 20 20 20 72 65 67 69 73 74 65 72 20 63 68 ┆egister int no; register ch┆ 0x04f200…09e600 61 72 20 2a 73 61 76 65 3b 0a 0a 09 20 20 20 20 6e 6f 20 3d 20 4f 50 28 73 63 61 6e 29 20 2d 20 ┆ar *save; no = OP(scan) - ┆ 0x04f200…09e600 43 4c 4f 53 45 3b 0a 09 20 20 20 20 73 61 76 65 20 3d 20 72 65 67 69 6e 70 75 74 3b 0a 0a 09 20 ┆CLOSE; save = reginput; ┆ 0x04f200…09e600 20 20 20 69 66 20 28 72 65 67 6d 61 74 63 68 28 6e 65 78 74 29 29 20 7b 0a 09 09 2f 2a 0a 09 09 ┆ if (regmatch(next)) { /* ┆ 0x04f200…09e600 20 2a 20 44 6f 6e 27 74 20 73 65 74 20 65 6e 64 70 20 69 66 20 73 6f 6d 65 20 6c 61 74 65 72 0a ┆ * Don't set endp if some later ┆ 0x04f200…09e600 09 09 20 2a 20 69 6e 76 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 61 6d 65 20 70 61 72 65 ┆ * invocation of the same pare┆ 0x04f200…09e600 6e 74 68 65 73 65 73 0a 09 09 20 2a 20 61 6c 72 65 61 64 79 20 68 61 73 2e 0a 09 09 20 2a 2f 0a ┆ntheses * already has. */ ┆ 0x04f200…09e600 09 09 69 66 20 28 72 65 67 65 6e 64 70 5b 6e 6f 5d 20 3d 3d 20 28 63 68 61 72 20 2a 29 4e 55 4c ┆ if (regendp[no] == (char *)NUL┆ 0x04f200…09e600 4c 29 0a 09 09 20 20 20 20 72 65 67 65 6e 64 70 5b 6e 6f 5d 20 3d 20 73 61 76 65 3b 0a 09 09 72 ┆L) regendp[no] = save; r┆ 0x04f200…09e600 65 74 75 72 6e 28 31 29 3b 0a 09 20 20 20 20 7d 20 65 6c 73 65 0a 09 09 72 65 74 75 72 6e 28 30 ┆eturn(1); } else return(0┆ 0x04f200…09e600 29 3b 0a 09 7d 0a 2f 2a 09 62 72 65 61 6b 3b 09 09 09 2a 2f 0a 09 63 61 73 65 20 42 52 41 4e 43 ┆); } /* break; */ case BRANC┆ 0x04f200…09e600 48 3a 20 7b 0a 09 20 20 20 20 72 65 67 69 73 74 65 72 20 63 68 61 72 20 2a 73 61 76 65 3b 0a 0a ┆H: { register char *save; ┆ 0x04f200…09e600 09 20 20 20 20 69 66 20 28 4f 50 28 6e 65 78 74 29 20 21 3d 20 42 52 41 4e 43 48 29 09 09 2f 2a ┆ if (OP(next) != BRANCH) /*┆ 0x04f200…09e600 20 4e 6f 20 63 68 6f 69 63 65 2e 20 2a 2f 0a 09 09 6e 65 78 74 20 3d 20 4f 50 45 52 41 4e 44 28 ┆ No choice. */ next = OPERAND(┆ 0x04f200…09e600 73 63 61 6e 29 3b 09 2f 2a 20 41 76 6f 69 64 20 72 65 63 75 72 73 69 6f 6e 2e 20 2a 2f 0a 09 20 ┆scan); /* Avoid recursion. */ ┆ 0x04f200…09e600 20 20 20 65 6c 73 65 20 7b 0a 09 09 64 6f 20 7b 0a 09 09 20 20 20 20 73 61 76 65 20 3d 20 72 65 ┆ else { do { save = re┆ 0x04f200…09e600 67 69 6e 70 75 74 3b 0a 09 09 20 20 20 20 69 66 20 28 72 65 67 6d 61 74 63 68 28 4f 50 45 52 41 ┆ginput; if (regmatch(OPERA┆ 0x04f200…09e600 4e 44 28 73 63 61 6e 29 29 29 0a 09 09 09 72 65 74 75 72 6e 28 31 29 3b 0a 09 09 20 20 20 20 72 ┆ND(scan))) return(1); r┆ 0x04f200…09e600 65 67 69 6e 70 75 74 20 3d 20 73 61 76 65 3b 0a 09 09 20 20 20 20 73 63 61 6e 20 3d 20 72 65 67 ┆eginput = save; scan = reg┆ 0x04f200…09e600 6e 65 78 74 28 73 63 61 6e 29 3b 0a 09 09 7d 20 77 68 69 6c 65 20 28 73 63 61 6e 20 21 3d 20 28 ┆next(scan); } while (scan != (┆ 0x04f200…09e600 63 68 61 72 20 2a 29 4e 55 4c 4c 20 26 26 20 4f 50 28 73 63 61 6e 29 20 3d 3d 20 42 52 41 4e 43 ┆char *)NULL && OP(scan) == BRANC┆ 0x04f200…09e600 48 29 3b 0a 09 09 72 65 74 75 72 6e 28 30 29 3b 0a 09 09 2f 2a 20 4e 4f 54 52 45 41 43 48 45 44 ┆H); return(0); /* NOTREACHED┆ 0x04f200…09e600 20 2a 2f 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 63 ┆ */ } } break; c┆ 0x04f200…09e600 61 73 65 20 53 54 41 52 3a 0a 09 63 61 73 65 20 50 4c 55 53 3a 20 7b 0a 09 20 20 20 20 72 65 67 ┆ase STAR: case PLUS: { reg┆ 0x04f200…09e600 69 73 74 65 72 20 63 68 61 72 20 6e 65 78 74 63 68 3b 0a 09 20 20 20 20 72 65 67 69 73 74 65 72 ┆ister char nextch; register┆ 0x04f200…09e600 20 69 6e 74 20 6e 6f 3b 0a 09 20 20 20 20 72 65 67 69 73 74 65 72 20 63 68 61 72 20 2a 73 61 76 ┆ int no; register char *sav┆ 0x04f200…09e600 65 3b 0a 09 20 20 20 20 72 65 67 69 73 74 65 72 20 69 6e 74 20 6d 69 6e 3b 0a 0a 09 20 20 20 20 ┆e; register int min; ┆ 0x04f200…09e600 2f 2a 0a 09 20 20 20 20 20 2a 20 4c 6f 6f 6b 61 68 65 61 64 20 74 6f 20 61 76 6f 69 64 20 75 73 ┆/* * Lookahead to avoid us┆ 0x04f200…09e600 65 6c 65 73 73 20 6d 61 74 63 68 20 61 74 74 65 6d 70 74 73 0a 09 20 20 20 20 20 2a 20 77 68 65 ┆eless match attempts * whe┆ 0x04f200…09e600 6e 20 77 65 20 6b 6e 6f 77 20 77 68 61 74 20 63 68 61 72 61 63 74 65 72 20 63 6f 6d 65 73 20 6e ┆n we know what character comes n┆ 0x04f200…09e600 65 78 74 2e 0a 09 20 20 20 20 20 2a 2f 0a 09 20 20 20 20 6e 65 78 74 63 68 20 3d 20 27 5c 30 27 ┆ext. */ nextch = '\0'┆ 0x04f200…09e600 3b 0a 09 20 20 20 20 69 66 20 28 4f 50 28 6e 65 78 74 29 20 3d 3d 20 45 58 41 43 54 4c 59 29 0a ┆; if (OP(next) == EXACTLY) ┆ 0x04f200…09e600 09 09 6e 65 78 74 63 68 20 3d 20 2a 4f 50 45 52 41 4e 44 28 6e 65 78 74 29 3b 0a 09 20 20 20 20 ┆ nextch = *OPERAND(next); ┆ 0x04f200…09e600 6d 69 6e 20 3d 20 28 4f 50 28 73 63 61 6e 29 20 3d 3d 20 53 54 41 52 29 20 3f 20 30 20 3a 20 31 ┆min = (OP(scan) == STAR) ? 0 : 1┆ 0x04f200…09e600 3b 0a 09 20 20 20 20 73 61 76 65 20 3d 20 72 65 67 69 6e 70 75 74 3b 0a 09 20 20 20 20 6e 6f 20 ┆; save = reginput; no ┆ 0x04f200…09e600 3d 20 72 65 67 72 65 70 65 61 74 28 4f 50 45 52 41 4e 44 28 73 63 61 6e 29 29 3b 0a 09 20 20 20 ┆= regrepeat(OPERAND(scan)); ┆ 0x04f200…09e600 20 77 68 69 6c 65 20 28 6e 6f 20 3e 3d 20 6d 69 6e 29 20 7b 0a 09 09 2f 2a 20 49 66 20 69 74 20 ┆ while (no >= min) { /* If it ┆ 0x04f200…09e600 63 6f 75 6c 64 20 77 6f 72 6b 2c 20 74 72 79 20 69 74 2e 20 2a 2f 0a 09 09 69 66 20 28 6e 65 78 ┆could work, try it. */ if (nex┆ 0x04f200…09e600 74 63 68 20 3d 3d 20 27 5c 30 27 20 7c 7c 20 2a 72 65 67 69 6e 70 75 74 20 3d 3d 20 6e 65 78 74 ┆tch == '\0' || *reginput == next┆ 0x04f200…09e600 63 68 29 0a 09 09 20 20 20 20 69 66 20 28 72 65 67 6d 61 74 63 68 28 6e 65 78 74 29 29 0a 09 09 ┆ch) if (regmatch(next)) ┆ 0x04f200…09e600 09 72 65 74 75 72 6e 28 31 29 3b 0a 09 09 2f 2a 20 43 6f 75 6c 64 6e 27 74 20 6f 72 20 64 69 64 ┆ return(1); /* Couldn't or did┆ 0x04f200…09e600 6e 27 74 20 2d 2d 20 62 61 63 6b 20 75 70 2e 20 2a 2f 0a 09 09 6e 6f 2d 2d 3b 0a 09 09 72 65 67 ┆n't -- back up. */ no--; reg┆ 0x04f200…09e600 69 6e 70 75 74 20 3d 20 73 61 76 65 20 2b 20 6e 6f 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 72 ┆input = save + no; } r┆ 0x04f200…09e600 65 74 75 72 6e 28 30 29 3b 0a 09 20 20 20 20 7d 0a 2f 2a 09 20 20 20 20 62 72 65 61 6b 3b 09 09 ┆eturn(0); } /* break; ┆ 0x04f200…09e600 09 2a 2f 0a 09 63 61 73 65 20 45 4e 44 3a 0a 09 20 20 20 20 72 65 74 75 72 6e 28 31 29 3b 09 2f ┆ */ case END: return(1); /┆ 0x04f200…09e600 2a 20 53 75 63 63 65 73 73 21 20 2a 2f 0a 2f 2a 09 20 20 20 20 62 72 65 61 6b 3b 09 09 09 2a 2f ┆* Success! */ /* break; */┆ 0x04f200…09e600 0a 09 64 65 66 61 75 6c 74 3a 0a 09 20 20 20 20 78 65 72 72 6f 72 28 22 72 65 67 75 6c 61 72 20 ┆ default: xerror("regular ┆ 0x04f200…09e600 65 78 70 72 65 73 73 69 6f 6e 20 62 6f 74 63 68 2c 20 6d 65 6d 6f 72 79 20 63 6f 72 72 75 70 74 ┆expression botch, memory corrupt┆ 0x04f200…09e600 69 6f 6e 22 29 3b 0a 2f 2a 09 20 20 20 20 72 65 74 75 72 6e 28 30 29 3b 09 09 2a 2f 0a 09 20 20 ┆ion"); /* return(0); */ ┆ 0x04f200…09e600 20 20 62 72 65 61 6b 3b 0a 09 20 20 20 20 7d 0a 0a 09 73 63 61 6e 20 3d 20 6e 65 78 74 3b 0a 20 ┆ break; } scan = next; ┆ 0x04f200…09e600 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 57 65 20 67 65 74 20 68 65 72 65 20 ┆ } /* * We get here ┆ 0x04f200…09e600 6f 6e 6c 79 20 69 66 20 74 68 65 72 65 27 73 20 74 72 6f 75 62 6c 65 20 2d 2d 20 6e 6f 72 6d 61 ┆only if there's trouble -- norma┆ 0x04f200…09e600 6c 6c 79 20 22 63 61 73 65 20 45 4e 44 22 20 69 73 0a 20 20 20 20 20 2a 20 74 68 65 20 74 65 72 ┆lly "case END" is * the ter┆ 0x04f200…09e600 6d 69 6e 61 74 69 6e 67 20 70 6f 69 6e 74 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 78 65 72 72 ┆minating point. */ xerr┆ 0x04f200…09e600 6f 72 28 22 72 65 67 75 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e 20 62 6f 74 63 68 2c 20 63 6f ┆or("regular expression botch, co┆ 0x04f200…09e600 72 72 75 70 74 65 64 20 70 6f 69 6e 74 65 72 73 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 28 30 ┆rrupted pointers"); return(0┆ 0x04f200…09e600 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2d 20 72 65 67 72 65 70 65 61 74 20 2d 20 72 65 70 65 61 74 65 64 ┆); } /* - regrepeat - repeated┆ 0x04f200…09e600 6c 79 20 6d 61 74 63 68 20 73 6f 6d 65 74 68 69 6e 67 20 73 69 6d 70 6c 65 2c 20 72 65 70 6f 72 ┆ly match something simple, repor┆ 0x04f200…09e600 74 20 68 6f 77 20 6d 61 6e 79 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 72 65 67 72 65 70 ┆t how many */ static int regrep┆ 0x04f200…09e600 65 61 74 28 70 29 0a 63 68 61 72 20 2a 70 3b 0a 7b 0a 20 20 20 20 72 65 67 69 73 74 65 72 20 69 ┆eat(p) char *p; { register i┆ 0x04f200…09e600 6e 74 20 63 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20 20 72 65 67 69 73 74 65 72 20 63 68 61 72 20 ┆nt count = 0; register char ┆ 0x04f200…09e600 2a 73 63 61 6e 3b 0a 20 20 20 20 72 65 67 69 73 74 65 72 20 63 68 61 72 20 2a 6f 70 6e 64 3b 0a ┆*scan; register char *opnd; ┆ 0x04f200…09e600 0a 20 20 20 20 73 63 61 6e 20 3d 20 72 65 67 69 6e 70 75 74 3b 0a 20 20 20 20 6f 70 6e 64 20 3d ┆ scan = reginput; opnd =┆ 0x04f200…09e600 20 4f 50 45 52 41 4e 44 28 70 29 3b 0a 20 20 20 20 73 77 69 74 63 68 20 28 4f 50 28 70 29 29 20 ┆ OPERAND(p); switch (OP(p)) ┆ 0x04f200…09e600 7b 0a 20 20 20 20 63 61 73 65 20 41 4e 59 3a 0a 09 63 6f 75 6e 74 20 3d 20 73 74 72 6c 65 6e 28 ┆{ case ANY: count = strlen(┆ 0x04f200…09e600 73 63 61 6e 29 3b 0a 09 73 63 61 6e 20 2b 3d 20 63 6f 75 6e 74 3b 0a 09 62 72 65 61 6b 3b 0a 20 ┆scan); scan += count; break; ┆ 0x04f200…09e600 20 20 20 63 61 73 65 20 45 58 41 43 54 4c 59 3a 0a 09 77 68 69 6c 65 20 28 2a 6f 70 6e 64 20 3d ┆ case EXACTLY: while (*opnd =┆ 0x04f200…09e600 3d 20 2a 73 63 61 6e 29 20 7b 0a 09 20 20 20 20 63 6f 75 6e 74 2b 2b 3b 0a 09 20 20 20 20 73 63 ┆= *scan) { count++; sc┆ 0x04f200…09e600 61 6e 2b 2b 3b 0a 09 7d 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 41 4e 59 4f 46 3a ┆an++; } break; case ANYOF:┆ 0x04f200…09e600 0a 09 77 68 69 6c 65 20 28 2a 73 63 61 6e 20 21 3d 20 27 5c 30 27 20 26 26 20 73 74 72 63 68 72 ┆ while (*scan != '\0' && strchr┆ 0x04f200…09e600 28 6f 70 6e 64 2c 20 2a 73 63 61 6e 29 20 21 3d 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 20 7b ┆(opnd, *scan) != (char *)NULL) {┆ 0x04f200…09e600 0a 09 20 20 20 20 63 6f 75 6e 74 2b 2b 3b 0a 09 20 20 20 20 73 63 61 6e 2b 2b 3b 0a 09 7d 0a 09 ┆ count++; scan++; } ┆ 0x04f200…09e600 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 41 4e 59 42 55 54 3a 0a 09 77 68 69 6c 65 20 28 ┆break; case ANYBUT: while (┆ 0x04f200…09e600 2a 73 63 61 6e 20 21 3d 20 27 5c 30 27 20 26 26 20 73 74 72 63 68 72 28 6f 70 6e 64 2c 20 2a 73 ┆*scan != '\0' && strchr(opnd, *s┆ 0x04f200…09e600 63 61 6e 29 20 3d 3d 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 63 6f 75 ┆can) == (char *)NULL) { cou┆ 0x04f200…09e600 6e 74 2b 2b 3b 0a 09 20 20 20 20 73 63 61 6e 2b 2b 3b 0a 09 7d 0a 09 62 72 65 61 6b 3b 0a 20 20 ┆nt++; scan++; } break; ┆ 0x04f200…09e600 20 20 64 65 66 61 75 6c 74 3a 09 09 2f 2a 20 4f 68 20 64 65 61 72 2e 20 20 43 61 6c 6c 65 64 20 ┆ default: /* Oh dear. Called ┆ 0x04f200…09e600 69 6e 61 70 70 72 6f 70 72 69 61 74 65 6c 79 2e 20 2a 2f 0a 09 78 65 72 72 6f 72 28 22 72 65 67 ┆inappropriately. */ xerror("reg┆ 0x04f200…09e600 75 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e 20 62 6f 74 63 68 2c 20 72 65 67 75 6c 61 72 20 65 ┆ular expression botch, regular e┆ 0x04f200…09e600 78 70 72 65 73 73 69 6f 6e 20 69 6e 74 65 72 6e 61 6c 20 66 6f 75 6c 75 70 22 29 3b 0a 09 63 6f ┆xpression internal foulup"); co┆ 0x04f200…09e600 75 6e 74 20 3d 20 30 3b 09 2f 2a 20 42 65 73 74 20 63 6f 6d 70 72 6f 6d 69 73 65 2e 20 2a 2f 0a ┆unt = 0; /* Best compromise. */ ┆ 0x04f200…09e600 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 67 69 6e 70 75 74 20 3d 20 73 63 61 ┆ break; } reginput = sca┆ 0x04f200…09e600 6e 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e 28 63 6f 75 6e 74 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2d 20 ┆n; return(count); } /* - ┆ 0x04f200…09e600 72 65 67 6e 65 78 74 20 2d 20 64 69 67 20 74 68 65 20 22 6e 65 78 74 22 20 70 6f 69 6e 74 65 72 ┆regnext - dig the "next" pointer┆ 0x04f200…09e600 20 6f 75 74 20 6f 66 20 61 20 6e 6f 64 65 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a ┆ out of a node */ static char *┆ 0x04f200…09e600 0a 72 65 67 6e 65 78 74 28 70 29 0a 72 65 67 69 73 74 65 72 20 63 68 61 72 20 2a 70 3b 0a 7b 0a ┆ regnext(p) register char *p; { ┆ 0x04f200…09e600 20 20 20 20 72 65 67 69 73 74 65 72 20 69 6e 74 20 6f 66 66 73 65 74 3b 0a 0a 20 20 20 20 69 66 ┆ register int offset; if┆ 0x04f200…09e600 20 28 70 20 3d 3d 20 26 72 65 67 64 75 6d 6d 79 29 0a 09 72 65 74 75 72 6e 28 28 63 68 61 72 20 ┆ (p == ®dummy) return((char ┆ 0x04f200…09e600 2a 29 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 6f 66 66 73 65 74 20 3d 20 4e 45 58 54 28 70 29 3b 0a ┆*)NULL); offset = NEXT(p); ┆ 0x04f200…09e600 20 20 20 20 69 66 20 28 6f 66 66 73 65 74 20 3d 3d 20 30 29 0a 09 72 65 74 75 72 6e 28 28 63 68 ┆ if (offset == 0) return((ch┆ 0x04f200…09e600 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 69 66 20 28 4f 50 28 70 29 20 3d 3d 20 42 41 ┆ar *)NULL); if (OP(p) == BA┆ 0x04f200…09e600 43 4b 29 0a 09 72 65 74 75 72 6e 28 70 2d 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 65 6c 73 65 0a ┆CK) return(p-offset); else ┆ 0x04f200…09e600 09 72 65 74 75 72 6e 28 70 2b 6f 66 66 73 65 74 29 3b 0a 7d 0a 0a 2f 2a 20 72 65 67 65 78 70 2e ┆ return(p+offset); } /* regexp.┆ 0x04f200…09e600 63 20 65 6e 64 73 20 68 65 72 65 20 2a 2f 0a 2e 20 2a 2f 0a 09 78 65 72 72 6f 72 28 22 72 65 67 ┆c ends here */ . */ xerror("reg┆ 0x04f200…09e600 75 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e 20 62 6f 74 63 68 2c 20 72 65 67 75 6c 61 72 20 65 ┆ular expression botch, regular e┆ 0x04f200…09e600 78 70 72 65 73 73 69 6f 6e 20 69 6e 74 65 72 6e 61 6c 20 66 6f 75 6c 75 70 22 29 3b 0a 09 63 6f ┆xpression internal foulup"); co┆ 0x04f200…09e600 75 6e 74 20 3d 20 30 3b 09 2f 2a 20 42 65 73 74 20 63 6f 6d 70 72 6f 6d 69 73 65 2e 20 2a 2f 0a ┆unt = 0; /* Best compromise. */ ┆ 0x04f200…09e600 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 67 69 6e 70 75 74 20 3d 20 73 63 61 ┆ break; } reginput = sca┆ 0x04f200…09e600 6e 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e 28 63 6f 75 6e 74 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2d 20 ┆n; return(count); } /* - ┆ 0x04f200…09e600 72 65 67 6e 65 78 74 20 2d 20 64 69 67 20 74 68 65 20 22 6e 65 78 74 22 20 70 6f 69 6e 74 65 72 ┆regnext - dig the "next" pointer┆ 0x04f200…09e600 20 6f 75 74 20 6f 66 20 61 20 6e 6f 64 65 0a 20 2a 73 72 63 2f 44 2e 70 6f 72 74 2f 72 65 67 65 ┆ out of a node *src/D.port/rege┆ 0x04f200…09e600 78 70 2e 68 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆xp.h ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆ ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 20 20 20 34 34 34 20 00 20 20 20 ┆ 444 ┆ 0x04f200…09e600 31 34 35 20 00 20 20 20 20 20 31 20 00 20 20 20 20 20 20 20 31 31 30 32 20 20 34 34 35 36 31 35 ┆145 1 1102 445615┆ 0x04f200…09e600 34 30 35 34 20 20 20 37 34 35 37 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆4054 7457 ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆ ┆ […0x9…] 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 2f 2a 0a 20 2a 20 44 65 66 69 6e 69 74 69 6f ┆ /* * Definitio┆ 0x04f200…09e600 6e 73 20 65 74 63 2e 20 66 6f 72 20 72 65 67 65 78 70 28 33 29 20 72 6f 75 74 69 6e 65 73 2e 0a ┆ns etc. for regexp(3) routines. ┆ 0x04f200…09e600 20 2a 0a 20 2a 20 43 61 76 65 61 74 3a 20 20 74 68 69 73 20 69 73 20 56 38 20 72 65 67 65 78 70 ┆ * * Caveat: this is V8 regexp┆ 0x04f200…09e600 28 33 29 20 5b 61 63 74 75 61 6c 6c 79 2c 20 61 20 72 65 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f ┆(3) [actually, a reimplementatio┆ 0x04f200…09e600 6e 20 74 68 65 72 65 6f 66 5d 2c 0a 20 2a 20 6e 6f 74 20 74 68 65 20 53 79 73 74 65 6d 20 56 20 ┆n thereof], * not the System V ┆ 0x04f200…09e600 6f 6e 65 2e 0a 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 53 55 42 45 58 50 20 20 31 30 0a 74 79 70 ┆one. */ #define NSUBEXP 10 typ┆ 0x04f200…09e600 65 64 65 66 20 73 74 72 75 63 74 20 72 65 67 65 78 70 20 7b 0a 09 63 68 61 72 20 2a 73 74 61 72 ┆edef struct regexp { char *star┆ 0x04f200…09e600 74 70 5b 4e 53 55 42 45 58 50 5d 3b 0a 09 63 68 61 72 20 2a 65 6e 64 70 5b 4e 53 55 42 45 58 50 ┆tp[NSUBEXP]; char *endp[NSUBEXP┆ 0x04f200…09e600 5d 3b 0a 09 63 68 61 72 20 72 65 67 73 74 61 72 74 3b 09 09 2f 2a 20 49 6e 74 65 72 6e 61 6c 20 ┆]; char regstart; /* Internal ┆ 0x04f200…09e600 75 73 65 20 6f 6e 6c 79 2e 20 2a 2f 0a 09 63 68 61 72 20 72 65 67 61 6e 63 68 3b 09 09 2f 2a 20 ┆use only. */ char reganch; /* ┆ 0x04f200…09e600 49 6e 74 65 72 6e 61 6c 20 75 73 65 20 6f 6e 6c 79 2e 20 2a 2f 0a 09 63 68 61 72 20 2a 72 65 67 ┆Internal use only. */ char *reg┆ 0x04f200…09e600 6d 75 73 74 3b 09 09 2f 2a 20 49 6e 74 65 72 6e 61 6c 20 75 73 65 20 6f 6e 6c 79 2e 20 2a 2f 0a ┆must; /* Internal use only. */ ┆ 0x04f200…09e600 09 69 6e 74 20 72 65 67 6d 6c 65 6e 3b 09 09 2f 2a 20 49 6e 74 65 72 6e 61 6c 20 75 73 65 20 6f ┆ int regmlen; /* Internal use o┆ 0x04f200…09e600 6e 6c 79 2e 20 2a 2f 0a 09 63 68 61 72 20 70 72 6f 67 72 61 6d 5b 31 5d 3b 09 2f 2a 20 55 6e 77 ┆nly. */ char program[1]; /* Unw┆ 0x04f200…09e600 61 72 72 61 6e 74 65 64 20 63 68 75 6d 6d 69 6e 65 73 73 20 77 69 74 68 20 63 6f 6d 70 69 6c 65 ┆arranted chumminess with compile┆ 0x04f200…09e600 72 2e 20 2a 2f 0a 7d 20 72 65 67 65 78 70 3b 0a 0a 65 78 74 65 72 6e 20 72 65 67 65 78 70 20 2a ┆r. */ } regexp; extern regexp *┆ 0x04f200…09e600 72 65 67 63 6f 6d 70 28 29 3b 0a 65 78 74 65 72 6e 20 69 6e 74 20 72 65 67 65 78 65 63 28 29 3b ┆regcomp(); extern int regexec();┆ 0x04f200…09e600 0a 65 78 74 65 72 6e 20 76 6f 69 64 20 72 65 67 65 72 72 6f 72 28 29 3b 0a 0a 2f 2a 20 72 65 67 ┆ extern void regerror(); /* reg┆ 0x04f200…09e600 65 78 70 2e 68 20 65 6e 64 73 20 68 65 72 65 20 2a 2f 0a 20 69 73 20 56 38 20 72 65 67 65 78 70 ┆exp.h ends here */ is V8 regexp┆ 0x04f200…09e600 28 33 29 20 5b 61 63 74 75 61 6c 6c 79 2c 20 61 20 72 65 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f ┆(3) [actually, a reimplementatio┆ 0x04f200…09e600 6e 20 74 68 65 72 65 6f 66 5d 2c 0a 20 2a 20 6e 6f 74 20 74 68 65 20 53 79 73 74 65 6d 20 56 20 ┆n thereof], * not the System V ┆ 0x04f200…09e600 6f 6e 65 2e 0a 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 53 55 42 45 58 50 20 20 31 30 0a 74 79 70 ┆one. */ #define NSUBEXP 10 typ┆ 0x04f200…09e600 65 64 65 66 20 73 74 72 75 63 74 20 72 65 67 65 78 70 20 7b 0a 09 63 68 61 72 20 2a 73 74 61 72 ┆edef struct regexp { char *star┆ 0x04f200…09e600 74 70 5b 4e 53 55 42 45 58 50 5d 3b 0a 09 63 68 61 72 20 2a 65 6e 64 70 5b 4e 53 55 42 45 58 50 ┆tp[NSUBEXP]; char *endp[NSUBEXP┆ 0x04f200…09e600 5d 3b 0a 09 63 68 61 72 20 72 65 67 73 74 61 72 74 3b 09 09 2f 2a 20 49 6e 74 65 72 6e 61 6c 20 ┆]; char regstart; /* Internal ┆ 0x04f200…09e600 75 73 65 20 6f 6e 6c 79 2e 20 2a 2f 0a 09 63 68 61 72 20 72 65 67 61 6e 63 68 3b 09 09 2f 2a 20 ┆use only. */ char reganch; /* ┆ 0x04f200…09e600 49 6e 74 65 72 6e 61 6c 20 75 73 65 20 6f 6e 6c 79 2e 20 2a 2f 0a 09 63 68 61 72 20 2a 72 65 67 ┆Internal use only. */ char *reg┆ 0x04f200…09e600 6d 75 73 74 3b 09 09 2f 2a 20 49 6e 74 65 72 6e 61 6c 20 75 73 65 20 6f 6e 6c 79 2e 20 2a 2f 0a ┆must; /* Internal use only. */ ┆ 0x04f200…09e600 09 69 6e 74 20 72 65 67 6d 6c 65 6e 3b 09 09 2f 2a 20 49 6e 74 65 72 6e 61 6c 20 75 73 65 20 6f ┆ int regmlen; /* Internal use o┆ 0x04f200…09e600 6e 6c 79 2e 20 2a 2f 0a 09 63 68 61 72 20 70 72 6f 67 72 61 6d 5b 31 5d 3b 09 2f 2a 20 55 6e 77 ┆nly. */ char program[1]; /* Unw┆ 0x04f200…09e600 61 72 72 61 6e 74 65 64 20 63 68 75 6d 6d 69 6e 65 73 73 20 77 69 74 68 20 63 6f 6d 70 69 6c 65 ┆arranted chumminess with compile┆ 0x04f200…09e600 72 2e 20 2a 2f 0a 7d 20 72 65 67 65 78 70 3b 0a 0a 65 78 74 65 72 6e 20 72 65 67 65 78 70 20 2a ┆r. */ } regexp; extern regexp *┆ 0x04f200…09e600 72 65 67 63 6f 6d 70 28 29 3b 0a 65 78 74 65 72 6e 73 72 63 2f 44 2e 70 6f 72 74 2f 73 61 76 65 ┆regcomp(); externsrc/D.port/save┆ 0x04f200…09e600 73 74 72 2e 63 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆str.c ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆ ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 20 20 20 34 34 34 20 00 20 20 20 ┆ 444 ┆ 0x04f200…09e600 31 34 35 20 00 20 20 20 20 20 31 20 00 20 20 20 20 20 20 20 20 37 37 31 20 20 34 34 35 36 31 35 ┆145 1 771 445615┆ 0x04f200…09e600 34 30 35 35 20 20 20 37 36 34 33 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆4055 7643 ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆ ┆ […0x9…] 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 2f 2a 20 73 61 76 65 73 74 72 2e 63 20 2d 2d ┆ /* savestr.c --┆ 0x04f200…09e600 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 61 6c 6c 6f 63 61 74 65 ┆ return a pointer to an allocate┆ 0x04f200…09e600 64 20 63 6f 70 79 20 6f 66 20 61 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20 2a 2f 0a 2f 2a 0a 20 ┆d copy of a given string */ /* ┆ 0x04f200…09e600 20 20 54 68 69 73 20 73 6f 66 74 77 61 72 65 20 69 73 20 43 6f 70 79 72 69 67 68 74 20 28 43 29 ┆ This software is Copyright (C)┆ 0x04f200…09e600 20 31 39 38 39 20 62 79 20 45 72 69 63 20 53 2e 20 52 61 79 6d 6f 6e 64 20 66 6f 72 20 74 68 65 ┆ 1989 by Eric S. Raymond for the┆ 0x04f200…09e600 20 73 6f 6c 65 20 70 75 72 70 6f 73 65 0a 6f 66 20 70 72 6f 74 65 63 74 69 6e 67 20 66 72 65 65 ┆ sole purpose of protecting free┆ 0x04f200…09e600 20 72 65 64 69 73 74 72 69 62 75 74 69 6f 6e 3b 20 73 65 65 20 74 68 65 20 4c 49 43 45 4e 53 45 ┆ redistribution; see the LICENSE┆ 0x04f200…09e600 20 66 69 6c 65 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a 2f 2a 20 4c 49 4e 54 4c 49 42 ┆ file for details. */ /* LINTLIB┆ 0x04f200…09e600 52 41 52 59 20 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 6c 69 62 70 6f 72 74 2e 68 22 0a 0a 63 68 ┆RARY */ #include "libport.h" ch┆ 0x04f200…09e600 61 72 20 2a 73 61 76 65 73 74 72 28 63 70 29 0a 72 65 67 69 73 74 65 72 20 63 68 61 72 20 2a 63 ┆ar *savestr(cp) register char *c┆ 0x04f200…09e600 70 3b 0a 7b 0a 20 20 20 20 72 65 67 69 73 74 65 72 20 63 68 61 72 20 2a 6d 70 3b 0a 0a 20 20 20 ┆p; { register char *mp; ┆ 0x04f200…09e600 20 69 66 20 28 28 6d 70 20 3d 20 6d 61 6c 6c 6f 63 28 28 75 6e 73 69 67 6e 65 64 29 20 73 74 72 ┆ if ((mp = malloc((unsigned) str┆ 0x04f200…09e600 6c 65 6e 28 63 70 29 20 2b 20 31 29 29 20 3d 3d 20 28 63 68 61 72 20 2a 29 30 29 0a 09 78 65 72 ┆len(cp) + 1)) == (char *)0) xer┆ 0x04f200…09e600 72 6f 72 31 28 22 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64 20 6f 6e 20 25 73 22 2c 20 63 70 29 3b ┆ror1("malloc failed on %s", cp);┆ 0x04f200…09e600 0a 0a 20 20 20 20 28 76 6f 69 64 29 20 73 74 72 63 70 79 28 6d 70 2c 20 63 70 29 3b 0a 20 20 20 ┆ (void) strcpy(mp, cp); ┆ 0x04f200…09e600 20 72 65 74 75 72 6e 28 6d 70 29 3b 0a 7d 0a 0a 2f 2a 20 73 61 76 65 73 74 72 2e 63 20 65 6e 64 ┆ return(mp); } /* savestr.c end┆ 0x04f200…09e600 73 20 68 65 72 65 20 2a 2f 0a 0a 65 78 74 65 72 6e 73 72 63 2f 44 2e 70 6f 72 74 2f 73 65 72 76 ┆s here */ externsrc/D.port/serv┆ 0x04f200…09e600 65 72 2e 63 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆er.c ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆ ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 20 20 20 34 34 34 20 00 20 20 20 ┆ 444 ┆ 0x04f200…09e600 31 34 35 20 00 20 20 20 20 20 31 20 00 20 20 20 20 20 20 31 33 34 36 31 20 20 34 34 36 35 37 36 ┆145 1 13461 446576┆ 0x04f200…09e600 31 33 30 34 20 20 20 37 35 32 33 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆1304 7523 ┆ 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ┆ ┆ […0x9…] 0x04f200…09e600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆ /**************┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆********************************┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a ┆******************************* ┆ 0x04f200…09e600 0a 4e 41 4d 45 0a 20 20 20 73 65 72 76 65 72 2e 63 20 2d 2d 20 65 78 65 63 75 74 65 20 61 20 73 ┆ NAME server.c -- execute a s┆ 0x04f200…09e600 65 72 76 65 72 20 70 72 6f 63 65 73 73 2c 20 72 65 74 75 72 6e 69 6e 67 20 70 69 70 65 73 20 74 ┆erver process, returning pipes t┆ 0x04f200…09e600 6f 20 69 74 73 20 73 74 64 69 6e 20 26 20 73 74 64 6f 75 74 0a 0a 53 59 4e 4f 50 53 49 53 0a 20 ┆o its stdin & stdout SYNOPSIS ┆ 0x04f200…09e600 20 20 23 69 6e 63 6c 75 64 65 20 22 73 65 72 76 65 72 2e 68 22 0a 0a 20 20 20 73 65 72 76 65 72 ┆ #include "server.h" server┆ 0x04f200…09e600 5f 74 20 2a 73 72 76 6f 70 65 6e 28 66 69 6c 65 2c 20 61 72 67 76 29 20 20 20 2d 2d 20 72 65 74 ┆_t *srvopen(file, argv) -- ret┆ 0x04f200…09e600 75 72 6e 20 64 61 74 61 20 6f 6e 20 61 6e 20 6f 70 65 6e 20 73 65 72 76 65 72 20 70 72 6f 63 65 ┆urn data on an open server proce┆ 0x04f200…09e600 73 73 0a 20 20 20 63 68 61 72 20 2a 66 69 6c 65 3b 20 63 68 61 72 20 61 72 67 76 5b 5d 3b 0a 0a ┆ss char *file; char argv[]; ┆ 0x04f200…09e600 20 20 20 76 6f 69 64 20 73 72 76 63 6c 6f 73 65 28 73 70 29 09 20 20 20 20 2d 2d 20 63 6c 6f 73 ┆ void srvclose(sp) -- clos┆ 0x04f200…09e600 65 20 74 68 65 20 63 68 61 6e 6e 65 6c 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20 ┆e the channel associated with a ┆ 0x04f200…09e600 73 65 72 76 65 72 0a 20 20 20 73 65 72 76 65 72 5f 74 20 2a 73 70 3b 0a 0a 44 45 53 43 52 49 50 ┆server server_t *sp; DESCRIP┆ 0x04f200…09e600 54 49 4f 4e 0a 20 20 20 54 68 65 20 73 72 76 6f 70 65 6e 28 29 20 66 75 6e 63 74 69 6f 6e 20 68 ┆TION The srvopen() function h┆ 0x04f200…09e600 69 64 65 73 20 74 68 65 20 64 65 74 61 69 6c 73 20 6f 66 20 65 78 65 63 75 74 69 6e 67 20 61 20 ┆ides the details of executing a ┆ 0x04f200…09e600 73 65 72 76 65 72 20 70 72 6f 63 65 73 73 20 6f 66 0a 73 6f 6d 65 20 73 6f 72 74 20 75 6e 64 65 ┆server process of some sort unde┆ 0x04f200…09e600 72 20 63 6f 6e 74 72 6f 6c 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 72 6f 63 65 73 73 ┆r control of the current process┆ 0x04f200…09e600 2e 20 49 74 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 0a 73 74 72 75 ┆. It returns a pointer to a stru┆ 0x04f200…09e600 63 74 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 61 69 72 20 6f 66 20 66 69 6c 65 20 ┆ct that contains a pair of file ┆ 0x04f200…09e600 64 65 73 63 72 69 70 74 6f 72 73 2c 20 6f 72 20 4e 55 4c 4c 20 66 6f 72 20 65 72 72 6f 72 2e 0a ┆descriptors, or NULL for error. ┆ 0x04f200…09e600 0a 20 20 20 49 6e 20 74 68 65 20 66 6f 72 6d 65 72 20 63 61 73 65 20 74 68 65 20 27 72 65 61 64 ┆ In the former case the 'read┆ 0x04f200…09e600 73 72 76 27 20 6d 65 6d 62 65 72 20 69 73 20 6f 70 65 6e 65 64 20 66 6f 72 20 72 65 61 64 20 61 ┆srv' member is opened for read a┆ 0x04f200…09e600 6e 64 20 63 6f 6e 6e 65 63 74 65 64 20 74 6f 0a 74 68 65 20 73 65 72 76 65 72 27 73 20 73 74 64 ┆nd connected to the server's std┆ 0x04f200…09e600 6f 75 74 20 61 6e 64 20 73 74 64 65 72 72 2c 20 61 6e 64 20 74 68 65 20 27 77 72 69 74 65 73 72 ┆out and stderr, and the 'writesr┆ 0x04f200…09e600 76 27 20 6d 65 6d 62 65 72 20 69 73 20 6f 70 65 6e 65 64 20 66 6f 72 20 77 72 69 74 65 0a 63 6f ┆v' member is opened for write co┆ 0x04f200…09e600 6e 6e 65 63 74 65 64 20 74 6f 20 74 68 65 20 73 65 72 76 65 72 27 73 20 73 74 64 69 6e 2e 20 49 ┆nnected to the server's stdin. I┆ 0x04f200…09e600 6e 20 74 68 65 20 6c 61 74 74 65 72 20 63 61 73 65 20 65 72 72 6e 6f 20 77 69 6c 6c 20 63 6f 6e ┆n the latter case errno will con┆ 0x04f200…09e600 74 61 69 6e 20 74 68 65 0a 72 65 6c 65 76 61 6e 74 20 65 72 72 6f 72 20 6e 75 6d 62 65 72 2e 0a ┆tain the relevant error number. ┆ 0x04f200…09e600 0a 20 20 20 54 68 65 20 73 72 76 63 6c 6f 73 65 28 29 20 66 75 6e 63 74 69 6f 6e 2c 20 67 69 76 ┆ The srvclose() function, giv┆ 0x04f200…09e600 65 6e 20 61 20 63 68 61 6e 6e 65 6c 20 64 65 73 63 72 69 70 74 6f 72 20 72 65 74 75 72 6e 65 64 ┆en a channel descriptor returned┆ 0x04f200…09e600 20 62 79 20 73 65 72 76 65 72 28 29 2c 0a 77 69 6c 6c 20 63 6c 6f 73 65 20 62 6f 74 68 20 66 64 ┆ by server(), will close both fd┆ 0x04f200…09e600 73 20 61 6e 64 20 6d 61 6b 65 20 74 68 65 20 73 65 72 76 65 72 20 61 72 72 61 79 20 73 6c 6f 74 ┆s and make the server array slot┆ 0x04f200…09e600 20 61 76 61 69 6c 61 62 6c 65 2e 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 77 61 69 74 0a 66 6f 72 ┆ available. It does not wait for┆ 0x04f200…09e600 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 28 69 74 20 69 73 ┆ the process to terminate (it is┆ 0x04f200…09e600 20 70 72 65 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 2c 20 77 68 69 63 68 ┆ presumed that the caller, which┆ 0x04f200…09e600 20 68 61 73 20 61 63 63 65 73 73 0a 74 6f 20 74 68 65 20 73 65 72 76 65 72 27 73 20 70 69 64 2c ┆ has access to the server's pid,┆ 0x04f200…09e600 20 77 69 6c 6c 20 68 61 76 65 20 6b 69 6c 6c 65 64 20 74 68 65 20 70 72 6f 63 65 73 73 20 69 66 ┆ will have killed the process if┆ 0x04f200…09e600 20 69 74 20 63 61 72 65 73 29 2e 0a 0a 20 20 20 54 68 65 20 73 72 76 6f 70 65 6e 28 29 20 63 6f ┆ it cares). The srvopen() co┆ 0x04f200…09e600 64 65 20 75 73 65 73 20 65 78 65 63 76 70 28 29 2c 20 73 6f 20 69 74 20 77 69 6c 6c 20 63 68 65 ┆de uses execvp(), so it will che┆ 0x04f200…09e600 63 6b 20 74 68 65 20 75 73 65 72 27 73 20 50 41 54 48 0a 76 61 72 69 61 62 6c 65 20 61 6e 64 20 ┆ck the user's PATH variable and ┆ 0x04f200…09e600 64 6f 65 73 20 6e 6f 74 20 64 65 6d 61 6e 64 20 66 75 6c 6c 20 66 69 6c 65 6e 61 6d 65 73 2e 0a ┆does not demand full filenames. ┆ 0x04f200…09e600 0a 20 20 20 43 6f 6d 70 69 6c 69 6e 67 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 77 69 74 68 20 2d ┆ Compiling this module with -┆ 0x04f200…09e600 44 4d 41 49 4e 20 79 69 65 6c 64 73 20 61 6e 20 69 6e 74 65 72 61 63 74 69 76 65 20 74 65 73 74 ┆DMAIN yields an interactive test┆ 0x04f200…09e600 65 72 2e 20 54 6f 20 74 65 73 74 0a 6f 6e 6c 79 20 74 68 65 20 72 65 61 64 20 66 72 6f 6d 20 73 ┆er. To test only the read from s┆ 0x04f200…09e600 65 72 76 65 72 2c 20 63 61 6c 6c 20 27 73 65 72 76 65 72 20 2d 72 27 3b 20 74 6f 20 74 65 73 74 ┆erver, call 'server -r'; to test┆ 0x04f200…09e600 20 6f 6e 6c 79 20 74 68 65 20 77 72 69 74 65 20 74 6f 20 73 65 72 76 65 72 2c 0a 63 61 6c 6c 20 ┆ only the write to server, call ┆ 0x04f200…09e600 27 73 65 72 76 65 72 20 2d 77 27 3b 20 74 6f 20 74 65 73 74 20 62 6f 74 68 20 66 75 6e 63 74 69 ┆'server -w'; to test both functi┆ 0x04f200…09e600 6f 6e 73 2c 20 74 79 70 65 20 27 73 65 72 76 65 72 20 2d 78 77 27 2e 20 54 79 70 65 20 73 6f 6d ┆ons, type 'server -xw'. Type som┆ 0x04f200…09e600 65 74 68 69 6e 67 20 74 6f 0a 65 61 63 68 20 27 2a 27 2e 0a 0a 42 55 47 53 0a 20 20 20 54 68 69 ┆ething to each '*'. BUGS Thi┆ 0x04f200…09e600 73 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 73 74 6f 63 6b 20 56 65 72 73 69 6f 6e ┆s will not work on stock Version┆ 0x04f200…09e600 20 37 20 73 79 73 74 65 6d 73 2c 20 62 65 63 61 75 73 65 20 74 68 65 79 20 62 6c 6f 63 6b 20 75 ┆ 7 systems, because they block u┆ 0x04f200…09e600 6e 74 69 6c 0a 35 31 32 20 62 79 74 65 73 20 68 61 76 65 20 70 69 6c 65 64 20 75 70 20 69 6e 20 ┆ntil 512 bytes have piled up in ┆ 0x04f200…09e600 61 20 70 69 70 65 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 68 6f 77 20 79 6f 75 20 64 6f 20 ┆a pipe regardless of how you do ┆ 0x04f200…09e600 74 68 65 20 72 65 61 64 73 20 61 6e 64 0a 77 72 69 74 65 73 2e 0a 0a 41 55 54 48 4f 52 0a 20 20 ┆the reads and writes. AUTHOR ┆ 0x04f200…09e600 20 45 72 69 63 20 53 2e 20 52 61 79 6d 6f 6e 64 0a 20 20 20 54 68 69 73 20 73 6f 66 74 77 61 72 ┆ Eric S. Raymond This softwar┆ 0x04f200…09e600 65 20 69 73 20 43 6f 70 79 72 69 67 68 74 20 28 43 29 20 31 39 38 39 20 62 79 20 45 72 69 63 20 ┆e is Copyright (C) 1989 by Eric ┆ 0x04f200…09e600 53 2e 20 52 61 79 6d 6f 6e 64 20 66 6f 72 20 74 68 65 20 73 6f 6c 65 20 70 75 72 70 6f 73 65 0a ┆S. Raymond for the sole purpose ┆ 0x04f200…09e600 6f 66 20 70 72 6f 74 65 63 74 69 6e 67 20 66 72 65 65 20 72 65 64 69 73 74 72 69 62 75 74 69 6f ┆of protecting free redistributio┆ 0x04f200…09e600 6e 3b 20 73 65 65 20 74 68 65 20 4c 49 43 45 4e 53 45 20 66 69 6c 65 20 66 6f 72 20 64 65 74 61 ┆n; see the LICENSE file for deta┆ 0x04f200…09e600 69 6c 73 2e 0a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆ils. **************************┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ┆********************************┆ 0x04f200…09e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 4c 49 4e 54 4c 49 42 52 41 ┆*******************/ /*LINTLIBRA┆ 0x04f200…09e600 52 59 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 6c 69 62 70 6f 72 74 2e 68 22 0a 23 69 6e 63 6c 75 ┆RY*/ #include "libport.h" #inclu┆ 0x04f200…09e600 64 65 20 22 73 65 72 76 65 72 2e 68 22 0a 0a 23 69 66 6e 64 65 66 20 70 72 69 76 61 74 65 0a 23 ┆de "server.h" #ifndef private #┆ 0x04f200…09e600 64 65 66 69 6e 65 20 70 72 69 76 61 74 65 20 73 74 61 74 69 63 0a 23 65 6e 64 69 66 0a 0a 70 72 ┆define private static #endif pr┆ 0x04f200…09e600 69 76 61 74 65 20 73 65 72 76 65 72 5f 74 20 73 65 72 76 65 72 73 5b 4d 41 58 53 45 52 56 45 52 ┆ivate server_t servers[MAXSERVER┆ 0x04f200…09e600 53 5d 3b 0a 0a 73 65 72 76 65 72 5f 74 20 2a 73 72 76 6f 70 65 6e 28 66 69 6c 65 2c 20 61 72 67 ┆S]; server_t *srvopen(file, arg┆ 0x04f200…09e600 76 29 0a 2f 2a 20 6f 70 65 6e 20 61 20 73 65 72 76 65 72 20 70 72 6f 63 65 73 73 20 2a 2f 0a 63 ┆v) /* open a server process */ c┆ 0x04f200…09e600 68 61 72 09 2a 66 69 6c 65 3b 0a 63 68 61 72 09 2a 61 72 67 76 5b 5d 3b 0a 7b 0a 20 20 20 20 69 ┆har *file; char *argv[]; { i┆ 0x04f200…09e600 6e 74 09 09 20 20 20 20 69 6e 70 69 70 65 5b 32 5d 2c 20 6f 75 74 70 69 70 65 5b 32 5d 3b 0a 20 ┆nt inpipe[2], outpipe[2]; ┆ 0x04f200…09e600 20 20 20 73 65 72 76 65 72 5f 74 09 20 20 20 20 2a 63 73 72 76 3b 0a 0a 20 20 20 20 66 6f 72 20 ┆ server_t *csrv; for ┆ 0x04f200…09e600 28 63 73 72 76 20 3d 20 73 65 72 76 65 72 73 3b 20 63 73 72 76 20 3c 20 26 73 65 72 76 65 72 73 ┆(csrv = servers; csrv < &servers┆ 0x04f200…09e600 5b 4d 41 58 53 45 52 56 45 52 53 5d 3b 20 63 73 72 76 2b 2b 29 0a 09 69 66 20 28 63 73 72 76 2d ┆[MAXSERVERS]; csrv++) if (csrv-┆ 0x04f200…09e600 3e 70 69 64 20 3d 3d 20 30 29 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 69 66 20 28 ┆>pid == 0) break; if (┆ 0x04f200…09e600 63 73 72 76 2d 3e 70 69 64 20 7c 7c 20 70 69 70 65 28 69 6e 70 69 70 65 29 20 3c 20 30 20 7c 7c ┆csrv->pid || pipe(inpipe) < 0 ||┆ 0x04f200…09e600 20 70 69 70 65 28 6f 75 74 70 69 70 65 29 20 3c 20 30 29 0a 09 72 65 74 75 72 6e 28 28 73 65 72 ┆ pipe(outpipe) < 0) return((ser┆ 0x04f200…09e600 76 65 72 5f 74 20 2a 29 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 69 66 20 28 28 63 73 72 76 2d 3e 70 ┆ver_t *)NULL); if ((csrv->p┆ 0x04f200…09e600 69 64 20 3d 20 76 66 6f 72 6b 28 29 29 20 3d 3d 20 30 29 0a 20 20 20 20 7b 0a 09 28 76 6f 69 64 ┆id = vfork()) == 0) { (void┆ 0x04f200…09e600 29 20 63 6c 6f 73 65 28 30 29 3b 0a 09 28 76 6f 69 64 29 20 63 6c 6f 73 65 28 31 29 3b 0a 09 28 ┆) close(0); (void) close(1); (┆ 0x04f200…09e600 76 6f 69 64 29 20 63 6c 6f 73 65 28 32 29 3b 0a 09 28 76 6f 69 64 29 20 64 75 70 28 69 6e 70 69 ┆void) close(2); (void) dup(inpi┆ 0x04f200…09e600 70 65 5b 30 5d 29 3b 0a 09 28 76 6f 69 64 29 20 64 75 70 28 6f 75 74 70 69 70 65 5b 31 5d 29 3b ┆pe[0]); (void) dup(outpipe[1]);┆ 0x04f200…09e600 0a 09 28 76 6f 69 64 29 20 64 75 70 28 6f 75 74 70 69 70 65 5b 31 5d 29 3b 0a 09 28 76 6f 69 64 ┆ (void) dup(outpipe[1]); (void┆ 0x04f200…09e600 29 20 63 6c 6f 73 65 28 69 6e 70 69 70 65 5b 30 5d 29 3b 0a 09 28 76 6f 69 64 29 20 63 6c 6f 73 ┆) close(inpipe[0]); (void) clos┆ 0x04f200…09e600 65 28 69 6e 70 69 70 65 5b 31 5d 29 3b 0a 09 28 76 6f 69 64 29 20 63 6c 6f 73 65 28 6f 75 74 70 ┆e(inpipe[1]); (void) close(outp┆ 0x04f200…09e600 69 70 65 5b 30 5d 29 3b 0a 09 28 76 6f 69 64 29 20 63 6c 6f 73 65 28 6f 75 74 70 69 70 65 5b 31 ┆ipe[0]); (void) close(outpipe[1┆ 0x04f200…09e600 5d 29 3b 0a 0a 09 28 76 6f 69 64 29 20 65 78 65 63 76 70 28 66 69 6c 65 2c 20 61 72 67 76 29 3b ┆]); (void) execvp(file, argv);┆ 0x04f200…09e600 0a 09 5f 65 78 69 74 28 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 63 73 72 76 2d 3e ┆ _exit(1); } if (csrv->┆ 0x04f200…09e600 70 69 64 20 3d 3d 20 2d 31 29 0a 09 72 65 74 75 72 6e 28 28 73 65 72 76 65 72 5f 74 20 2a 29 4e ┆pid == -1) return((server_t *)N┆ 0x04f200…09e600 55 4c 4c 29 3b 0a 0a 20 20 20 20 28 76 6f 69 64 29 20 63 6c 6f 73 65 28 6f 75 74 70 69 70 65 5b ┆ULL); (void) close(outpipe[┆ 0x04f200…09e600 31 5d 29 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 63 6c 6f 73 65 28 69 6e 70 69 70 65 5b 30 5d 29 ┆1]); (void) close(inpipe[0])┆ 0x04f200…09e600 3b 0a 0a 20 20 20 20 63 73 72 76 2d 3e 72 65 61 64 73 72 76 20 3d 20 6f 75 74 70 69 70 65 5b 30 ┆; csrv->readsrv = outpipe[0┆ 0x04f200…09e600 5d 3b 0a 20 20 20 20 63 73 72 76 2d 3e 77 72 69 74 65 73 72 76 20 3d 20 69 6e 70 69 70 65 5b 31 ┆]; csrv->writesrv = inpipe[1┆ 0x04f200…09e600 5d 3b 0a 20 20 20 20 72 65 74 75 72 6e 28 63 73 72 76 29 3b 0a 7d 0a 0a 76 6f 69 64 0a 73 72 76 ┆]; return(csrv); } void srv┆ 0x04f200…09e600 63 6c 6f 73 65 28 63 73 72 76 29 0a 73 65 72 76 65 72 5f 74 20 2a 63 73 72 76 3b 0a 7b 0a 20 20 ┆close(csrv) server_t *csrv; { ┆ 0x04f200…09e600 20 20 28 76 6f 69 64 29 20 63 6c 6f 73 65 28 63 73 72 76 2d 3e 72 65 61 64 73 72 76 29 3b 0a 20 ┆ (void) close(csrv->readsrv); ┆ 0x04f200…09e600 20 20 20 28 76 6f 69 64 29 20 63 6c 6f 73 65 28 63 73 72 76 2d 3e 77 72 69 74 65 73 72 76 29 3b ┆ (void) close(csrv->writesrv);┆ 0x04f200…09e600 0a 20 20 20 20 63 73 72 76 2d 3e 70 69 64 20 3d 20 30 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 4d 41 ┆ csrv->pid = 0; } #ifdef MA┆ 0x04f200…09e600 49 4e 0a 23 69 6e 63 6c 75 64 65 20 22 70 72 6f 63 6f 70 74 73 2e 68 22 0a 0a 63 68 61 72 20 2a ┆IN #include "procopts.h" char *┆ 0x04f200…09e600 50 72 6f 67 6e 61 6d 65 20 3d 20 22 73 65 72 76 65 72 22 3b 0a 63 68 61 72 20 2a 75 73 61 67 65 ┆Progname = "server"; char *usage┆ 0x04f200…09e600 20 3d 20 22 55 73 61 67 65 3a 20 73 65 72 76 65 72 20 5b 2d 72 77 78 5d 20 5b 2d 65 20 73 65 72 ┆ = "Usage: server [-rwx] [-e ser┆ 0x04f200…09e600 76 65 72 5d 22 3b 0a 0a 23 69 66 6e 64 65 66 20 70 72 69 76 61 74 65 0a 23 64 65 66 69 6e 65 20 ┆ver]"; #ifndef private #define ┆ 0x04f200…09e600 70 72 69 76 61 74 65 20 73 74 61 74 69 63 0a 23 65 6e 64 69 66 0a 0a 70 72 69 76 61 74 65 20 69 ┆private static #endif private i┆ 0x04f200…09e600 6e 74 20 72 66 6c 61 67 2c 20 77 66 6c 61 67 2c 20 78 66 6c 61 67 2c 20 63 6f 75 6e 74 3b 0a 70 ┆nt rflag, wflag, xflag, count; p┆ 0x04f200…09e600 72 69 76 61 74 65 20 63 68 61 72 20 65 78 65 62 75 66 5b 42 55 46 53 49 5a 5d 3b 0a 0a 70 72 69 ┆rivate char exebuf[BUFSIZ]; pri┆ 0x04f200…09e600 76 61 74 65 20 6f 70 74 69 6f 6e 5f 74 20 6f 70 74 69 6f 6e 73 5b 5d 20 3d 0a 7b 0a 2f 2a 0a 6f ┆vate option_t options[] = { /* o┆ 0x04f200…09e600 70 74 6c 65 74 20 20 66 69 6c 63 68 61 72 09 66 6c 61 67 09 20 20 20 20 66 72 6f 6d 20 20 20 20 ┆ptlet filchar flag from ┆ 0x04f200…09e600 20 20 74 6f 20 20 20 20 20 20 20 74 79 70 65 20 20 20 20 20 62 75 66 09 2a 2f 0a 27 65 27 2c 09 ┆ to type buf */ 'e', ┆ 0x04f200…09e600 27 5c 30 27 2c 09 30 2c 09 20 20 20 20 44 4e 43 2c 20 20 20 20 20 20 44 4e 43 2c 20 20 20 20 20 ┆'\0', 0, DNC, DNC, ┆ 0x04f200…09e600 53 54 52 49 4e 47 2c 09 65 78 65 62 75 66 2c 0a 27 72 27 2c 09 27 5c 30 27 2c 09 26 72 66 6c 61 ┆STRING, exebuf, 'r', '\0', &rfla┆ 0x04f200…09e600 67 2c 09 20 20 20 20 44 4e 43 2c 20 20 20 20 20 20 44 4e 43 2c 20 20 20 20 20 44 4e 43 2c 20 20 ┆g, DNC, DNC, DNC, ┆ 0x04f200…09e600 20 20 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 2c 0a 27 77 27 2c 09 27 5c 30 27 2c 09 26 77 66 6c ┆ (char *)NULL, 'w', '\0', &wfl┆ 0x04f200…09e600 61 67 2c 09 20 20 20 20 44 4e 43 2c 20 20 20 20 20 20 44 4e 43 2c 20 20 20 20 20 4f 50 54 49 4f ┆ag, DNC, DNC, OPTIO┆ 0x04f200…09e600 4e 2c 20 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 2c 0a 27 78 27 2c 09 27 5c 30 27 2c 09 26 78 66 ┆N, (char *)NULL, 'x', '\0', &xf┆ 0x04f200…09e600 6c 61 67 2c 09 20 20 20 20 44 4e 43 2c 20 20 20 20 20 20 44 4e 43 2c 20 20 20 20 20 4f 50 54 49 ┆lag, DNC, DNC, OPTI┆ 0x04f200…09e600 4f 4e 2c 20 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 2c 0a 27 5c 30 27 2c 09 27 5c 30 27 2c 09 30 ┆ON, (char *)NULL, '\0', '\0', 0┆ 0x04f200…09e600 2c 09 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 30 2c 20 20 20 20 20 20 20 30 2c 20 20 20 20 20 ┆, 0, 0, 0, ┆ 0x04f200…09e600 20 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 2c 0a 7d 3b 0a 0a 69 6e 74 20 6d 61 69 6e 28 61 72 67 ┆ (char *)NULL, }; int main(arg┆ 0x04f200…09e600 63 2c 20 61 72 67 76 29 0a 2f 2a 20 74 65 73 74 20 73 65 72 76 65 72 20 65 78 65 63 75 74 69 6f ┆c, argv) /* test server executio┆ 0x04f200…09e600 6e 20 2a 2f 0a 69 6e 74 09 61 72 67 63 3b 0a 63 68 61 72 09 2a 2a 61 72 67 76 3b 0a 7b 0a 20 20 ┆n */ int argc; char **argv; { ┆ 0x04f200…09e600 20 20 63 68 61 72 09 62 66 72 5b 42 55 46 53 49 5a 5d 3b 0a 20 20 20 20 73 65 72 76 65 72 5f 74 ┆ char bfr[BUFSIZ]; server_t┆ 0x04f200…09e600 09 2a 73 65 72 76 3b 0a 0a 20 20 20 20 2f 2a 20 70 72 6f 63 65 73 73 20 63 6f 6d 6d 61 6e 64 20 ┆ *serv; /* process command ┆ 0x04f200…09e600 6c 69 6e 65 20 74 6f 20 6f 76 65 72 72 69 64 65 20 2e 6e 65 77 73 72 63 20 6f 70 74 69 6f 6e 73 ┆line to override .newsrc options┆ 0x04f200…09e600 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 72 6f 63 6f 70 74 73 28 61 72 67 63 2c 20 61 72 67 76 2c ┆ */ if (procopts(argc, argv,┆ 0x04f200…09e600 20 44 4e 43 2c 20 6f 70 74 69 6f 6e 73 29 20 3d 3d 20 46 41 49 4c 29 0a 09 78 65 72 72 6f 72 30 ┆ DNC, options) == FAIL) xerror0┆ 0x04f200…09e600 28 75 73 61 67 65 29 3b 0a 0a 20 20 20 20 69 66 20 28 78 66 6c 61 67 29 09 20 20 20 20 2f 2a 20 ┆(usage); if (xflag) /* ┆ 0x04f200…09e600 68 65 72 65 27 73 20 6f 75 72 20 27 63 68 69 6c 64 27 20 74 65 73 74 65 72 20 2a 2f 0a 20 20 20 ┆here's our 'child' tester */ ┆ 0x04f200…09e600 20 7b 20 0a 09 69 66 20 28 72 66 6c 61 67 20 7c 7c 20 77 66 6c 61 67 29 0a 09 7b 0a 09 20 20 20 ┆ { if (rflag || wflag) { ┆ 0x04f200…09e600 20 28 76 6f 69 64 29 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 63 68 69 6c 64 3a 20 ┆ (void) fprintf(stderr, "child: ┆ 0x04f200…09e600 73 74 61 72 74 69 6e 67 20 75 70 5c 6e 22 29 3b 0a 0a 09 20 20 20 20 69 66 20 28 72 66 6c 61 67 ┆starting up\n"); if (rflag┆ 0x04f200…09e600 29 20 20 2f 2a 20 72 65 61 64 20 73 74 75 66 66 20 6f 66 66 20 69 6e 70 75 74 20 66 6f 72 65 76 ┆) /* read stuff off input forev┆ 0x04f200…09e600 65 72 20 61 6e 64 20 73 65 6e 64 20 73 6f 6d 65 77 68 65 72 65 20 2a 2f 0a 09 20 20 20 20 7b 0a ┆er and send somewhere */ { ┆ 0x04f200…09e600 09 09 77 68 69 6c 65 20 28 66 67 65 74 73 28 62 66 72 2c 20 42 55 46 53 49 5a 2c 20 73 74 64 69 ┆ while (fgets(bfr, BUFSIZ, stdi┆ 0x04f200…09e600 6e 29 29 0a 09 09 7b 0a 09 09 20 20 20 20 62 66 72 5b 73 74 72 6c 65 6e 28 62 66 72 29 20 2d 20 ┆n)) { bfr[strlen(bfr) - ┆ 0x04f200…09e600 31 5d 20 3d 20 27 5c 30 27 3b 0a 09 09 20 20 20 20 28 76 6f 69 64 29 20 66 70 72 69 6e 74 66 28 ┆1] = '\0'; (void) fprintf(┆ 0x04f200…09e600 73 74 64 65 72 72 2c 22 63 68 69 6c 64 3a 20 49 20 73 61 77 20 27 25 73 27 20 6f 6e 20 73 74 64 ┆stderr,"child: I saw '%s' on std┆ 0x04f200…09e600 69 6e 5c 6e 22 2c 62 66 72 29 3b 0a 09 09 20 20 20 20 62 66 72 5b 73 74 72 6c 65 6e 28 62 66 72 ┆in\n",bfr); bfr[strlen(bfr┆ 0x04f200…09e600 29 20 2d 20 31 5d 20 3d 20 27 5c 6e 27 3b 0a 09 09 20 20 20 20 69 66 20 28 77 66 6c 61 67 29 0a ┆) - 1] = '\n'; if (wflag) ┆ 0x04f200…09e600 09 09 20 20 20 20 7b 0a 0a 09 09 09 28 76 6f 69 64 29 20 66 70 72 69 6e 74 66 28 73 74 64 6f 75 ┆ { (void) fprintf(stdou┆ 0x04f200…09e600 74 2c 0a 09 09 09 20 20 20 20 22 63 68 69 6c 64 3a 20 49 20 73 65 6e 64 20 62 61 63 6b 20 27 25 ┆t, "child: I send back '%┆ 0x04f200…09e600 73 27 20 6f 6e 20 73 74 64 6f 75 74 5c 6e 22 2c 20 62 66 72 29 3b 0a 09 09 09 28 76 6f 69 64 29 ┆s' on stdout\n", bfr); (void)┆ 0x04f200…09e600 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b 0a 09 09 20 20 20 20 7d 0a 09 09 7d 0a 09 09 28 ┆ fflush(stdout); } } (┆ 0x04f200…09e600 76 6f 69 64 29 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 63 68 69 6c 64 3a 20 6e 6f ┆void) fprintf(stderr, "child: no┆ 0x04f200…09e600 20 6d 6f 72 65 20 69 6e 70 75 74 5c 6e 22 29 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 65 6c 73 ┆ more input\n"); } els┆ 0x04f200…09e600 65 09 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 6c 69 6e 65 73 20 74 6f 20 6f 75 74 70 75 ┆e /* Generate lines to outpu┆ 0x04f200…09e600 74 20 66 6f 72 65 76 65 72 20 2a 2f 0a 09 20 20 20 20 7b 0a 09 09 66 6f 72 20 28 3b 3b 29 0a 09 ┆t forever */ { for (;;) ┆ 0x04f200…09e600 09 7b 0a 09 09 20 20 20 20 28 76 6f 69 64 29 20 66 70 72 69 6e 74 66 28 73 74 64 6f 75 74 2c 22 ┆ { (void) fprintf(stdout,"┆ 0x04f200…09e600 63 68 69 6c 64 3a 20 6c 69 6e 65 20 25 64 5c 6e 22 2c 20 63 6f 75 6e 74 2b 2b 29 3b 0a 09 09 20 ┆child: line %d\n", count++); ┆ 0x04f200…09e600 20 20 20 28 76 6f 69 64 29 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b 0a 09 09 7d 0a 09 20 ┆ (void) fflush(stdout); } ┆ 0x04f200…09e600 20 20 20 7d 0a 09 20 20 20 20 65 78 69 74 28 30 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 ┆ } exit(0); } } ┆ 0x04f200…09e600 65 6c 73 65 0a 20 20 20 20 7b 0a 09 2f 2a 20 70 69 63 6b 20 6f 6e 65 20 6f 66 20 73 65 72 76 65 ┆else { /* pick one of serve┆ 0x04f200…09e600 72 27 73 20 61 76 61 74 61 72 73 20 61 73 20 61 20 74 65 73 74 65 72 20 2a 2f 0a 09 69 66 20 28 ┆r's avatars as a tester */ if (┆ 0x04f200…09e600 65 78 65 62 75 66 5b 30 5d 20 3d 3d 20 27 5c 30 27 29 0a 09 7b 0a 09 20 20 20 20 69 66 20 28 77 ┆exebuf[0] == '\0') { if (w┆ 0x04f200…09e600 66 6c 61 67 29 0a 09 09 61 72 67 76 5b 31 5d 20 3d 20 22 2d 78 72 22 3b 0a 09 20 20 20 20 65 6c ┆flag) argv[1] = "-xr"; el┆ 0x04f200…09e600 73 65 20 69 66 20 28 72 66 6c 61 67 29 0a 09 09 61 72 67 76 5b 31 5d 20 3d 20 22 2d 78 77 22 3b ┆se if (rflag) argv[1] = "-xw";┆ 0x04f200…09e600 0a 09 20 20 20 20 65 6c 73 65 0a 09 20 20 20 20 7b 0a 09 09 28 76 6f 69 64 29 20 66 70 72 69 6e ┆ else { (void) fprin┆ 0x04f200…09e600 74 66 28 22 73 65 72 76 65 72 3a 20 6e 6f 20 73 65 72 76 65 72 20 73 70 65 63 69 66 69 65 64 5c ┆tf("server: no server specified\┆ 0x04f200…09e600 6e 22 29 3b 0a 09 09 65 78 69 74 28 31 29 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 65 6c 73 65 20 ┆n"); exit(1); } } else ┆ 0x04f200…09e600 2f 2a 20 61 73 73 75 6d 65 20 2d 65 20 77 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 ┆/* assume -e was the only argume┆ 0x04f200…09e600 6e 74 20 67 69 76 65 6e 20 2a 2f 0a 09 20 20 20 20 61 72 67 76 20 2b 3d 20 32 3b 09 2f 2a 20 73 ┆nt given */ argv += 2; /* s┆ 0x04f200…09e600 6b 69 70 20 22 73 65 72 76 65 72 22 20 61 6e 64 20 22 2d 65 22 20 2a 2f 0a 0a 09 2f 2a 20 74 72 ┆kip "server" and "-e" */ /* tr┆ 0x04f200…09e600 79 20 74 6f 20 66 6f 72 6b 20 61 6e 64 20 74 61 6c 6b 20 74 6f 20 74 68 65 20 73 65 72 76 65 72 ┆y to fork and talk to the server┆ 0x04f200…09e600 20 2a 2f 0a 09 69 66 20 28 28 73 65 72 76 20 3d 20 73 72 76 6f 70 65 6e 28 61 72 67 76 5b 30 5d ┆ */ if ((serv = srvopen(argv[0]┆ 0x04f200…09e600 2c 20 61 72 67 76 29 29 20 3d 3d 20 28 73 65 72 76 65 72 5f 74 20 2a 29 4e 55 4c 4c 29 0a 09 7b ┆, argv)) == (server_t *)NULL) {┆ 0x04f200…09e600 0a 09 20 20 20 20 28 76 6f 69 64 29 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 73 65 ┆ (void) fprintf(stderr, "se┆ 0x04f200…09e600 72 76 65 72 3a 20 63 6f 75 6c 64 6e 27 74 20 72 75 6e 20 27 25 73 27 5c 6e 22 2c 20 61 72 67 76 ┆rver: couldn't run '%s'\n", argv┆ 0x04f200…09e600 5b 30 5d 29 3b 0a 09 20 20 20 20 65 78 69 74 28 31 29 3b 0a 09 7d 0a 09 65 6c 73 65 0a 09 20 20 ┆[0]); exit(1); } else ┆ 0x04f200…09e600 20 20 28 76 6f 69 64 29 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 73 65 72 76 65 72 3a ┆ (void) fprintf(stderr,"server:┆ 0x04f200…09e600 20 73 65 72 76 65 72 20 27 25 73 27 20 73 70 61 77 6e 65 64 20 4f 4b 5c 6e 22 2c 61 72 67 76 5b ┆ server '%s' spawned OK\n",argv[┆ 0x04f200…09e600 30 5d 29 3b 0a 0a 09 2f 2a 20 68 65 72 65 27 73 20 74 68 65 20 61 63 74 75 61 6c 20 74 65 73 74 ┆0]); /* here's the actual test┆ 0x04f200…09e600 20 6c 6f 6f 70 20 2a 2f 0a 09 66 6f 72 20 28 3b 3b 29 0a 09 7b 0a 09 20 20 20 20 69 66 20 28 66 ┆ loop */ for (;;) { if (f┆ 0x04f200…09e600 70 75 74 73 28 22 2a 20 22 2c 73 74 64 6f 75 74 29 2c 20 66 67 65 74 73 28 62 66 72 2c 20 42 55 ┆puts("* ",stdout), fgets(bfr, BU┆ 0x04f200…09e600 46 53 49 5a 2c 20 73 74 64 69 6e 29 20 3d 3d 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 0a 09 09 ┆FSIZ, stdin) == (char *)NULL) ┆ 0x04f200…09e600 62 72 65 61 6b 3b 0a 09 20 20 20 20 65 6c 73 65 0a 09 20 20 20 20 7b 0a 09 09 69 66 20 28 77 66 ┆break; else { if (wf┆ 0x04f200…09e600 6c 61 67 29 0a 09 09 7b 0a 09 09 20 20 20 20 69 66 20 28 73 72 76 70 75 74 73 28 62 66 72 2c 20 ┆lag) { if (srvputs(bfr, ┆ 0x04f200…09e600 73 65 72 76 29 20 3d 3d 20 4e 55 4c 4c 29 0a 09 09 09 70 65 72 72 6f 72 28 22 77 72 69 74 69 6e ┆serv) == NULL) perror("writin┆ 0x04f200…09e600 67 20 74 6f 20 73 65 72 76 65 72 22 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 72 66 6c 61 67 29 ┆g to server"); } if (rflag)┆ 0x04f200…09e600 0a 09 09 7b 0a 09 09 20 20 20 20 69 66 20 28 73 72 76 67 65 74 73 28 62 66 72 2c 20 42 55 46 53 ┆ { if (srvgets(bfr, BUFS┆ 0x04f200…09e600 } 0x09e600…2821f1 Opaque[0x1e3bf1]