17-Oct-87 13:32:58-MDT,12639;000000000000 Return-Path: Received: from nems.ARPA by SIMTEL20.ARPA with TCP; Sat, 17 Oct 87 13:32:35 MDT Received: by nems.ARPA id AA24633; Sat, 17 Oct 87 15:32:49 edt Message-Id: <8710171932.AA24633@nems.ARPA> Date: 17 Oct 87 15:32 EDT From: science@nems.ARPA (Mark Zimmermann) Subject: tnx for files! ... fixtext, etc. To: rthum@simtel20.ARPA Thanks for the files that are coming in! Don't worry about the missing issues of delphi & usenet ... perhaps they were never sent out? Anyway, appended below are fixtextword.hqx and fixtext.c files, for fixing big text files against Word 3.01 bug (when a falls on a 64kB boundary).... sent them to yesterday or so, so they should be coming into their archives soon too. Best, ^z ------ /* fixtextWord.c -- by Mark^Zimmermann, 19871014-16.... * * This little effort cleans up a text file so that MicroSoft * Word 3.01 doesn't barf when it encounters a at a 64 kB * boundary ... it simply changes all such offensive 's to * characters, in place ... perhaps the easiest way out. * The bug in Word 3.01 was discovered and documented by Peter Gergely * (GERGELY(at)DREA-XX.ARPA) and Gavin Hemphill.... * * Written in Lightspeed C ... my first real "Mac-ish" program, * (that is, not UNIX-like) based on LSC's MiniEdit example, lobotomized. * Please send improvements and suggestions to me: * science(at)NEMS.ARPA; * [75066,2044] on CompuServe; * Mark^Zimmermann, 9511 Gwyndale Dr., Silver Spring, MD 20910, USA; * telephone 301-565-2166. * * Thank you! ^z */ /* I don't know if all of these #includes are necessary.... */ #include #include #include #include #include #include #include #include #include #include #include #include #include "StdFilePkg.h" /* prototypes for my functions ... I do love prototypes! */ void main (void); void ChangeCRtoSP (void); int getCharacter (long pos); void setCharacter (long pos, int c); void WrapAround (void); int GetFileToFix (Str255 *fn, int *vRef); void pStrCopy (char *p1, char *p2); void GiveMsg (void); void giveUp (void); int refNum; WindowPtr wptr; /* main routine to initialize everything under the sun (is all this * really necessary?) and then get the name of the file to fix ... if * it opens ok, fix it and then we're done.... */ void main() { Str255 fn, ermsg; int vRef; InitGraf (&thePort); InitFonts (); FlushEvents (everyEvent, 0); InitWindows (); InitMenus (); TEInit (); InitDialogs (0L); InitCursor (); MaxApplZone (); GiveMsg (); if (GetFileToFix (&fn, &vRef)) if (FSOpen (&fn, vRef, &refNum) == noErr) { ChangeCRtoSP (); FSClose (refNum); } else giveUp (); } /* routine to change a at a 64kB boundary into a space, and give * a little user feedback while doing so.... */ void ChangeCRtoSP () { long fsize, i; if (GetEOF (refNum, &fsize) != noErr) giveUp (); ShowWindow (wptr); MoveTo (4, 15); for (i = 65535; i < fsize; i += 65536) if (getCharacter (i) == '\r') { setCharacter (i, ' '); DrawString ("\p*"); WrapAround (); } else { DrawString ("\p."); WrapAround (); } MoveTo (4, 135); FlushEvents (everyEvent, 0); DrawString ("\pClick mouse button to exit...."); while (! Button()) ; } /* routine to get the character at position 'pos' in our file */ int getCharacter (pos) long pos; { long count = 1; int c; if (SetFPos (refNum, fsFromStart, pos) != noErr) giveUp (); if (FSRead (refNum, &count, &c) != noErr) giveUp (); return (c >> 8); } /* routine to set the character at position 'pos' to be whatever we * want (in this case, a space).... */ void setCharacter (pos, c) long pos; int c; { long count = 1; c <<= 8; if (SetFPos (refNum, fsFromStart, pos) != noErr) giveUp (); if (FSWrite (refNum, &count, &c) != noErr) giveUp (); } /* routine to wrap the line of dots and stars around when it gets too * long for the window ... wrap-around occurs at 6 MB or so per line, * and I've never seen vertical wrap-around, though presumably it will * happen around 60 MB or so.... */ void WrapAround () { Point pt; GetPen (&pt); if (pt.h >= 400) MoveTo (4, pt.v + 15); if (pt.v >= 135) MoveTo (4, 15); } /* following variables and routine do the standard files dialog * to get the name of the file to fix ... cribbed from the MiniEdit * example that comes with LSC.... */ static Point SFGwhere = { 90, 82 }; static SFReply reply; int GetFileToFix (fn, vRef) Str255 *fn; int *vRef; { SFTypeList myTypes; myTypes[0]='TEXT'; SFGetFile( SFGwhere, "\p", 0L, 1, myTypes, 0L, &reply); if (reply.good) { pStrCopy( (char *)reply.fName, (char *)fn); *vRef = reply.vRefNum; return(1); } else return(0); } /* routine to copy a pascal string from one place to another.... used in * above Standard Files routine.... */ void pStrCopy( p1, p2 ) register char *p1, *p2; { register int len; len = *p2++ = *p1++; while (--len>=0) *p2++=*p1++; } /* routine to give a message to the user upon start-up of the program.... */ void GiveMsg() { Rect r; SetRect (&r, 50, 60, 462, 200); SetPort ((wptr = NewWindow (0L, &r, "\p", 1, 1, -1L, 0, 0L))); TextFont (0); MoveTo (4, 15); DrawString ("\pThis program changes 's at 64kB boundaries to 's"); MoveTo (4, 30); DrawString ("\pto avoid a bug in Microsoft Word 3.01 discovered by"); MoveTo (4, 45); DrawString ("\pPeter Gergely & Gavin Hemphill. Each character changed"); MoveTo (4, 60); DrawString ("\pwill cause a '*' to be printed."); MoveTo (4, 90); DrawString ("\pThis program is by Mark^Zimmermann, science(at)NEMS.ARPA,"); MoveTo (4, 105); DrawString ("\p[75066,2044] CompuServe, and was written in LightSpeed C."); MoveTo (4, 120); DrawString ("\pWhen asked, pick a text file to be fixed, or choose 'Cancel'"); MoveTo (4, 135); DrawString ("\pto quit. Click the mouse button to continue...."); while (! Button()) ; FlushEvents (everyEvent, 0); HideWindow (wptr); } /* routine to give up with a beep if an error occurs during opening the * file or fixing it.... */ void giveUp () { SysBeep (10); ExitToShell (); } (This file must be converted with BinHex 4.0) :#fCTH(4PH(4AEh*N!%&38%a$9%aD)!#3"a$qK)X!N!3"!*!$%&!!!!p3!*!$V[r m1!*K!2VbCbj+XN!fCb*$kJ"QG!G+%@F1d[`!$&(+#fCTH(4PH(4AEh*N!J#3!d& 38%`rN!3J!*!*39"36$q3"#!!N"HGQmN'!*!'%2jK!2pU8LX!B4!V!''3!#J!,'` !!4T5!'B)%#J!(B%V!'!`'53C9%NR@3"NiNPNeNTTrrTRd%K"B3$lZNK"B-C1G5m b)$BJAfIf)8N!%K&M!#`a3!!Z3qJ!(4,M)S&(mL"1YdPR"NTVrrjQe(!#Y`PR"NS VrrpQb&0!C[+A85@3!#!fB!#3!`(8!5S",Kj$E'PMDb"YEh9cC5"LGA4dEfiJG'm JCAKTG#k3"!#3"6Y8D'Pc)("bEfGbB@dJBfKKEQGPFb!mBh)q*h-JBA3J0M4V3L" LEh9ZC'&bD@9c)(4[)$acF'&MC6iRFc0dEb"KGQpTC#"K)'*eCb"TEL"0D@0bEh0 [CR3J9fpbC#!c,M!a)'4TFf0[GQ9bC@3JBRNh8'9dCA)J4f9bCf9XH5!Q)%GKGQP Z)%KPEA"SD@aX,L!J4@&MD#"MD'&bB@0dCA)JBfKKEQGPC"phD@aX)'0KGA0P)'% J*bSR)(4[)'*P)("bD@jdC@3Z194SDA-JF(*[Ch*KE5"TFb"LH5"0BA*VAPTTE@e PFQeKEQiX)(0MD@9ZBf8SBA3T6N908bj"8P"",$PE0c8`0MBX-M!d0&dJ3fpYF(9 6CA*fC5`JB@jN)(GKFb"hFQPdG'9Z)'PZ)%aTCfKd8h"PC@3J3bim9fKPEL"KFfY PC#`JF'PMDb"K)(4PH(3JCQPXC5"dEb"LC5"QDAKPC#`JEh)JBfK[Eh0P)#G$B@j MC@`R!$"dEb"aG@Pd,L!J3faTBfXJG'KP)'e[GA0P)'*eG(4[EL"dEb"MEfjdD@j eC5k3"!#3"!3!"!%@!*!$#!#3!eS!8J#3#!M'J&%!!8j@rIj)EIrmU'kSrMmmrrp #Cdkk!k+T%UN`UFa#TkPlU&"1ZJE-6VS#KNKZrIj)E[m!6VS"iN"R,P@25'l r!$mZrIj)EIlH6VS%a$!I5N"Q%Nkk!#"9McmYrYj1ZJ9m-"pJ"%kk!d41ANje68& *6L#3"%j@rrK9McmYrYj)E[rm6VS&%$!I5N"R"%kk!a`[,IlJU48r2!!%2c`!$kL 6,A`!!2q3!rKJ3#mZrrK1ZJ"f@)m-3!!0CK`r2!!J,blrq%kk!,CFMdKj!*!%U)4 1ZJ%!B!a)H3#3!`+SK%kk!2)'VJ!"!!$rq#!ZrrL`V[rmEEBr2!!%2c`!KkL62cc rrd*R6VS#VNKj!*!$"+L%9BqTG"!I5J"RpNjH6R9$5%&14d9$8Nj@rrT`!5e!rra 9McmYrYir2!!",bi!#%kk"#``(dT!C`41ZJ*J9Bmr,IlH5'lrr%KZrrT1ZJ*b-"p +3'F%6VS#4$!ZrrVJ3%jH6R9(494$5%&538j@rra`!5e!rr``,J!-i8Jp3!!-9Bm r,IlH2c`!!5mZ!!K1ZJ21-"p+3'F%6VS#!P@22bhqhNKZrra)EJ!-6VS#'$!I5N" R"%kk!HC1ANje8d983dK"8N&19[rm5'lrr+LD$'i"N!$rrQd32c`!"$!Zrr`'3!! 22`#SN`aZ!)Irr'd+2c`!"$mm!!qSNdjH6R9A8N&339*298j@rr!YI&4&@&6rm#m YrZ4)H3#3!b4#Tcmm!!&)E[r`3UG)EIlS6VS'HNSYrZKR'LmZ!!K)EIlb6VS!(P# 2)'i!$$#YrZj`!@!#F!"1ANje4d984NP-49419J!!51F"'#KZ!!JQEJ!-3G05Ld2 88S`3%4#!5)!q!'!+3G05Ld288S`3N90(5NGXm%cI')"1ANje8&088N028&P19[r i5'lrq$mm!$)r2!!m2c`"cMmm!-LSTeQ23UG)E[ri5(N!N!-Q(c`!!6mm!!&)H2r r3QG#TkN6)&mV52lJ5&#SFd*RU)Fr2!!%2c`!$kL65(N!N!-SU)3r2!!%2c`!(UL 65(N!N!0NU)3r2!!%2c`!,DL65(N!N!1BU)3r2!!%2c`!2+L65(N!N!23U)3r2!! %2c`!@UL65(N!N!2`U)3r2!!%2c`!DDL65(N!!!%UU)3r2!!%2c`!H+L65(N!!!& NU)3r2!!%2c`!KkL65(N!!!'LU)49MkPd%"p+!'If2ccrrd*R6VS!(LmYrZ#T&Nj H6R9(59C&690()$mm!!UTb+Rd6R8LAb!I,`QJ-Nje,hJ#m!!%6R8[H!,d!!41G9( "B!*3`8j@rmj"l[r1)@i!#!!J-@i!%!!B)Qi!$#&4!#4#D!!X3UJ!,NS"CJ5J!Q! #S!-p3!!5)Qi!$#+S!#K1AL*Ihr`!N!-+6Y&19[r!3Hlr`#&Z!"!!%M&Z!"3!&N* S!"bJ"ce!!"BLEJ!--UJ!&L!S!$$JJ1+!`1J!2Z1!iB!LEJ!))S"1AL*Ihr`!N!- 16Y&19[r!3Hlr`#&Z!!`!%U!828!!%#*Z!!JbU!!@6PiLAe#26Y&19[r!3Hlr`#& Z!!S!%M&Z!!J!&U!928!!$NjH)PpFMdl46PEr`%(Zrm!aEJ!)!"BKEJ!+!"+J%ce !!!j1AL*IA)p1d8j@rl""l[q`)@i!%J!5-@i!%!!@3LJ!'U!)5N"Q&N*S!"bJ$#! )3qJ!)#,Z!!JLVJ!-S!dp3!!@6PiLAprm!*!$$Nl46PErcN(ZrmiKEJ!1!")aEJ! -!"C#+!!D3LJ!'d+S!"bJ!#*Z!!JbU!!B28!!%NjH)&rIr!#3!`T1d%j@rmj"l[r 1-@i!$!!BS"Jp3!!1)Qi!##+S!#j1AL*IA)p1d8j@rmj"l[r1-@i!$J!B-@i!$!! X)@i!#!!ZS%3p3!!36PiLAe#26Y&19[r13HlrcM&Z!!`!'+!428!!$L*Z!!JLU!! F6PiLAeb26Y&19[r13HlrcM&Z!!`!'#&Z!!J!(+!528!!$NjH)PpFMdl46PErcN( ZrmiaEJ!)!"LJ!6e!!!T1AL"I9)p1d%j@rl""l[q`)@i!$J!5-@i!$!!@3LJ!'N* S!"bJ$$e!!"*"k!!J)Qi!#(!3S#j1AL*Ihr`!N!-+6Y&19[q`3HlrX#&Z!!i!%M& Z!!`!&N)S!"T#D!!FS!a$k!!J)'i!#(!3S#j"l[q`S!dp3!!56PiLAprm!*!$#Nl 46PErcN(ZrmiKEJ!1!")aEJ!-!"C#+!!D)@i!#!!FS!Xp3!!56PiLAprm!*!$#Nl 46PErcN(ZrmiKEJ!+!")aEJ!)!"C#+!!DS!Np3!!16PiLAeb26Y'J,%lk!G!LAb" IS&G1qJ(%)PmJ6k!Ch[`!$Nlk!EBLAb"IS#e1qJ'X5MJ#MQSU)(J"-%2i!43J#*! !NA3-X)*P&L*4)FJ"&#+!3K%LH!+U)SJJJY'T!!a1GD"M6R@J0Nlk!A5K'Lp)!!4 1qJ&U)PmJAk!E6[S"ALpi!UB!"%lk!9`[H!+U!!41qJ&5)PmJ(k%L,SK1qJ%q)Pm JAk!M6[S"0#*I)&qJ*5k!DJC#Pdlk!541qJ%H)PmJ(b"IS#41qJ%8)PmJAk%Q,SK 1qJ%))PmJAk%S,SK1qJ$k)PmJ(b"IS#G1qJ$`)PmJ(k%H,SK1qJ$N)PmJAk!I6[S !fL*I)&qJ)5k!DJC#Pdlk!-T1qJ$%)PmJ(b"IS#"1qJ#k)PmJAk&),SK1qJ#ZS"` [3!!%6[S!V#*IS4dL##"I))%ZJ%lk!*)LAb!IS%`ZJ%lk!)BLAb!IS%"1qJ"q)Pm J(k"06[S!G#*I)&qJ+dlk!'SLAb"IS#P1qJ"J)PmJAk!U6[S!9L*I)&qJ58lk!%` LAb"IS%T1qJ"#)PmJAk",6[S!1#pi!bJ!"%je)KmJ(b*I)&qJ,L*"6[S!)#pi!3J !"%lk!"irH!)J!!41G5pi!6!!"%lk!!a`!#m*-F!#)%jeF!"JpR3")&mr!Lm)VHT d!dlkrr4d!Nlkrqjd"%lkrqJ!N!-D!0%!h`%4!LX#e`-(!aN$+`-p!dm$B30c!i8 !!!3)!*!$#J#3"h*#H!T+RFiX2&088P01ZJ-U3IVrjL#-6VS!Q%kk!TT#CdKj!!$ rrdK[!!4)9cmm!!%L1[r+6V83!%lk!(")jrri2Lm!2&$i#PjCMbmm3dp%46m(UD! J(fFk*N!N8`JU!*!$!@FN5K*U)%kk!fkJ+9Q2,ca$8N9-2`HTS%kk!fiJ(fF3)%" 1ZJ"f!P*rrNcI(rp1GA!2UFN[#%kk!N`JAkRb,`K1ZJ*#)&qTmdkk!MUTp&Q2,ca D49*23QHTS#4A@Bm[2%4"9%&#CkQJ)&FJ8#*i#3JN8Q!1-YKQ#M)DB!*#'9(*rrb lb@EZUD1TSeQ2,ca%8N9-3QHTS#"I*%fJ*5m))&$L3'!5*!db'!L"!!"R"#3krZE 9XK!!8FMrl+QM6R8JAc)B0"L`@&I*rrT+3QIq6[!Jr#"I-KJd',#B9mRrqNT#Crj 1m#$k)&mb'$3BX%*Z#T!!3@d'd%""m!!#-""RrNl`!!!J,`!%,d%!"#)[!!J[A`! %51Fm!#3!*J&)3X6$+!!U!8K&b-A84%K#N!2!`G##60m!2#)I6R8J,`!%,d%!"#) [!!J[A`!%51Fa!%kk!*a-h`#-)Kp1G5![!!3[33!%)Lm!##pI!!4)jc%!6VS!I#! "60m!M#)I6R8J,`!%,d%!"#)[!!J[A`!%51Fa!%kk!#a-h`#-)Kp1G5![!!3[33! %)Lm!##pI!!4)jc%!6VS!$#!"60m!M#)I6R9+J'SF5S&U$%5!4)&1ZJ!J4)&1G85 !6VS!&N5!4)&1G8U"DJT%J8kk!!C%J%je,M`!!2rrXS"M"L)!F!"1GE#(BJb!`8K !-J"#3%K!6R@bKf)D,J"#3%K!J-&)3%K(2J")4il"-!G)4c)(6R8N!#B"iSMLLE+ (B[L!`F#(-J2#`#i$5%I1`%K(dSGP#*+#BJ4%J8je8d"Jj$)mUI"$q[f!6VS!5M) mUI*$q[h16VS!2M)mUI0$q[h-6VS!-M)mUI4$q[h+6[S!*Nkk!1!b2+R`6VS!0M) mUI*1ZJ!Z-MbTmdkk!#Bb2+Rd6[S!(M!"S8BN5(!-T4i`!D"(-2a1Z5$*-2a1q5$ +6R8`!D&')QJ!#+!I-!%J5D"(6R9#1!TH@Bm["N*RUD!QAeQ2,`ZTT5BI)%XS!ci m!)&J%JD%!!"rrPQ2,`Br"e*(UD!JAe@2,`LTTM!I#!!!"@EJ82J+AL!%S4iS5#m ,UD)J5b!$1JFq2!#"QNGJ%PQ2,`Br"e*(UD!JAb!m!!"rrLm))&!L60R!S#kTSe( 0rq#Ca%je!*!%3IVrqL#[!!41G8(krr!J%'B#6R9#N!!J3%l3)%Y+H!+1DJ3@%dj eS'N@!%je5RJ#MQS%&S01G5",%!1JDNje!*!$D!#3!hJ!!!%L!*!$@!#3!b!!#$m m!!'Tm!%S2c`!!DR`!6`r2!!"UI!"8$mm!!'Tm!&X2c`!!DR`!D)r2!!"UI!"`Mm m!!'Tm!(N2c`!!DR`!J3r2!!"UI!$aMmm!!'Tm!!!2c`!!UR`!!!"!*!$%&!!!!p 3!*!$VJ!$J&`#P!#3!a`!VJ!&8e458`#3!c*D49*2!*!$2N4"9%%!N!0+4&*&6!# 3!eC$6d4&!!)!BN0548`!N!1'!!$rr`J!N!Rrr`J!!GJ!N!ErrbJ!!H!!N!ErrbJ !!H`!N!8#rrmi!!(`!*!&!Irr(!!+f!#3"[rr+!!1j!#3"3,rrbJ!#VS!N!398!: -------