output$=FNTitlecase(FNlower(source$))
DEF FNTitlecase(A$)
LOCAL B$,A%,C%,P%,S%,I%,L%,ac%:B$=A$:nextcap%=TRUE:elide%=FALSE:P%=0:S%=0:W%=1
roman$="iiivviiixx"
FOR A% = 1 TO LEN(A$)
C% = ASCMID$(A$,A%)
REM test for a space, and apostrophe or a round openbracket or a hyphen - capital must follow unless s t d m ll re ve)
IF(C%=32 OR C%=39 OR C%=40 OR C%=45) THEN
nextcap%=TRUE:IF C%=39 elide%=TRUE ELSE elide%=FALSE:REM 39 is apostrophe
ENDIF
IFelide%=TRUE THEN
REM an apostrophe preceded this letter which is d, m, s or t followed by a space, so do nothing to this letter
IF ((C%=100 OR C%=109 OR C%=115 OR C%=116) AND MID$(A$,A%+1,1)=" ") elide%=FALSE:nextcap%=FALSE:REM do nothing
IF ((MID$(A$,A%,3)="ll ") OR (MID$(A$,A%,3)="re ") OR (MID$(A$,A%,3)="ve ")) elide%=FALSE:A%=A%+1:nextcap%=FALSE
ENDIF
IF nextcap% IF C% >= 97 IF C% <= 122 MID$(A$,A%,1) = CHR$(C%-32):nextcap%=FALSE
NEXT
WHILEW%>0
W%=INSTR(B$," ",P%)
IFW%>0 THEN
IFW%>S% S%=W%
word$=MID$(B$,P%,W%-P%):IF((LENword$>=1 AND LENword$<=4) AND INSTR(roman$,FNlower(word$))>0) MID$(A$,P%,W%-P%)=FNupper(word$)
ENDIF
P%=W%+1
ENDWHILE
word$=MID$(B$,S%+1):IF(LEN word$>=1 AND LEN word$<4 AND INSTR(roman$,word$)>0) MID$(A$,S%+1)=FNupper(word$)
FORI%=1 TO caps%
ac%=1
REPEAT
ac%=INSTR(B$,CHR$32+FNlower(cap$(I%)),L%):IF ac% MID$(A$,ac%+1)=FNupper(cap$(I%)):L%=ac%+LENcap$(I%)+1
UNTILac%=0 ORL%=LENA$
NEXT
= A$
DEFFNgetexceptions
LOCALI%:I%=0
C%=OPENIN("C:\ALLCAPS.txt")
IFC%>0 THEN
WHILENOTEOF#C%
i$=GET$#C%:IFASCi$<>35 AND i$>"" I%+=1
ENDWHILE
DIM cap$(I%):I%=1:PTR#C%=0
WHILE NOT EOF#C%
i$=GET$#C%:IFASCi$<>35 AND i$>"" cap$(I%)=i$:I%+=1
ENDWHILE
CLOSE#C%:C%=0
ELSE
ERROR 254, "Can't open ALLCAPS file!"
ENDIF
=I%-1