fortunate-3.1/0000755000175000017500000000000010163270005014156 5ustar gurkangurkan00000000000000fortunate-3.1/English.lproj/0000755000175000017500000000000010117325461016702 5ustar gurkangurkan00000000000000fortunate-3.1/English.lproj/Fortunate.gorm/0000755000175000017500000000000010121764654021622 5ustar gurkangurkan00000000000000fortunate-3.1/English.lproj/Fortunate.gorm/objects.gorm0000644000175000017500000002415710121764654024152 0ustar gurkangurkan00000000000000GNUstep archive00002a96:00000021:0000013a:00000001:01GSNibContainer1NSObject01NSMutableDictionary1 NSDictionary&+01NSString& %  MenuItem701 NSMenuItem0±& % Copy Fortune0±&%c&&ÿ%01NSImage01NSMutableString&% common_2DCheckMark0 ±0 ±& %  common_2DDash’%0 ±&% Button50 1 NSButton1 NSControl1 NSView1 NSResponder% C< C0 B` AÀ  B` AÀ&0 1 NSMutableArray1NSArray&%01 NSButtonCell1 NSActionCell1NSCell0±&%select01NSFont%&&&&&&&&%’0±&0±&&&&0±& % GormNSMenu01NSMenu0±&%Info0± &0±0±& % Info Panel...0±&&&ÿ%°° ’%0±0±&%Preferences...0±&&&ÿ%°° ’%0±& %  MenuItem80±0±&%Print0 ±&%p&&ÿ%°° ’%0!±& %  MenuItem10°0"±&% Button60#± % A C Cf A€  Cf A€&0$± &%0%±0&±&%use bundled datafiles0'±0(±&% common_SwitchOff°&&&&&&&&%’0)±&0*±&0+±0,±&% common_SwitchOn&&&0-±& %  MenuItem9°0.±& %  MenuItem110/±°00±&&&ÿ%°° 2submenuAction:%°01±02±& % Fortunate03± &°/04±05±& % New Fortune06±&%n&&ÿ%°° ’%°°07±08±&%Hide09±&%h&&ÿ%°° ’%0:±0;±&%Quit0<±&%q&&ÿ%°° ’%0=±&% Button70>± % A Bî C' A€  C' A€&0?± &%0@±0A±&%allow offensive fortunes°'°&&&&&&&&%’0B±&0C±&°+&&&0D±& %  MenuItem12°0E±&% Button80F± % B† A  Bè AÀ  Bè AÀ&0G± &%0H±0I±&%Revert to saved°&&&&&&&&%’0J±&0K±&&&&0L±&%ApplicationDelegate0M1 GSNibItem°L  &0N±& %  MenuItem13°0O±& %  GormNSMenu1°0P±&%Button0Q± % C< A  B` AÀ  B` AÀ&0R± &%0S±0T±&%Save°&&&&&&&&%’0U±&0V±&&&&0W±& %  MenuItem14°40X±& %  MenuItem15°70Y±& %  MenuItem16°:0Z±& % TextField0[1 NSTextField% A C€ Cj A  Cj A&0\± &%0]1NSTextFieldCell0^±&%Full path to fortune program:0_±% A@&&&&&&&&%’0`1NSColor0a±&%NSNamedColorSpace0b±&%System0c±&%textBackgroundColor0d±°a°b0e±& % textColor’0f±&%GSCustomClassMap0g±&0h±& % Prefs Panel0i±&%FontomaticPanel0j±& % MainDocument0k±°j  &0l±&%PreferencesController0m±°l  &0n±& % NSVisible0o± &0p1NSWindow%  CŽ€ B€&% C’€ D!€0q± %  CŽ€ B€  CŽ€ B€&0r± &0s±°a0t±&%System0u±&%windowBackgroundColor0v±&%Window0w±& % Fortunate°w ?€ B F@ F@%0x±0y±&%NSApplicationIcon0z±& % Main Window°p0{±&%NSMenu°10|±& %  TextField10}±% A Cƒ C- Aš  C- Aš&0~± &%0±0€±&°_&&&&&&&&%’0±°a0‚±&%System0ƒ±&%textBackgroundColor0„±°a°‚0…±& % textColor’0†±& %  TextField20‡±% A BŠ Cj A  Cj A&0ˆ± &%0‰±0б&%Font for display Fortunes°_&&&&&&&&%’0‹±°a0Œ±&%System0±&%textBackgroundColor0ޱ°a°Œ0±& % textColor’0±& %  TextField30‘±% A Bx C- Aš  C- Aš&0’± &%0“±0”±&°_&&&&&&&&%’0•±°a0–±&%System0—±&%textBackgroundColor0˜±°a°–0™±& % textColor’°h0š1GSWindowTemplate1GSClassSwapper°i1NSPanel%  C{ C›€& % Cg D6€0›± %  C{ C›€  C{ C›€&0œ± &°Q0± % @À A  B` AÀ  B` AÀ&0ž± &%0Ÿ±0 ±&%Cancel°&&&&&&&&%’0¡±&0¢±&&&&°[°}°‡°‘0£± % C< Bl B` AÀ  B` AÀ&0€± &%0¥±0б&%select°&&&&&&&&%’0§±&0š±&&&&0©± % A Cq Cf A€  Cf A€&0ª± &%0«±0¬±&%use bundled fortune program°'°&&&&&&&&%’0­±&0®±&°+&&&0¯± % C< C€ B` AÀ  B` AÀ&0°± &%0±±0²±&%select°&&&&&&&&%’0³±&0ޱ&&&&0µ±% A CH BÒ A  BÒ A&0¶± &%0·±0ž±&%Fortune datafiles°_&&&&&&&&%’0¹±°a0º±&%System0»±&%textBackgroundColor0Œ±°a°º0œ±& % textColor’0Ÿ±% A C3 C- Aš  C- Aš&0¿± &%0À±0Á±&°&&&&&&&&%’0±°a0ñ&%System0ı&%textBackgroundColor0ű°a°Ã0Ʊ& % textColor’° °#°>°F0DZ°a0ȱ&%System0ɱ&%windowBackgroundColor0ʱ&%Window0˱&%Panel°Ë ?€ B F@ F@%°x0̱& %  TextField4°µ0ͱ& %  TextField5°Ÿ0α&%NSOwner0ϱ& % NSApplication0б& %  MenuItem1°:0ѱ&%MenuItem°70Ò±& %  MenuItem2°/0Ó±&% Button1°0Ô±& %  MenuItem3°0Õ±&% Button2°£0Ö±& %  MenuItem4°0×±&% Button3°©0ر& %  MenuItem5°70Ù±&% Button4°¯0Ú±& %  MenuItem6°40Û± &==0Ü1NSNibConnector°z0ݱ&%NSOwner0Þ±°{°Ý0ß±°Ø°{0à1NSNibControlConnector°Ø0á±&%NSFirst0â±&%hide:0㱰а{0䱰аá0å±& % terminate:0æ±°l°Ý0ç±°L°Ý0è±°j°Ý0é1NSNibOutletConnector°L°j0ê±& % mainDocument0ë±°j°z0ì±& % mainWindow0í±°j°l0î±&%prefsController0ﱰݰL0ð±&% delegate0ñ±°Ò°{0ò±°Ò°{0ó±&%submenuAction:0ô±°O°Ò0õ±°Ô°O0ö±°Ô°á0÷±&%orderFrontStandardInfoPanel:0ø±°Ö°O0ù±°Ö°j0ú±& %  showPrefs:0û±°h°Ý0ü±°l°h0ý±& %  prefsPanel0þ±°P0ÿ±°ÓP±°P°lP±& %  savePrefs:P±°Ó°lP±& %  cancelPrefs:P±°ZP±°|P±°†P±°P±°ÕP ±°l°|P ±& %  pathFieldP ±°l°P ±& %  fontFieldP ±°l°jP±&% mainDocP±°Õ°lP±&% showFontPanel:P±°j°hP±& %  prefsPanelP±°Ú°{P±°-°{P±°!°{P±°Ú°jP±&% loadNewFortuneAndUpdateWindow:P±°-°jP±& %  copyFortune:P±°!°jP±& %  printFortune:P±°×P±°l°×P±&%useBundledFortuneCheckBoxP±°×°lP ±&% useBundledFortuneClicked:P!±°ÙP"±°ÌP#±°ÍP$±° P%±°"P&±°=P'±°EP(±°l°ÍP)±&%datfilesPathFieldP*±°l°"P+±&% useBundledDatfilesCheckBoxP,±°l°=P-±&%offensiveCheckBoxP.±°Ù°lP/±&% showOpenFortunePanel:P0±°"°lP1±&% useBundledDatfilesClicked:P2±°=°lP3±&% offensiveClicked:P4±°E°lP5±& %  resetPrefs:P6±° °lP7±&% showOpenDatfilesPanel:P8±°h°lP9±&%prefsControllerP:1 GSMutableSet1 NSMutableSet1!NSSet&°m°š°1°M°k°pfortunate-3.1/English.lproj/Fortunate.gorm/data.classes0000644000175000017500000001135010121764654024112 0ustar gurkangurkan00000000000000{ ApplicationDelegate = { Actions = ( ); Outlets = ( mainDocument ); Super = NSObject; }; FirstResponder = { Actions = ( "activateContextHelpMode:", "alignCenter:", "alignJustified:", "alignLeft:", "alignRight:", "arrangeInFront:", "cancel:", "capitalizeWord:", "changeColor:", "checkSpelling:", "close:", "complete:", "copy:", "copyFont:", "copyRuler:", "cut:", "delete:", "deleteBackward:", "deleteForward:", "deleteToBeginningOfLine:", "deleteToBeginningOfParagraph:", "deleteToEndOfLine:", "deleteToEndOfParagraph:", "deleteToMark:", "deleteWordBackward:", "deleteWordForward:", "deminiaturize:", "deselectAll:", "fax:", "hide:", "hideOtherApplications:", "indent:", "loosenKerning:", "lowerBaseline:", "lowercaseWord:", "makeKeyAndOrderFront:", "miniaturize:", "miniaturizeAll:", "moveBackward:", "moveBackwardAndModifySelection:", "moveDown:", "moveDownAndModifySelection:", "moveForward:", "moveForwardAndModifySelection:", "moveLeft:", "moveRight:", "moveToBeginningOfDocument:", "moveToBeginningOfLine:", "moveToBeginningOfParagraph:", "moveToEndOfDocument:", "moveToEndOfLine:", "moveToEndOfParagraph:", "moveUp:", "moveUpAndModifySelection:", "moveWordBackward:", "moveWordBackwardAndModifySelection:", "moveWordForward:", "moveWordForwardAndModifySelection:", "newDocument:", "ok:", "open:", "openDocument:", "orderBack:", "orderFront:", "orderFrontColorPanel:", "orderFrontDataLinkPanel:", "orderFrontHelpPanel:", "orderFrontStandardAboutPanel:", "orderFrontStandardInfoPanel:", "orderOut:", "pageDown:", "pageUp:", "paste:", "pasteAsPlainText:", "pasteAsRichText:", "pasteFont:", "pasteRuler:", "performClose:", "performMiniaturize:", "performZoom:", "print:", "raiseBaseline:", "revertDocumentToSaved:", "runPageLayout:", "runToolbarCustomizationPalette:", "saveAllDocuments:", "saveDocument:", "saveDocumentAs:", "saveDocumentTo:", "scrollLineDown:", "scrollLineUp:", "scrollPageDown:", "scrollPageUp:", "scrollViaScroller:", "selectAll:", "selectLine:", "selectNextKeyView:", "selectParagraph:", "selectPreviousKeyView:", "selectText:", "selectToMark:", "selectWord:", "showContextHelp:", "showGuessPanel:", "showHelp:", "showWindow:", "stop:", "subscript:", "superscript:", "swapWithMark:", "takeDoubleValueFrom:", "takeFloatValueFrom:", "takeIntValueFrom:", "takeObjectValueFrom:", "takeStringValueFrom:", "terminate:", "tightenKerning:", "toggle:", "toggleContinuousSpellChecking:", "toggleRuler:", "toggleToolbarShown:", "toggleTraditionalCharacterShape:", "transpose:", "transposeWords:", "turnOffKerning:", "turnOffLigatures:", "underline:", "unhide:", "unhideAllApplications:", "unscript:", "uppercaseWord:", "useAllLigatures:", "useStandardKerning:", "useStandardLigatures:", "yank:", "zoom:", "activateMainWindow:", "loadNewFortuneAndUpdateWindow:", "copyFortune:", "showPrefs:", "showInfo:", "savePrefs:", "cancelPrefs:", "showFontPanel:", "changeFont:", "printFortune:", "useBundledFortuneClicked:", "useBundledDatfilesClicked:", "resetPrefs:", "showOpenFortunePanel:", "showOpenDatfilesPanel:", "offensiveClicked:", "newAction:" ); Super = NSObject; }; FontomaticPanel = { Actions = ( "changeFont:" ); Outlets = ( prefsController ); Super = NSPanel; }; MainDocument = { Actions = ( "activateMainWindow:", "loadNewFortuneAndUpdateWindow:", "copyFortune:", "showPrefs:", "showInfo:", "printFortune:" ); Outlets = ( mainWindow, prefsPanel, infoPanel, prefsController ); Super = NSObject; }; PreferencesController = { Actions = ( "showPrefs:", "savePrefs:", "cancelPrefs:", "showFontPanel:", "changeFont:", "useBundledFortuneClicked:", "useBundledDatfilesClicked:", "resetPrefs:", "showOpenFortunePanel:", "showOpenDatfilesPanel:", "offensiveClicked:" ); Outlets = ( prefsPanel, pathField, fontField, mainDoc, useBundledFortuneCheckBox, useBundledDatfilesCheckBox, datfilesPathField, offensiveCheckBox ); Super = NSObject; }; }fortunate-3.1/English.lproj/Fortunate.gorm/data.info0000644000175000017500000000027010121764654023407 0ustar gurkangurkan00000000000000GNUstep archive00002a96:00000003:00000003:00000000:01GormFilePrefsManager1NSObject%01NSString&%Latest Version0±& % Typed Streamfortunate-3.1/PB/0000755000175000017500000000000010117325435014466 5ustar gurkangurkan00000000000000fortunate-3.1/PB/Fortunate3.0.pbproj/0000755000175000017500000000000010120331713020137 5ustar gurkangurkan00000000000000fortunate-3.1/PB/Fortunate3.0.pbproj/chris.pbxuser0000644000175000017500000000527207264225677022721 0ustar gurkangurkan00000000000000// !$*UTF8*$! { 00ECD0BF007FC3F67F000001 = { activeArgIndex = 2147483647; argumentStrings = ( ); debuggerPlugin = GDBDebugging; dylibVariantSuffix = ""; enableDebugStr = 1; environmentEntries = ( ); isa = PBXExecutable; sourceDirectories = ( ); }; 00F0843A007FD0AC7F000001 = { activeExec = 0; customExecs = { }; targetExecs = { macosx = ( 00F08444007FD0F77F000001, ); }; }; 00F08444007FD0F77F000001 = { activeArgIndex = 2147483647; argumentStrings = ( ); debuggerPlugin = GDBDebugging; dylibVariantSuffix = ""; enableDebugStr = 1; environmentEntries = ( ); isa = PBXExecutable; sourceDirectories = ( ); }; 29B97313FDCFA39411CA2CEA = { activeBuildStyle = 4A9504CCFFE6A4B311CA0CBA; activeTarget = 29B97326FDCFA39411CA2CEA; addToTargets = ( 29B97326FDCFA39411CA2CEA, ); perUserDictionary = { PBXWorkspaceConfiguration = { ContentSize = "{955, 599}"; LeftSlideOut = { ActiveTab = 0; Frame = "{{0, 23}, {955, 576}}"; Split0 = { ActiveTab = 1; Frame = "{{175, 0}, {780, 576}}"; Split0 = { Frame = "{{0, 203}, {780, 373}}"; }; SplitCount = 1; Tab0 = { Debugger = { Frame = "{{0, 0}, {484, 208}}"; Split0 = { Frame = "{{0, 25}, {484, 183}}"; Split0 = { Frame = "{{0, 0}, {236, 183}}"; }; Split1 = { Frame = "{{245, 0}, {239, 183}}"; }; SplitCount = 2; }; SplitCount = 1; Tab0 = { Frame = "{{0, 0}, {100, 50}}"; }; TabCount = 1; }; Frame = "{{0, 0}, {484, 208}}"; LauncherConfigVersion = 4; }; Tab1 = { Frame = "{{0, 0}, {780, 178}}"; LauncherConfigVersion = 3; Runner = { Frame = "{{0, 0}, {780, 178}}"; }; }; Tab2 = { BuildMessageFrame = "{{0, 0}, {784, 119}}"; BuildTranscriptFrame = "{{0, 128}, {784, 66}}"; Frame = "{{0, 0}, {780, 192}}"; }; Tab3 = { Frame = "{{0, 0}, {661, 295}}"; }; TabCount = 4; }; SplitCount = 1; Tab0 = { Frame = "{{0, 0}, {150, 576}}"; }; Tab1 = { Frame = "{{0, 0}, {200, 100}}"; }; Tab2 = { Frame = "{{0, 0}, {200, 576}}"; Split0 = { Frame = "{{0, 0}, {200, 280}}"; }; Split1 = { Frame = "{{0, 289}, {200, 287}}"; }; SplitCount = 2; }; Tab3 = { Frame = "{{0, 0}, {250, 100}}"; }; TabCount = 4; }; WindowLoc = "{5, 23}"; }; }; }; 29B97326FDCFA39411CA2CEA = { activeExec = 0; targetExecs = { macosx = ( 00ECD0BF007FC3F67F000001, ); }; }; } fortunate-3.1/PB/Fortunate3.0.pbproj/christo.pbxuser0000644000175000017500000000567207446127117023260 0ustar gurkangurkan00000000000000// !$*UTF8*$! { 00F0843A007FD0AC7F000001 = { activeExec = 0; targetExecs = { macosx = ( F569E42F023B01270100021C, ); }; }; 29B97313FDCFA39411CA2CEA = { activeBuildStyle = 4A9504CCFFE6A4B311CA0CBA; activeTarget = 29B97326FDCFA39411CA2CEA; perUserDictionary = { PBXWorkspaceConfiguration = { ContentSize = "{960, 638}"; LeftSlideOut = { ActiveTab = 0; Frame = "{{0, 23}, {960, 615}}"; Split0 = { ActiveTab = 2; Frame = "{{243, 0}, {717, 615}}"; Split0 = { Frame = "{{0, 216}, {717, 399}}"; }; SplitCount = 1; Tab0 = { Debugger = { Frame = "{{0, 0}, {484, 208}}"; Split0 = { Frame = "{{0, 25}, {484, 183}}"; Split0 = { Frame = "{{0, 0}, {236, 183}}"; }; Split1 = { Frame = "{{245, 0}, {239, 183}}"; }; SplitCount = 2; }; SplitCount = 1; Tab0 = { Frame = "{{0, 0}, {100, 50}}"; }; Tab1 = { Frame = "{{0, 0}, {100, 50}}"; }; TabCount = 2; }; Frame = "{{0, 0}, {484, 208}}"; LauncherConfigVersion = 4; }; Tab1 = { Frame = "{{0, 0}, {717, 208}}"; LauncherConfigVersion = 3; Runner = { Frame = "{{0, 0}, {717, 208}}"; }; }; Tab2 = { BuildMessageFrame = "{{0, 0}, {719, 137}}"; BuildTranscriptFrame = "{{0, 146}, {719, 48}}"; Frame = "{{0, 0}, {717, 192}}"; }; Tab3 = { Frame = "{{0, 0}, {717, 295}}"; }; TabCount = 4; }; SplitCount = 1; Tab0 = { Frame = "{{0, 0}, {219, 615}}"; }; Tab1 = { ClassesFrame = "{{0, 0}, {202, 56}}"; Frame = "{{0, 0}, {200, 100}}"; MembersFrame = "{{0, 65}, {202, 35}}"; OptionsSetName = "Hierarchy, all classes"; }; Tab2 = { Frame = "{{0, 0}, {200, 100}}"; }; Tab3 = { Frame = "{{0, 0}, {200, 615}}"; Split0 = { Frame = "{{0, 0}, {200, 299}}"; }; Split1 = { Frame = "{{0, 308}, {200, 307}}"; }; SplitCount = 2; }; Tab4 = { Frame = "{{0, 0}, {250, 100}}"; }; TabCount = 5; }; }; }; wantsIndex = 1; wantsSCM = -1; }; 29B97326FDCFA39411CA2CEA = { activeExec = 0; targetExecs = { macosx = ( F569E430023B01270100021C, ); }; }; F569E42F023B01270100021C = { activeArgIndex = 2147483647; argumentStrings = ( ); debuggerPlugin = GDBDebugging; dylibVariantSuffix = ""; enableDebugStr = 1; environmentEntries = ( ); isa = PBXExecutable; shlibInfoDictList = ( ); sourceDirectories = ( ); }; F569E430023B01270100021C = { activeArgIndex = 2147483647; argumentStrings = ( ); debuggerPlugin = GDBDebugging; dylibVariantSuffix = ""; enableDebugStr = 1; environmentEntries = ( ); isa = PBXExecutable; shlibInfoDictList = ( ); sourceDirectories = ( ); }; } fortunate-3.1/PB/Fortunate3.0.pbproj/project.pbxproj0000644000175000017500000004600607446127117023243 0ustar gurkangurkan00000000000000// !$*UTF8*$! { archiveVersion = 1; classes = { }; objectVersion = 34; objects = { 00F08411007FC78D7F000001 = { children = ( 00F08412007FC78D7F000001, ); isa = PBXVariantGroup; name = Info.nib; path = ""; refType = 4; }; 00F08412007FC78D7F000001 = { isa = PBXFileReference; name = English; path = English.lproj/Info.nib; refType = 4; }; 00F08413007FC78D7F000001 = { children = ( 00F08414007FC78D7F000001, ); isa = PBXVariantGroup; name = Preferences.nib; path = ""; refType = 4; }; 00F08414007FC78D7F000001 = { isa = PBXFileReference; name = English; path = English.lproj/Preferences.nib; refType = 4; }; 00F08415007FC78D7F000001 = { fileRef = 00F08411007FC78D7F000001; isa = PBXBuildFile; settings = { }; }; 00F08416007FC78D7F000001 = { fileRef = 00F08413007FC78D7F000001; isa = PBXBuildFile; settings = { }; }; 00F08417007FC7E97F000001 = { children = ( 00F08418007FC7E97F000001, ); isa = PBXVariantGroup; name = Fortunate3.nib; path = ""; refType = 4; }; 00F08418007FC7E97F000001 = { isa = PBXFileReference; name = English; path = English.lproj/Fortunate3.nib; refType = 4; }; 00F08419007FC7E97F000001 = { fileRef = 00F08417007FC7E97F000001; isa = PBXBuildFile; settings = { }; }; 00F0841A007FC82B7F000001 = { children = ( 00F0841B007FC82B7F000001, 00F0841C007FC82B7F000001, 00F0841D007FC82B7F000001, 00F0841E007FC82B7F000001, 00F0841F007FC82B7F000001, ); isa = PBXGroup; name = Headers; refType = 4; }; 00F0841B007FC82B7F000001 = { isa = PBXFileReference; path = ApplicationDelegate.h; refType = 4; }; 00F0841C007FC82B7F000001 = { isa = PBXFileReference; path = FontomaticPanel.h; refType = 4; }; 00F0841D007FC82B7F000001 = { isa = PBXFileReference; path = FortuneTextView.h; refType = 4; }; 00F0841E007FC82B7F000001 = { isa = PBXFileReference; path = MainDocument.h; refType = 4; }; 00F0841F007FC82B7F000001 = { isa = PBXFileReference; path = PreferencesController.h; refType = 4; }; 00F08420007FC82B7F000001 = { isa = PBXFileReference; path = ApplicationDelegate.m; refType = 4; }; 00F08421007FC82B7F000001 = { isa = PBXFileReference; path = FontomaticPanel.m; refType = 4; }; 00F08422007FC82B7F000001 = { isa = PBXFileReference; path = FortuneTextView.m; refType = 4; }; 00F08423007FC82B7F000001 = { isa = PBXFileReference; path = MainDocument.m; refType = 4; }; 00F08424007FC82B7F000001 = { isa = PBXFileReference; path = PreferencesController.m; refType = 4; }; 00F08425007FC82B7F000001 = { fileRef = 00F0841B007FC82B7F000001; isa = PBXBuildFile; settings = { }; }; 00F08426007FC82B7F000001 = { fileRef = 00F0841C007FC82B7F000001; isa = PBXBuildFile; settings = { }; }; 00F08427007FC82B7F000001 = { fileRef = 00F0841D007FC82B7F000001; isa = PBXBuildFile; settings = { }; }; 00F08428007FC82B7F000001 = { fileRef = 00F0841E007FC82B7F000001; isa = PBXBuildFile; settings = { }; }; 00F08429007FC82B7F000001 = { fileRef = 00F0841F007FC82B7F000001; isa = PBXBuildFile; settings = { }; }; 00F0842A007FC82B7F000001 = { fileRef = 00F08420007FC82B7F000001; isa = PBXBuildFile; settings = { }; }; 00F0842B007FC82B7F000001 = { fileRef = 00F08421007FC82B7F000001; isa = PBXBuildFile; settings = { }; }; 00F0842C007FC82B7F000001 = { fileRef = 00F08422007FC82B7F000001; isa = PBXBuildFile; settings = { }; }; 00F0842D007FC82B7F000001 = { fileRef = 00F08423007FC82B7F000001; isa = PBXBuildFile; settings = { }; }; 00F0842E007FC82B7F000001 = { fileRef = 00F08424007FC82B7F000001; isa = PBXBuildFile; settings = { }; }; 00F0842F007FC8527F000001 = { isa = PBXFileReference; path = Fortunate.tiff; refType = 4; }; 00F08431007FD0397F000001 = { children = ( 00F08432007FD0637F000001, 00F08433007FD0637F000001, 00F08434007FD0637F000001, 00F08435007FD0637F000001, 00F08446007FD1537F000001, ); isa = PBXGroup; name = "C Sources"; refType = 4; }; 00F08432007FD0637F000001 = { isa = PBXFileReference; path = fortune.c; refType = 4; }; 00F08433007FD0637F000001 = { isa = PBXFileReference; path = pathnames.h; refType = 4; }; 00F08434007FD0637F000001 = { isa = PBXFileReference; path = regexpr.c; refType = 4; }; 00F08435007FD0637F000001 = { isa = PBXFileReference; path = regexpr.h; refType = 4; }; 00F0843A007FD0AC7F000001 = { buildPhases = ( 00F0843C007FD0F77F000001, 00F0843F007FD0F77F000001, 00F08442007FD0F77F000001, 00F08443007FD0F77F000001, ); buildSettings = { DEBUGGING_SYMBOLS = NO; OPTIMIZATION_CFLAGS = "-O2"; OTHER_CFLAGS = ""; OTHER_LDFLAGS = ""; OTHER_REZFLAGS = ""; PRODUCT_NAME = fortune; REZ_EXECUTABLE = YES; SECTORDER_FLAGS = ""; WARNING_CFLAGS = "-Wmost -Wno-four-char-constants -Wno-unknown-pragmas"; }; dependencies = ( ); isa = PBXToolTarget; name = fortune; productInstallPath = /usr/local/bin; productName = fortune; productReference = 00F0843B007FD0F77F000001; shouldUseHeadermap = 0; }; 00F0843B007FD0F77F000001 = { isa = PBXExecutableFileReference; path = fortune; refType = 3; }; 00F0843C007FD0F77F000001 = { buildActionMask = 2147483647; files = ( 00F0843D007FD0F77F000001, 00F0843E007FD0F77F000001, 00F08448007FD1537F000001, ); isa = PBXHeadersBuildPhase; name = Headers; }; 00F0843D007FD0F77F000001 = { fileRef = 00F08433007FD0637F000001; isa = PBXBuildFile; settings = { }; }; 00F0843E007FD0F77F000001 = { fileRef = 00F08435007FD0637F000001; isa = PBXBuildFile; settings = { }; }; 00F0843F007FD0F77F000001 = { buildActionMask = 2147483647; files = ( 00F08440007FD0F77F000001, 00F08441007FD0F77F000001, ); isa = PBXSourcesBuildPhase; name = Sources; }; 00F08440007FD0F77F000001 = { fileRef = 00F08434007FD0637F000001; isa = PBXBuildFile; settings = { }; }; 00F08441007FD0F77F000001 = { fileRef = 00F08432007FD0637F000001; isa = PBXBuildFile; settings = { }; }; 00F08442007FD0F77F000001 = { buildActionMask = 2147483647; files = ( ); isa = PBXFrameworksBuildPhase; name = "Frameworks & Libraries"; }; 00F08443007FD0F77F000001 = { buildActionMask = 2147483647; files = ( ); isa = PBXRezBuildPhase; name = "ResourceManager Resources"; }; 00F08446007FD1537F000001 = { isa = PBXFileReference; path = strfile.h; refType = 4; }; 00F08448007FD1537F000001 = { fileRef = 00F08446007FD1537F000001; isa = PBXBuildFile; settings = { }; }; 00F2FF11008112B47F000001 = { isa = PBXFileReference; path = FortunateIcon.icns; refType = 4; }; 00F2FF12008112B47F000001 = { fileRef = 00F2FF11008112B47F000001; isa = PBXBuildFile; settings = { }; }; //000 //001 //002 //003 //004 //020 //021 //022 //023 //024 0294CB63008119F07F000001 = { isa = PBXTargetDependency; target = 00F0843A007FD0AC7F000001; }; 0294CB6400811B377F000001 = { children = ( 0294CB6500811B377F000001, 0294CB6600811B377F000001, 0294CB6700811B377F000001, 0294CB6800811B377F000001, 0294CB6900811B377F000001, 0294CB6A00811B377F000001, 0294CB6B00811B377F000001, 0294CB6C00811B377F000001, 0294CB6D00811B377F000001, 0294CB6E00811B377F000001, 0294CB6F00811B377F000001, 0294CB7000811B377F000001, 0294CB7100811B377F000001, 0294CB7200811B377F000001, ); isa = PBXGroup; path = datfiles; refType = 4; }; 0294CB6500811B377F000001 = { isa = PBXFileReference; path = zippy.dat; refType = 4; }; 0294CB6600811B377F000001 = { isa = PBXFileReference; path = fortunes; refType = 4; }; 0294CB6700811B377F000001 = { isa = PBXFileReference; path = fortunes.dat; refType = 4; }; 0294CB6800811B377F000001 = { isa = PBXFileReference; path = "fortunes-o.dat"; refType = 4; }; 0294CB6900811B377F000001 = { isa = PBXFileReference; path = fortunes2.dat; refType = 4; }; 0294CB6A00811B377F000001 = { isa = PBXFileReference; path = "fortunes2-o.dat"; refType = 4; }; 0294CB6B00811B377F000001 = { isa = PBXFileReference; path = fortunes2; refType = 4; }; 0294CB6C00811B377F000001 = { isa = PBXFileReference; path = "fortunes2-o"; refType = 4; }; 0294CB6D00811B377F000001 = { isa = PBXFileReference; path = limerick; refType = 4; }; 0294CB6E00811B377F000001 = { isa = PBXFileReference; path = startrek; refType = 4; }; 0294CB6F00811B377F000001 = { isa = PBXFileReference; path = limerick.dat; refType = 4; }; 0294CB7000811B377F000001 = { isa = PBXFileReference; path = zippy; refType = 4; }; 0294CB7100811B377F000001 = { isa = PBXFileReference; path = "fortunes-o"; refType = 4; }; 0294CB7200811B377F000001 = { isa = PBXFileReference; path = startrek.dat; refType = 4; }; 0294CB7300811B377F000001 = { fileRef = 0294CB6500811B377F000001; isa = PBXBuildFile; settings = { }; }; 0294CB7400811B377F000001 = { fileRef = 0294CB6600811B377F000001; isa = PBXBuildFile; settings = { }; }; 0294CB7500811B377F000001 = { fileRef = 0294CB6700811B377F000001; isa = PBXBuildFile; settings = { }; }; 0294CB7600811B377F000001 = { fileRef = 0294CB6800811B377F000001; isa = PBXBuildFile; settings = { }; }; 0294CB7700811B377F000001 = { fileRef = 0294CB6900811B377F000001; isa = PBXBuildFile; settings = { }; }; 0294CB7800811B377F000001 = { fileRef = 0294CB6A00811B377F000001; isa = PBXBuildFile; settings = { }; }; 0294CB7900811B377F000001 = { fileRef = 0294CB6B00811B377F000001; isa = PBXBuildFile; settings = { }; }; 0294CB7A00811B377F000001 = { fileRef = 0294CB6C00811B377F000001; isa = PBXBuildFile; settings = { }; }; 0294CB7B00811B377F000001 = { fileRef = 0294CB6D00811B377F000001; isa = PBXBuildFile; settings = { }; }; 0294CB7C00811B377F000001 = { fileRef = 0294CB6E00811B377F000001; isa = PBXBuildFile; settings = { }; }; 0294CB7D00811B377F000001 = { fileRef = 0294CB6F00811B377F000001; isa = PBXBuildFile; settings = { }; }; 0294CB7E00811B377F000001 = { fileRef = 0294CB7000811B377F000001; isa = PBXBuildFile; settings = { }; }; 0294CB7F00811B377F000001 = { fileRef = 0294CB7100811B377F000001; isa = PBXBuildFile; settings = { }; }; 0294CB8000811B377F000001 = { fileRef = 0294CB7200811B377F000001; isa = PBXBuildFile; settings = { }; }; 0294CB8100811C3F7F000001 = { buildActionMask = 2147483647; dstPath = datfiles; dstSubfolderSpec = 7; files = ( 0294CB7300811B377F000001, 0294CB7400811B377F000001, 0294CB7500811B377F000001, 0294CB7600811B377F000001, 0294CB7700811B377F000001, 0294CB7800811B377F000001, 0294CB7900811B377F000001, 0294CB7A00811B377F000001, 0294CB7B00811B377F000001, 0294CB7C00811B377F000001, 0294CB7D00811B377F000001, 0294CB7E00811B377F000001, 0294CB7F00811B377F000001, 0294CB8000811B377F000001, ); isa = PBXCopyFilesBuildPhase; name = "Copy Files"; }; 0294CB82008122157F000001 = { buildActionMask = 2147483647; dstPath = ""; dstSubfolderSpec = 7; files = ( 0294CB83008122157F000001, ); isa = PBXCopyFilesBuildPhase; name = "Copy Files"; }; 0294CB83008122157F000001 = { fileRef = 00F0843B007FD0F77F000001; isa = PBXBuildFile; settings = { }; }; //020 //021 //022 //023 //024 //040 //041 //042 //043 //044 043355C9FE30361CC02AAC07 = { buildActionMask = 2147483647; files = ( ); isa = PBXRezBuildPhase; name = "ResourceManager Resources"; }; //040 //041 //042 //043 //044 //080 //081 //082 //083 //084 080E96DDFE201D6D7F000001 = { children = ( 00F08420007FC82B7F000001, 00F08421007FC82B7F000001, 00F08422007FC82B7F000001, 00F08423007FC82B7F000001, 00F08424007FC82B7F000001, ); isa = PBXGroup; name = Classes; refType = 4; }; 089C165CFE840E0CC02AAC07 = { children = ( 089C165DFE840E0CC02AAC07, ); isa = PBXVariantGroup; name = InfoPlist.strings; refType = 4; }; 089C165DFE840E0CC02AAC07 = { fileEncoding = 10; isa = PBXFileReference; name = English; path = English.lproj/InfoPlist.strings; refType = 4; }; 089C165EFE840E0CC02AAC07 = { fileRef = 089C165CFE840E0CC02AAC07; isa = PBXBuildFile; settings = { }; }; //080 //081 //082 //083 //084 //100 //101 //102 //103 //104 1058C7A0FEA54F0111CA2CBB = { children = ( 1058C7A1FEA54F0111CA2CBB, ); isa = PBXGroup; name = "Linked Frameworks"; refType = 4; }; 1058C7A1FEA54F0111CA2CBB = { isa = PBXFrameworkReference; name = Cocoa.framework; path = /System/Library/Frameworks/Cocoa.framework; refType = 0; }; 1058C7A2FEA54F0111CA2CBB = { children = ( 29B97325FDCFA39411CA2CEA, 29B97324FDCFA39411CA2CEA, ); isa = PBXGroup; name = "Other Frameworks"; refType = 4; }; 1058C7A3FEA54F0111CA2CBB = { fileRef = 1058C7A1FEA54F0111CA2CBB; isa = PBXBuildFile; settings = { }; }; //100 //101 //102 //103 //104 //170 //171 //172 //173 //174 17587328FF379C6511CA2CBB = { isa = PBXApplicationReference; path = Fortunate.app; refType = 3; }; //170 //171 //172 //173 //174 //190 //191 //192 //193 //194 19C28FACFE9D520D11CA2CBB = { children = ( 17587328FF379C6511CA2CBB, 00F0843B007FD0F77F000001, ); isa = PBXGroup; name = Products; refType = 4; }; //190 //191 //192 //193 //194 //290 //291 //292 //293 //294 29B97313FDCFA39411CA2CEA = { buildStyles = ( 4A9504CCFFE6A4B311CA0CBA, 4A9504CDFFE6A4B311CA0CBA, ); isa = PBXProject; mainGroup = 29B97314FDCFA39411CA2CEA; projectDirPath = ""; targets = ( 29B97326FDCFA39411CA2CEA, 00F0843A007FD0AC7F000001, ); }; 29B97314FDCFA39411CA2CEA = { children = ( 00F0841A007FC82B7F000001, 080E96DDFE201D6D7F000001, 00F08431007FD0397F000001, 29B97315FDCFA39411CA2CEA, 29B97317FDCFA39411CA2CEA, 29B97323FDCFA39411CA2CEA, 19C28FACFE9D520D11CA2CBB, ); isa = PBXGroup; name = Fortunate3.0; path = ""; refType = 4; }; 29B97315FDCFA39411CA2CEA = { children = ( 29B97316FDCFA39411CA2CEA, ); isa = PBXGroup; name = "Other Sources"; path = ""; refType = 4; }; 29B97316FDCFA39411CA2CEA = { isa = PBXFileReference; path = main.m; refType = 4; }; 29B97317FDCFA39411CA2CEA = { children = ( 0294CB6400811B377F000001, 00F08417007FC7E97F000001, 00F08411007FC78D7F000001, 00F08413007FC78D7F000001, 089C165CFE840E0CC02AAC07, 00F0842F007FC8527F000001, 00F2FF11008112B47F000001, ); isa = PBXGroup; name = Resources; path = ""; refType = 4; }; 29B97323FDCFA39411CA2CEA = { children = ( 1058C7A0FEA54F0111CA2CBB, 1058C7A2FEA54F0111CA2CBB, ); isa = PBXGroup; name = Frameworks; path = ""; refType = 4; }; 29B97324FDCFA39411CA2CEA = { isa = PBXFrameworkReference; name = AppKit.framework; path = /System/Library/Frameworks/AppKit.framework; refType = 0; }; 29B97325FDCFA39411CA2CEA = { isa = PBXFrameworkReference; name = Foundation.framework; path = /System/Library/Frameworks/Foundation.framework; refType = 0; }; 29B97326FDCFA39411CA2CEA = { buildPhases = ( 29B97327FDCFA39411CA2CEA, 29B97328FDCFA39411CA2CEA, 29B9732BFDCFA39411CA2CEA, 29B9732DFDCFA39411CA2CEA, 043355C9FE30361CC02AAC07, 0294CB8100811C3F7F000001, 0294CB82008122157F000001, ); buildSettings = { DEBUGGING_SYMBOLS = NO; FRAMEWORK_SEARCH_PATHS = ""; HEADER_SEARCH_PATHS = ""; INSTALL_PATH = ""; LIBRARY_SEARCH_PATHS = ""; OPTIMIZATION_CFLAGS = "-O2"; OTHER_CFLAGS = ""; OTHER_LDFLAGS = ""; PRODUCT_NAME = Fortunate; SECTORDER_FLAGS = ""; WARNING_CFLAGS = "-Wmost -Wno-four-char-constants -Wno-unknown-pragmas"; WRAPPER_EXTENSION = app; }; dependencies = ( 0294CB63008119F07F000001, ); isa = PBXApplicationTarget; name = Fortunate3.0; productInstallPath = ""; productName = Fortunate3.0; productReference = 17587328FF379C6511CA2CBB; productSettingsXML = " CFBundleDevelopmentRegion English CFBundleDocumentTypes CFBundleExecutable Fortunate CFBundleGetInfoString 3.0 CFBundleIconFile FortunateIcon.icns CFBundleIdentifier org.Orange-Carb.Fortunate3 CFBundleInfoDictionaryVersion 6.0 CFBundleName Fortunate CFBundlePackageType APPL CFBundleShortVersionString 3.0 CFBundleSignature ???? CFBundleVersion 3.0 NSMainNibFile Fortunate3 NSPrincipalClass NSApplication "; shouldUseHeadermap = 1; }; 29B97327FDCFA39411CA2CEA = { buildActionMask = 2147483647; files = ( 00F08425007FC82B7F000001, 00F08426007FC82B7F000001, 00F08427007FC82B7F000001, 00F08428007FC82B7F000001, 00F08429007FC82B7F000001, ); isa = PBXHeadersBuildPhase; name = Headers; }; 29B97328FDCFA39411CA2CEA = { buildActionMask = 2147483647; files = ( 089C165EFE840E0CC02AAC07, 00F08415007FC78D7F000001, 00F08416007FC78D7F000001, 00F08419007FC7E97F000001, 00F2FF12008112B47F000001, ); isa = PBXResourcesBuildPhase; name = "Bundle Resources"; }; 29B9732BFDCFA39411CA2CEA = { buildActionMask = 2147483647; files = ( 29B9732CFDCFA39411CA2CEA, 00F0842A007FC82B7F000001, 00F0842B007FC82B7F000001, 00F0842C007FC82B7F000001, 00F0842D007FC82B7F000001, 00F0842E007FC82B7F000001, ); isa = PBXSourcesBuildPhase; name = Sources; }; 29B9732CFDCFA39411CA2CEA = { fileRef = 29B97316FDCFA39411CA2CEA; isa = PBXBuildFile; settings = { ATTRIBUTES = ( ); }; }; 29B9732DFDCFA39411CA2CEA = { buildActionMask = 2147483647; files = ( 1058C7A3FEA54F0111CA2CBB, ); isa = PBXFrameworksBuildPhase; name = "Frameworks & Libraries"; }; //290 //291 //292 //293 //294 //4A0 //4A1 //4A2 //4A3 //4A4 4A9504CCFFE6A4B311CA0CBA = { buildRules = ( ); buildSettings = { COPY_PHASE_STRIP = NO; OPTIMIZATION_CFLAGS = "-O0"; }; isa = PBXBuildStyle; name = Development; }; 4A9504CDFFE6A4B311CA0CBA = { buildRules = ( ); buildSettings = { COPY_PHASE_STRIP = YES; }; isa = PBXBuildStyle; name = Deployment; }; }; rootObject = 29B97313FDCFA39411CA2CEA; } fortunate-3.1/PB/English.lproj/0000755000175000017500000000000010120331713017172 5ustar gurkangurkan00000000000000fortunate-3.1/PB/English.lproj/Fortunate3.nib/0000755000175000017500000000000010120331713021773 5ustar gurkangurkan00000000000000fortunate-3.1/PB/English.lproj/Fortunate3.nib/classes.nib0000644000175000017500000000170407446126074024147 0ustar gurkangurkan00000000000000{ IBClasses = ( { CLASS = ApplicationDelegate; LANGUAGE = ObjC; OUTLETS = {mainDocument = id; }; SUPERCLASS = NSObject; }, {CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; }, { CLASS = FontomaticPanel; LANGUAGE = ObjC; OUTLETS = {mainDocument = id; }; SUPERCLASS = NSPanel; }, { ACTIONS = { activateMainWindow = id; copyFortune = id; loadNewFortuneAndUpdateWindow = id; printFortune = id; showInfo = id; showPrefs = id; }; CLASS = MainDocument; LANGUAGE = ObjC; OUTLETS = {infoPanel = id; mainWindow = id; prefsController = id; prefsPanel = id; }; SUPERCLASS = NSObject; } ); IBVersion = 1; }fortunate-3.1/PB/English.lproj/Fortunate3.nib/info.nib0000644000175000017500000000073407446126074023447 0ustar gurkangurkan00000000000000 IBEditorPositions 29 69 252 181 44 0 0 1024 746 IBFramework Version 248.0 IBOpenObjects 29 53 IBSystem Version 5Q45 fortunate-3.1/PB/English.lproj/Fortunate3.nib/objects.nib0000644000175000017500000000725207446126074024147 0ustar gurkangurkan00000000000000 typedstreamè„@„„„NSIBObjectDataà„„NSObject…’„„„NSCustomObject)”„@@„„„NSString”„+ NSApplication†…†„i–„„„NSMenuÌ”„i@@@„˜˜ Fortunate3†„„„NSMutableArray„„NSArray”™’„„„ NSMenuItemù”’™„ i@@IIi@@@@:i@„˜˜ Application†„˜˜†‚‚ÿÿÿ…„„„NSCustomResource)”–„˜˜NSImage†„˜˜NSMenuCheckmark††…„€–¥„˜˜NSMenuMixedState††„submenuAction:…’…’„𛄄„NSMutableString˜˜ Application†„™’„ ’©Ÿ„˜˜About Fortunate†¢‚ÿÿÿ…£…§……’…’…†’„ ’©Ÿ„˜˜Preferences...†¢‚‚ÿÿÿ…£…§……’…’…†’„ ’©Ÿ‚À¢¢‚‚ÿÿÿ…£…§……’…’…†’„ ’©Ÿ„˜˜Hide Fortunate†„˜˜h†‚‚ÿÿÿ…£…§……’…’…†’„ ’©Ÿ„˜˜ Hide Others†¢‚ÿÿÿ…£…§……’…’…†’„ ’©Ÿ„˜˜Show All†¢‚ÿÿÿ…£…§……’…’…†’„ ’©Ÿ‚À¢¢‚‚ÿÿÿ…£…§……’…’…†’„ ’©Ÿ„˜˜Quit Fortunate†„˜˜q†‚‚ÿÿÿ…£…§……’…’…††„˜˜ _NSAppleMenu†††’„ ’™Ÿ„˜˜File†¢‚‚ÿÿÿ…£…§¡…’…’„𛄫˜File†„™’„ ’ÀŸ„˜˜ New Fortune†„˜˜n†‚‚ÿÿÿ…£…§……’…’…†’„ ’ÀŸ‚@¢¢‚‚ÿÿÿ…£…§……’…’…†’„ ’ÀŸ„˜˜ Page Setup...†„˜˜P†‚‚ÿÿÿ…£…§……’…’…†’„ ’ÀŸ„˜˜Print...†„˜˜p†‚‚ÿÿÿ…£…§……’…’…††…††’„ ’™Ÿ„˜˜Edit†¢‚‚ÿÿÿ…£…§¡…’…’„š›„˜˜Edit†„™’„ ’ÏŸ„˜˜ Copy Fortune†„˜˜C†‚‚ÿÿÿ…£…§……’…’…†’„ ’ÏŸ„˜˜Copy†„˜˜c†‚‚ÿÿÿ…£…§……’…’…††…†††„˜˜ _NSMainMenu††•–„ ’…Ÿ„˜˜Edit†¢‚‚ÿÿÿ…£…§¡…’…’„𛄫˜Edit†„™ ’„ ’ÛŸ„˜˜Undo†„˜˜z†‚‚ÿÿÿ…£…§……’…’…†’„ ’ÛŸ„˜˜Redo†„˜˜Z†‚‚ÿÿÿ…£…§……’…’…†’„ ’ÛŸ‚@¢¢‚‚ÿÿÿ…£…§……’…’…†’„ ’ÛŸ„˜˜Cut†„˜˜x†‚‚ÿÿÿ…£…§……’…’…†’„ ’ÛŸ„˜˜Copy†„˜˜c†‚‚ÿÿÿ…£…§……’…’…†’„ ’ÛŸ„˜˜Paste†„˜˜v†‚‚ÿÿÿ…£…§……’…’…†’„ ’ÛŸ„˜˜Clear†¢‚‚ÿÿÿ…£…§……’…’…†’„ ’ÛŸ„˜˜ Select All†„˜˜a†‚‚ÿÿÿ…£…§……’…’…†’„ ’ÛŸ‚@¢¢‚‚ÿÿÿ…£…§……’…’…†’„ ’ÛŸ„˜˜Find†¢‚‚ÿÿÿ…£…§¡…’…’„𛄫˜Find†„™’„ ’öŸ„˜˜Find...†„˜˜f†‚‚ÿÿÿ…£…§……’…’…†’„ ’öŸ„˜˜ Find Next†„˜˜g†‚‚ÿÿÿ…£…§……’…’…†’„ ’öŸ„˜˜ Find Previous†„˜˜d†‚‚ÿÿÿ…£…§……’…’…†’„ ’öŸ„˜˜Use Selection for Find†„˜˜e†‚‚ÿÿÿ…£…§……’…’…†’„ ’öŸ„˜˜Scroll to Selection†„˜˜j†‚‚ÿÿÿ…£…§……’…’…††…††’„ ’ÛŸ„˜˜Spelling†¢‚‚ÿÿÿ…£…§¡…’…’„š› „™’„ ’ Ÿ„˜˜ Spelling...†„˜˜:†‚‚ÿÿÿ…£…§……’…’…†’„ ’ Ÿ„˜˜Check Spelling†„˜˜;†‚‚ÿÿÿ…£…§……’…’…†’„ ’ Ÿ„˜˜Check Spelling As You Type†¢‚‚ÿÿÿ…£…§……’…’…††…††’„ ’ÛŸ„˜˜Speech†¢‚‚ÿÿÿ…£…§¡…’…’„š›„™’„ ’Ÿ„˜˜Start speaking†¢‚‚ÿÿÿ…£…§……’…’…†’„ ’Ÿ„˜˜ Stop speaking†¢‚‚ÿÿÿ…£…§……’…’…††…†††…††™–²©–„––„˜˜ NSFontManager†…†•–Í™–ÇÀ–©Ÿ–ÊÀ–ÆÀ–„„„NSWindowTemplateø”„ iiffffi@@@@@c”˜‚`x„˜˜ Fortunate†„˜˜NSWindow†„˜˜View†„„„NSView)„„ NSResponder”’…™„ @@@@ffffffff„™†……… ˜˜’…’…’…’…†…„ffffê„c„ff’…©ª†•–#–Òϖ¯©–Õϖ·©–¹©–Ÿ™–„––„˜˜ MainDocument†…†•–­©–ÃÀ–„––„˜˜ApplicationDelegate†…†•–±©–Ï͖Ÿ™–ÀŸ–µ©–º©™–™„˜˜MainMenu†–¯„˜˜ NSMenuItem9†–Ÿ„˜˜ NSMenuItem2†–Ç„˜˜ NSMenuItem†–·„˜˜ NSMenuItem8†–²„˜˜ NSMenuItem4†–Æ„˜˜ NSMenuItem3†–Ÿ„˜˜ NSMenuItem†–'(–„˜˜Fortune†–Ê„˜˜ NSMenuItem7†–©„˜˜NSMenu†–)*–±„˜˜ NSMenuItem†–•„˜˜ File's Owner†–¹„˜˜ NSMenuItem6†–À„˜˜NSMenu†–„˜˜ Font Manager†–Ę˜ NSMenuItem9†–­„˜˜ NSMenuItem1†–µ„˜˜ NSMenuItem7†–º„˜˜ NSMenuItem5†’„„„ NSMutableSet„„NSSet”„I†’„™’„„„NSNibOutletConnectorÏ„„NSNibConnector”„@@@•)„˜˜delegate††’„D°'„˜˜ mainWindow††’„D°)'„˜˜ mainDocument††’„„„NSNibControlConnectorÏE°Ò'„˜˜ copyFortune:††’„L°²…„«˜hide:††’„L°·…„˜˜unhideAllApplications:††’„L°º…„«˜ terminate:††’„L°µ…„˜˜hideOtherApplications:††’„L°­'„˜˜ showInfo:††’„L°¯'„˜˜ showPrefs:††’„L°Ç…„«˜runPageLayout:††’„L°Ã'„˜˜loadNewFortuneAndUpdateWindow:††’„L°Ê'„˜˜ printFortune:††’„L°Õ…„˜˜copy†††’™*„@iPß²\²©Ú²™²Ù²C*²Ÿ²G8²º×²²Ö²µÛ²Vã²KÍ²­Ó²Xä²ÏŸ²Ê²I9²Õ7²Æ²Tá²Àþ²ŸÑ²¹Ù²{²Ã ²Í‘²¯Ý²•²Çü²`8²'4²±Ò²Z ²Rà²NÞ²^²#6²Ò¬²5²·Ü²))™9™’„˜˜IBCocoaFramework††fortunate-3.1/PB/English.lproj/Info.nib/0000755000175000017500000000000010120331713020634 5ustar gurkangurkan00000000000000fortunate-3.1/PB/English.lproj/Info.nib/classes.nib0000644000175000017500000000110507444012076022775 0ustar gurkangurkan00000000000000{ IBClasses = ( {CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; }, { ACTIONS = { activateMainWindow = id; copyFortune = id; loadNewFortuneAndUpdateWindow = id; showInfo = id; showPrefs = id; }; CLASS = MainDocument; LANGUAGE = ObjC; OUTLETS = {infoPanel = id; mainWindow = id; prefsController = id; prefsPanel = id; }; SUPERCLASS = NSObject; } ); IBVersion = 1; }fortunate-3.1/PB/English.lproj/Info.nib/info.nib0000644000175000017500000000064207444012076022300 0ustar gurkangurkan00000000000000 IBDocumentLocation 10 7 356 240 0 0 1024 746 IBFramework Version 248.0 IBOpenObjects 21 IBSystem Version 5Q45 fortunate-3.1/PB/English.lproj/Info.nib/objects.nib0000644000175000017500000001703307444012076023000 0ustar gurkangurkan00000000000000 typedstreamè„@„„„NSIBObjectDataà„„NSObject…’„„„NSCustomObject)”„@@„„„NSString”„+ MainDocument†…†„i–„„„ NSTextField„„ NSControl)„„NSView)„„ NSResponder”’„œ’…™„ @@@@ffffffff„„„NSMutableArray„„NSArray”™’™’„š’ž™ž…………KÈ||’ž’…’…’…„icc@„„„NSTextFieldCell=„„ NSActionCell„„NSCellA”„ii‚þ‚@„@@@@„˜˜ Version 3.0†„„„NSFont”™$„[36c]þÿLucidaGrande„f „cªªª†……„i:…’…’¢„c@@„„„NSColor”ª„@@@„˜˜System†„˜˜ controlColor†„«ª„ffƒ?*ª«††„«ª®¬„˜˜controlTextColor†„«ª¯†††’…„:…†’„„„ NSImageView›’ž™ž………„„„ NSMutableSet„„NSSet”„I’„„„NSMutableString˜˜NSFilenamesPboardType†† È0000’ž’…’…’…¡„„„ NSImageCell)Š¥‚þŠ„„„NSCustomResource)”–„˜˜NSImage†„˜˜NSApplicationIcon††š……„iii†ª†’„„„ NSScrollViewâœ’ž™‚€ž„ ™’„„„ NSClipView:œ’¿™‚Àž„ ™’„„„NSTextTemplateƄ„NSViewTemplate.œ’™‚€ž………„µŽR’„˜˜!NSTypedFilenamesPboardType:'TPIC'†’„˜˜NSTypedFilenamesPboardType:PCT†’„˜˜NSTypedFilenamesPboardType:ICO†’„˜˜!NSTypedFilenamesPboardType:'qtif'†’„˜˜!NSTypedFilenamesPboardType:'8BPS'†’„˜˜NSTypedFilenamesPboardType:fpix†’„˜˜ NSTypedFilenamesPboardType:TARGA†’„˜˜NSFilenamesPboardType†’„˜˜NSTypedFilenamesPboardType:mac†’„˜˜NeXT TIFF v4.0 pasteboard type†’„˜˜NSTypedFilenamesPboardType:TIFF†’„˜˜1NeXT Encapsulated PostScript v1.2 pasteboard type†’„˜˜!NSTypedFilenamesPboardType:'PNTG'†’„˜˜NeXT RTFD pasteboard type†’„˜˜NSTypedFilenamesPboardType:icns†’„˜˜NSTypedFilenamesPboardType:ICNS†’„˜˜NSTypedFilenamesPboardType:pdf†’„˜˜NSTypedFilenamesPboardType:rgb†’„˜˜NSTypedFilenamesPboardType:tga†’„˜˜!NSTypedFilenamesPboardType:'.SGI'†’„˜˜!NSTypedFilenamesPboardType:'GIFf'†’„˜˜NSTypedFilenamesPboardType:fax†’„˜˜NSTypedFilenamesPboardType:jpg†’„˜˜NSTypedFilenamesPboardType:FAX†’„˜˜NSTypedFilenamesPboardType:tif†’„˜˜NSTypedFilenamesPboardType:JPG†’„˜˜NSTypedFilenamesPboardType:png†’„˜˜NSTypedFilenamesPboardType:psd†’„˜˜NSTypedFilenamesPboardType:TIF†’„˜˜NSTypedFilenamesPboardType:cur†’„˜˜NSTypedFilenamesPboardType:ico†’„˜˜NSTypedFilenamesPboardType:fpx†’„˜˜NSTypedFilenamesPboardType:gif†’„˜˜NSTypedFilenamesPboardType:MAC†’„˜˜NSTypedFilenamesPboardType:bmp†’„˜˜NSTypedFilenamesPboardType:JPEG†’„˜˜#CorePasteboardFlavorType 0x6D6F6F76†’„˜˜NSTypedFilenamesPboardType:GIF†’„˜˜NSTypedFilenamesPboardType:FPX†’„˜˜NSTypedFilenamesPboardType:sgi†’„˜˜!NSTypedFilenamesPboardType:'BMPf'†’„˜˜NSTypedFilenamesPboardType:PDF†’„˜˜NSTypedFilenamesPboardType:RGB†’„˜˜NSTypedFilenamesPboardType:TGA†’„˜˜NSTypedFilenamesPboardType:PICT†’„˜˜NXTypedFilenamePboardType:tif†’„˜˜NSTypedFilenamesPboardType:BMP†’„˜˜NSTypedFilenamesPboardType:QTIF†’„˜˜NSTypedFilenamesPboardType:SGI†’„˜˜NSTypedFilenamesPboardType:FPIX†’„˜˜NSTypedFilenamesPboardType:PNG†’„˜˜NSTypedFilenamesPboardType:PNTG†’„˜˜NSTypedFilenamesPboardType:PSD†’„˜˜NSTypedFilenamesPboardType:CUR†’„˜˜!NSTypedFilenamesPboardType:'PNGf'†’„˜˜NSTypedFilenamesPboardType:pnt†’„˜˜NSTypedFilenamesPboardType:QTI†’„˜˜ NSTypedFilenamesPboardType:targa†’„˜˜!NSTypedFilenamesPboardType:'FPix'†’„˜˜Apple PDF pasteboard type†’„˜˜NSTypedFilenamesPboardType:PNT†’„˜˜NSTypedFilenamesPboardType:tiff†’„˜˜NSTypedFilenamesPboardType:pct†’„˜˜NSTypedFilenamesPboardType:eps†’„˜˜Apple PICT pasteboard type†’„˜˜!NSTypedFilenamesPboardType:'PDF '†’„˜˜*NeXT Rich Text Format v1.0 pasteboard type†’„˜˜Apple HTML pasteboard type†’„˜˜!NSTypedFilenamesPboardType:'ICO '†’„˜˜!NSTypedFilenamesPboardType:'JPEG'†’„˜˜NSStringPboardType†’„˜˜NSTypedFilenamesPboardType:pict†’„˜˜NSTypedFilenamesPboardType:qti†’„˜˜NSTypedFilenamesPboardType:qtif†’„˜˜!NSTypedFilenamesPboardType:'TIFF'†’„˜˜NSColor pasteboard type†’„˜˜NSTypedFilenamesPboardType:pntg†’„˜˜NSTypedFilenamesPboardType:jpeg†’„˜˜!NSTypedFilenamesPboardType:'EPSF'†’„˜˜!NSTypedFilenamesPboardType:'PICT'†’„˜˜NXTypedFilenamePboardType:eps†’„˜˜NXTypedFilenamePboardType:tiff††pځpڒ’…’…’…’„˜˜NSText†’„„„ NSMutableData„„NSData”™ 6„[2870c]rtfd.TXT.rtf+ã #TXT.rtf¶Û {\rtf1\mac\ansicpg10000\cocoartf100 {\fonttbl\f0\fswiss\fcharset77 Helvetica;\f1\fswiss\fcharset77 Helvetica-Oblique;} {\colortbl;\red255\green255\blue255;\red0\green0\blue0;} \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural \f0\fs26 \cf2 This is Fortunate, which provides wisdom and humour to all.\ \ The interface is written and maintained by:\ Chris Saldanha < \f1\i csaldanh@orange-carb.org \f0\i0 >\ http://www.orange-carb.org/~csaldanh/\ \ Fortunate is a Cocoa/Objective-C graphical front-end to the command-line BSD fortune (included) which, since the dawn of time, has been providing countless seconds of fun each time a user logs in.\ \ Fortunate is free software, and assigned to the public domain. \ The fortune command-line program and fortune files included within are taken from the FreeBSD operating system. The following license covers the fortune program:\ \ \fs20 * Copyright (c) 1986, 1993\ * The Regents of the University of California. All rights reserved.\ *\ * This code is derived from software contributed to Berkeley by Ken Arnold.\ *\ * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:\ * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.\ * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.\ * 3. All advertising materials mentioning features or use of this software must display the following acknowledgement:\ * This product includes software developed by the University of California, Berkeley and its contributors.\ * 4. Neither the name of the University nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.\ *\ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\ }†’…’…™’„«ª¯†¯q¢¯t‚˜–€’…ªªªªªªªªªªª††………q¢q¢’¿’…’Å’…’Å„@@ccc„„„NSCursor”¯û’„Œ–œ„˜˜ NSIBeamCursor††ªª††’„„„ NSScrollerÓ›’¿™‚€ž„ ™†………r¢¢’¿’…’…’…¡…’¿„ff:ƒ>c>l„ _doScroller:ªª†’„%’¿™‚€ž„ ™†………œœWW’¿’…’…’…¡…’¿Ãƒ?rCĪª††………K‚€‚€’ž’…’Â’…’$’'’Â’…’…„ffffi ‚€††………áá’…’…’…’…†™ž…………KÚ||’ž’…’…’…¡„€¥‚þ‚@Š„˜˜ Fortunate†„©™$šþÿLucidaGrande©ªªªª†……«…’…’™¬ª¯†’…°…†ž–Å¿–ž„„„NSWindowTemplateø”„ iiffffi@@@@@cÝVá‚°x„ž˜†„ž˜NSPanel†„ž˜View†ž…„ffffêª¯Ý’…ª¯†–,•–²ž–¿ž–¢ž™–™.–•„ž˜ File's Owner†–Å„ž˜6†–¢„ž˜1†–,„ž˜ InfoPanel†–²„ž˜2†–¿„ž˜5†’„µŽ†’„ ™’„„„NSNibOutletConnectorÏ„„NSNibConnector”®•,„˜˜ infoPanel†††’…™ „@i,˲˕˙ˢ˿Ë9˞ËÅ™™’„ž˜IBCocoaFramework††fortunate-3.1/PB/English.lproj/InfoPlist.strings0000644000175000017500000000064607264161467022550 0ustar gurkangurkan00000000000000þÿ/* Localized versions of Info.plist keys */ CFBundleName = "Fortunate3.0"; CFBundleShortVersionString = "Fortunate version 0.1"; CFBundleGetInfoString = "Fortunate version 3.0"; NSHumanReadableCopyright = ""; fortunate-3.1/PB/English.lproj/Preferences.nib/0000755000175000017500000000000010120331713022202 5ustar gurkangurkan00000000000000fortunate-3.1/PB/English.lproj/Preferences.nib/classes.nib0000644000175000017500000000251207264224656024357 0ustar gurkangurkan00000000000000{ IBClasses = ( {CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; }, { CLASS = FontomaticPanel; LANGUAGE = ObjC; OUTLETS = {prefsController = id; }; SUPERCLASS = NSPanel; }, { ACTIONS = { activateMainWindow = id; copyFortune = id; loadNewFortuneAndUpdateWindow = id; showInfo = id; showPrefs = id; }; CLASS = MainDocument; LANGUAGE = ObjC; OUTLETS = {infoPanel = id; mainWindow = id; prefsController = id; prefsPanel = id; }; SUPERCLASS = NSObject; }, { ACTIONS = { cancelPrefs = id; offensiveClicked = id; savePrefs = id; showFontPanel = id; showOpenPanel = id; showPrefs = id; }; CLASS = PreferencesController; LANGUAGE = ObjC; OUTLETS = { fontField = id; mainDoc = id; offensiveCheckBox = id; pathField = id; prefsPanel = id; }; SUPERCLASS = NSObject; } ); IBVersion = 1; }fortunate-3.1/PB/English.lproj/Preferences.nib/info.nib0000644000175000017500000000063407264224656023660 0ustar gurkangurkan00000000000000 IBDocumentLocation 24 13 356 240 0 0 976 746 IBUserGuides Prefs guideLocations guidesLocked NO fortunate-3.1/PB/English.lproj/Preferences.nib/objects.nib0000644000175000017500000000472407264224656024362 0ustar gurkangurkan00000000000000 typedstreamè„@„„„NSIBObjectDataà„„NSObject…’„„„NSCustomObject)”„@@„„„NSString”„+ MainDocument†…†„i –„„„NSButton„„ NSControl)„„NSView)„„ NSResponder”’„œ’…™„ @@@@ffffffff„„„NSMutableArray„„NSArray”™ ’„„„ NSTextField›’ž™ž…………É„¯¯’ž’…’…’…„icc@„„„NSTextFieldCell=„„ NSActionCell„„NSCellA”„ii‚”qþ@„@@@@„˜˜†„„„NSFont”™$„[36c]þÿLucidaGrande„f „c««« †……„i:…’…’¢„c@@„„„NSColor”«„@@@„˜˜System†„˜˜textBackgroundColor†„¬«„ff††„¬«¯­„˜˜ textColor†„¬«°†††’…„:…†’™’„š’ž™ž…………Ã G G ’ž’…’…’…¢„„„ NSButtonCell?ŠŠ‚„þ‚8§„˜˜Save†„ª™$©þÿLucidaGrandeª««««†……¬…’…’³„ ssii@@@@@È‚†‚@ÿš„˜˜ †…„ª™„[28c]þÿHelveticaª ««««†…††’„š’ž™ž…………( V V ’ž’…’…’…¢„µŠ‚þ‚8§„˜˜Cancel†·……¬…’…’º³È‚†‚@ÿš„˜˜†…¹…††’„š’ž™ž…………zXuu’ž’…’…’…¢„µŠ‚þ‚8§„˜˜ Show fonts...†·……¬…’…’Ÿ³È‚†‚@ÿšš…¹…††’„£’ž™ž…………7^ŒŒ’ž’…’…’…¢„¥Š‚þ‚§„˜˜Fortune display font:†„ª™$©þÿLucidaGrandeª ««««†……¬…’…’Á­„¬«¯­„˜˜ controlColor†„¬«°ƒ?*ª«††„¬«¯­„˜˜controlTextColor†²††’…±…†’„£’ž™ž…………ÈZ°°’ž’…’…’…¢„¥Š‚Aþ‚§š„ª™ŽþÿHelveticaª ««««†……¬…’…’Ê­ÅȆ’…±…†’„š’ž™ž…………À:ÀÀ’ž’…’…’…¢„µŠ‚þ§„˜˜Include offensive fortunes?†Ä……¬…’…’ͳÈ‚H #import "MainDocument.h" @interface ApplicationDelegate : NSObject { IBOutlet MainDocument *mainDocument; } - (void)applicationDidFinishLaunching:(NSNotification *)aNotification; @end fortunate-3.1/ApplicationDelegate.m0000644000175000017500000000064506743417717020265 0ustar gurkangurkan00000000000000/* ApplicationDelegate.m created by chris on Sat 19-Jun-1999 */ #import "ApplicationDelegate.h" #import "MainDocument.h" @implementation ApplicationDelegate - (void)applicationDidFinishLaunching:(NSNotification *)aNotification { [mainDocument activateMainWindow:self]; //[NSApp activateIgnoringOtherApps: YES]; } - (void)activateMainDocument:(id)sender { [mainDocument activateMainWindow:self]; } @end fortunate-3.1/CHANGES0000644000175000017500000000117207444007270015164 0ustar gurkangurkan00000000000000Changes since version 2.0 of Fortunate -------------------------------------- -ported to MacOS X 10.1 (and will probably work on 10.0) -now includes the fortune command-line program and fortune files -set menu layout to match MacOS X standards -preference for offensive fortunes added Changes since version 1.0 of Fortunate -------------------------------------- - ported to MacOS X Server, including the new text and user defaults systems - now has a preferences panel to set the fortune program's path and the font - the fortune path can include arguments so that you can control what fortunes you see - exciting new info panel fortunate-3.1/FontomaticPanel.h0000644000175000017500000000060410121763540017417 0ustar gurkangurkan00000000000000/* FontomaticPanel.h created by chris on Sat 26-Jun-1999 */ /* FontomaticPanel.h * Chris Saldanha, June, 1999 * Subclass of NSPanel that catches changeFont: event from the font panel. */ #import #import "PreferencesController.h" @interface FontomaticPanel : NSPanel { IBOutlet PreferencesController *prefsController; } - (void)changeFont:(id)fontManager; @end fortunate-3.1/FontomaticPanel.m0000644000175000017500000000053010121764674017433 0ustar gurkangurkan00000000000000/* FontomaticPanel.m created by chris on Sat 26-Jun-1999 */ /* FontomaticPanel.m * Chris Saldanha, June, 1999 * Subclass of NSPanel that catches changeFont: event from the font panel. */ #import "FontomaticPanel.h" @implementation FontomaticPanel - (void)changeFont:(id)fontManager { [prefsController changeFont: fontManager]; } @end fortunate-3.1/Fortunate.tiff0000644000175000017500000000364205472617322017022 0ustar gurkangurkan00000000000000MM*܀ P8$ „B`EXüK‡D17ü  ŒFcQžª& ‡$R6 ŽJeR¹HâÄf"ù£ü%7q@åÒÉä°ã™?æ‚ú Â+£€“Úe64ª›„š49ŽÞ“(§Vc5 µR^ˆHƒ”˜œjÍ=€*sZ’Ïo…ZmtJüÖÅIc\/Q¹üR©mÎ`T»Þ Š]ì4› ÃÛhÔ!—‚*¥ñ ]&“˜ÃI,x—A§ƒ1®÷Z&:•šž8®úëNÃarÎ鍵ge%€ewŒ8ŠÛTÊBø•WÕ8Óm9­-›MyuXáÇ%Šp¹tÕUßgŌeºöÛŸëµ)®TŒÜìî8U c`]gʑ²o öŽ¡®úfššÏӞ‡Ë9"R®Œ¯j¬‹?ªÓš±·*Ž ¹Ä ÓøŒ¿ ô!®Š ×:(‰œP @C*ʋÅ1D@Ö*ª“ñ#L³D¡Dò$r ­¯bFª5ѪzŸ€ä¥(+»’?Œ²y­JW*JqÔ%''ÐtÅ0JÒñ0ËKLš<ŠÎɎ \û€ób²¬Jâ«L24C Às" >3ldÑE&-s=?ŸItú§‘ŒÏKÐT ~ÁÐÊz:Nu ŽÎŒòÂyÔE$P€MN£B­QUÐ5Lz€Ë‰ä7!ËôÅm+·ˆã,¬X“ÌîžD©mZȪ4E )Í3Lí?”µ2ðFnR77‰! ,‰!µ¿nÛôs ³VTkÇPŽ};UÑ­“vPMÕ^ƒ•B=Äšå Žše ‹~_Çù«`—øŽ õŒž×vZ!5 oä¹-S±×1ЫUõo›%lá¹D"ù&G‘e9.N‘ãk[x;ˆSŒ®Ö–ÂÝNV å{zJÈ , ùmÿƒäx.‘£`ØFI£éØ)™aÖÕOç)Œ¯\ç©\…Í*²€H*&U”åû9¯–læÎӒíšv^;‹A>ªµNUT­ë«zӍQŠbøT±þ/áÿ}a¢X„ŸáÇ,”ÜIþTÁÁþ"‡ø1¢úšˆ_aõnÅk*+Ÿ² ’Ú sœQ"5…œ)FŸýï}ß÷Ç„Ïw}çß>Iþ„|.±œZÔß`ËÅéæŸæRŠŸïïü·=ð|+=@ÔŽ§ŠØ;Gøð-&#øGÉߕ_ÏuÞ|_¿ŸýTzK°Ó1‡ÖiÒ ¯ùú<2þERC‚qï@Å•Ìüh]ãeïb=7vkJÑõ„ˆ‚°<b\²JC"·Xh0òKIÓí" Ô8 Åb@ Á;…@¥YóIT+ã4ž–2À×ù@SèƒàœG0fá!Ë€còÎbJè–Å%”z–å0‚A$Lr Œ™é5Zœ–“&nMžöåÈhDˆ͙ŠÕŠY0†*Hé!#˜MK~AžV·Ü@4œóz}Ù6ãÝ ‹ñ•È÷åer#$`JIš€€mʑþݱ {NªcQØdãp1EH_ UÜtãÇn…¡Åš(+gM žg€ÓE§3ö•ı"ÝˌŒ£“SÅáB©ir@Ž Pù Áę‡n•ªڀæÕ=³™~µAg0Šs®}}ÈP"â¡®X2ÜFÂGI<sV¥ÍYGê#ªd-%‚°Fª4ü€ ñ–²¶Ì]ÈE_mÛ³9ù/åRð–ÒÜcz&¥Ža,X êÓ[O…ap«z{JkI«ÏdH„ ShDo‰qN`ŊZZ©¬U£ü9ªlÕa»6ÖÞÀÅð£“vHˆ ôÚëãhe ©ž²6_ATpt”VÈÊúÖôÊÄÍŠò9Â×X«‡øŒšµv×ÞÆÀß}¹„6÷2V•}—ýïa6Œ/—£­€ðnëÝõÁÉu#i›Ë¢ÔÊHJeùqÙMÕÁ÷M„Yù Aì.Ã5ï ²l)a™€mw8ÒYÅ¿vŠÕHzræƒSM(€ÿ€ÒŠÚ‹C}íU¯ŽM,UV9òæ%¯XâØcœojê%®‚ô:TMX;Ít.00ŠªÔ’š(R ü€' ü€'fortunate-3.1/FortunateIcon.icns0000644000175000017500000001347207264155201017633 0ustar gurkangurkan00000000000000icns:ich#H€üü?þ>þ|þx~x>ppxxü?ü?žüÜø?üÿð?üÿÀü0ÿÿüþÿüþÿüþÿøþ?ÀÿðþàÿÀÿáþÿûü?ÿÿøÿÿðÿÿàÿÿÀÿÿ€ÿÿÿÿÿÿ€ÿÿ€?ÿÿ€?ÿÿÀÿÿÀÿÿÀÿÿàÿÿÿàÿÿÿàÿÿÿðÿÿÿøÿÿÿøÿÿÿøÿÿÿüÿÿÿüÿÿÿüÿÿÿü€üü?þ>þ|þx~x>ppxxü?ü?žüÜø?üÿð?üÿÀü0ÿÿüþÿüþÿüþÿøþ?ÀÿðþàÿÀÿáþÿûü?ÿÿøÿÿðÿÿàÿÿÀÿÿ€ÿÿÿÿÿÿ€ÿÿ€?ÿÿ€?ÿÿÀÿÿÀÿÿÀÿÿàÿÿÿàÿÿÿàÿÿÿðÿÿÿøÿÿÿøÿÿÿøÿÿÿüÿÿÿüÿÿÿüÿÿÿüih32 âŠ%% Ž •%%/ %/%%“%/Ž/%/%’%/%/%/‘ /‘ /%%‘% “%/%‘”%/‘–/%–/ –% ƒƒƒ %‘% €%/%%‚ %/%%‚‘ /%%%/%/‚ /%/%%€ % ‘ %%/%/%/%/„ /%/%%/‘ %/%/%/% † %/%/%/% %/%/%/‹ /%/%/ %/%/%/%%/%%€ „ %%/%/%/%/% /%/%/%/%/%ƒ %/%/%/%/% %/%/%/%/%/„€%/%/%/  /%/%/%/%%Š%%/% ƒ€I‡%/%/%/Œ /%/G×Ó×Õ×G…/%/%%/%%€GÙÙ׀Ù׏ƒ/%/% ‘%/% ÙÕÙÕÙÕÙÕٍ /%/% “%%/ ‘€Ù׀٠×ÙÙw/%/% •€%1Óš^GK8ŠšEŸ/%/%%— š‘€ÿ âÿÿq1 /%/%%— /ÀU‚ÿ8ÿ%/%šx`â€ÿª8ÿ⠜8€ÿ⪪U€ÿ ›8€ÿªqqUq€ÿ€ šâÿª8ªªqUÿU€%™ 8UªqÿU`œ""Æ8€8Uâ`/œ+ª8†I› 3Š '3G‰›))8/ˆ8D—+"M/Gš‡G^G`— )1wÀ‡^1Ÿ`G—+))ˆ‘^À˜:)KŠ…×ÕGŠE€’"<: ÀÙÙ+„ŸÙُEّ€3’ 8)K/ÙÕÙq‚ `ÕÙÕÀÕÙÕ‘) 48x€ÙŸƒª×€Ù×ÙÙG1‘ )+: Œ×Õ×Óx‚ ×Ó×Õ×Ó×Õ^"+1+ ׀Ù×Ù/€`Ù׀Ù×ÙُK 1)D`ÕÙÕÙÕÙÕª`1ŸÙÕÙÕÙÕÙÕÀ 3ˆŠ%% Ž •%%/ %/%%“%/Ž/%/%’%/%/%/‘ /‘ /%%‘% “%/%‘”%/‘–/%–/ –% ƒƒƒ %‘% €%/%%‚ %/%%‚‘ /%%%/%/‚ /%/%%€ % ‘ %%/%/%/%/„ /%/%%/‘ %/%/%/% † %/%/%/% %/%/%/‹ /%/%/ %/%/%/%%/%%€ „ %%/%/%/%/% /%/%/%/%/%ƒ %/%/%/%/% %/%/%/%/%/„€%/%/%/  /%/%/%/%%Š%%/% ƒ464‡%/%/%/Œ /%/6‚€4…/%/%%/%%€6 €¢€ €¢mƒ/%/% ‘%/% †€m /%/% “%%/ i€¢€ €¢€ €¢Z/%/% •%€€G6B8€~8m“/%/%%— ~k€ÿ âÿÿq# /%/%%— #“U‚ÿ8ÿ%/%šZGâ€ÿª8ÿ⠜8€ÿ⪪U€ÿ › 8€ÿªqqUq€ÿ€ šâÿª8ªªqUÿU€%™8UªqÿUIœÆ8€8UâI#œ ª8†4›'Š %6‰› /#ˆ88— :#4€‡8G6G—" 'Z“‡G"‘I6—€ ˆoG‘˜-"8mo€…€€6~6€ ’ +-‘ €#„‘€ m6€k€%’/":#€€\‚I€€‘€€‘ #-X€¢€ƒ € €¢€ €¢6'‘ -‘€Z‚…€I  ' ¢€ €¢€#€G€¢€ €¢€ m:)"4I„€~I%‘…€‘'ˆŠ%% Ž •%%/ %/%%“%/Ž/%/%’%/%/%/‘ /‘ /%%‘% “%/%‘”%/‘–/%–/ –% ƒƒƒ %‘% €%/%%‚ %/%%‚‘ /%%%/%/‚ /%/%%€ % ‘ %%/%/%/%/„ /%/%%/‘ %/%/%/% † %/%/%/% %/%/%/‹ /%/%/ %/%/%/%%/%%€ „ %%/%/%/%/% /%/%/%/%/%ƒ %/%/%/%/% %/%/%/%/%/„€%/%/%/  /%/%/%/%%Š%%/% ƒ€‡%/%/%/Œ /%/GEGEG…/%/%%/%%€EED€ED/ƒ/%/% ‘%/% GEGEGEGEG/ /%/% “%%/ /ED€ED€E D'/%/% •€%E6 +868/>/%/%%— 6-€ÿ âÿÿq /%/%%— >U‚ÿ8ÿ%/%š% â€ÿª8ÿ⠜8€ÿ⪪U€ÿ ›8€ÿªqqUq€ÿ€ šâÿª8ªªqUÿU€%™ 8UªqÿUœ  Æ8€8Uâœ ª8†› Š ‰› ˆ8"— 4‡— '>‡ > — ˆ->˜ /-6…GE8€’ >EE„ƒ4EED€ED‘  >GEGE'‚ GEGEGEGE   D€EDE€ED€EDEE-  EGEGEGE8>GEGEGEGE@ˆh8mk UÿÿÿÿªÿÿÿÿU8ÿÿÿÿâ8qÿÿÿÿÿÿªÿÿÿÿUªÿÿÿÿÿÿ8ÿÿÿÿ8ÿÿÿÿÿÿÆqÿÿÿâªÿÿÿÿÿÿªÿÿÿªÿÿÿÿÿÿÿÿÆÿÿÿÿâÿÿ88ÿÿÿÿUâÿÿâÿÿÿUÆÿÿq8ªÆª8qÿÿÿªÿÿâÆÿÿÿªªÿÿÿâUUÿÿƪÿÿÿƪÿÿÿÿÿÿÿ8ÿÿÿÿÿÿUÿÿÆÿÿÿÿÿÿÿÿÿÿÿÆUÿÿÿÿÿÿÿq8âÿÿ8ÿÿÿÿÿÿÿÿÿÿÿâÿÿÿÿÿÿÿÿÿÿÿÿqÿÿÿÿÿÿÿÿÿÿÆqÿÿÿÿÿÿÿÿÿÿÿqÿÿÿÿÿÿÿÿÿÆ88ÿÿÿÿÿÿÿÿÿ8UU8UâÿÿÿÿÿÿÿÿÿÿÆUâÿÿÿÿÿÿÿÿÿÿÿÿÿâÿÿÿÿÿÿÿÿÿÿÿâªÿÿÿÿÿÿÿÿÿÿÿÿÆÿÿÿÿÿÿÿÿÿÿÿUÿÿÿÿÿÿÿÿÿÿÿÿqÆÿÿÿÿÿÿÿÿÿÿUUUUU8UÿÿÿÿÿÿÿÿÿÿÿƍªÆÿÿÿÿÿÿUÿÿÿÿÿÿqUÿÿÿÿÿÿÿÿÿÿUÿÿÿÿÿªÿÿÿÿÿÿÿÿUÆÿÿÿÿÿÿÿÆqâÿÿÿÿÿÆÿÿÿÿÿÿÿÿÿÿÿ8qÿÿÿÿÿÿqÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿUUÿÿÿÿÿÿqÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿq8âÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÆ8ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿâ8ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿâªÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿªÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿqÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿqÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿƍÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ8âÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿUqÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿªâÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿUqÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿƪÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ8âÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÆ8ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿUÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿªÆÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿUUÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿªÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÆâÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿfortunate-3.1/FortunateInfo.plist0000644000175000017500000000077010121760725020031 0ustar gurkangurkan00000000000000{ ApplicationDescription = "Provide wisdom and humor to all"; ApplicationIcon = Fortunate.tiff; ApplicationName = Fortunate; ApplicationRelease = "3.0"; ApplicationURL = "http://...."; Authors = ("Chris Saldanha ", "Ported to GNUstep by: Stefan Kl. Stegemann "); Copyright = "Copyright \U00a9 2004 Stefan Kleine Stegemann"; CopyrightDescription = "Released under the GNU LGPL."; FullVersionID = "3.0"; } fortunate-3.1/FortuneTextView.h0000644000175000017500000000040106736534230017462 0ustar gurkangurkan00000000000000/* FortuneTextView.h created by chris on Sat 26-Jun-1999 */ /* FortuneTextView.h * Chris Saldanha, June, 1999 * Subclass of NSTextView that quits the app on a mouse click. */ #import @interface FortuneTextView : NSTextView { } @end fortunate-3.1/FortuneTextView.m0000644000175000017500000000047707264104633017501 0ustar gurkangurkan00000000000000/* FortuneTextView.m created by chris on Sat 26-Jun-1999 */ /* FortuneTextView.m * Chris Saldanha, June, 1999 * Subclass of NSTextView that quits the app on a mouse click. */ #import "FortuneTextView.h" @implementation FortuneTextView - (void)mouseDown: (NSEvent *)theEvent { [NSApp terminate: nil]; } @end fortunate-3.1/GNUmakefile0000644000175000017500000000423110163266552016244 0ustar gurkangurkan00000000000000# # GNUmakefile # # Build the Yape editor. # # Copyright (C) 2004 Stefan Kleine Stegemann # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # ifeq ($(GNUSTEP_MAKEFILES),) $(error You need to run the GNUstep configuration script before compiling) endif include $(GNUSTEP_MAKEFILES)/common.make # # Application # APP_NAME = Fortunate ${APP_NAME}_CURRENT_VERSION_NAME = $(VERSION) ${APP_NAME}_DEPLOY_WITH_CURRENT_VERSION = yes ${APP_NAME}_APPLICATION_ICON = Fortunate.tiff ${APP_NAME}_MAIN_MODEL_FILE = Fortunate.gorm # # Subprojects # ifeq ($(with-fortune), yes) SUBPROJECTS = fortune endif # # Resources # ${APP_NAME}_Languages = \ English ${APP_NAME}_LOCALIZED_RESOURCE_FILES = \ Fortunate.gorm ${APP_NAME}_RESOURCE_FILES = \ FortunateInfo.plist \ Fortunate.tiff # \ # datfiles ifeq ($(with-fortune), yes) ${APP_NAME}_RESOURCE_FILES += fortune/obj/fortune endif # # Libararies # # ${APP_NAME}_GUI_LIBS = \ # # Class files # ${APP_NAME}_OBJC_FILES = \ ApplicationDelegate.m \ FontomaticPanel.m \ FortuneTextView.m \ MainDocument.m \ PreferencesController.m \ main.m # # Additional Settings # ifeq ($(with-fortune), yes) ADDITIONAL_OBJCFLAGS += -DWITH_FORTUNE_PROGRAM endif -include GNUmakefile.preamble -include GNUmakefile.local include $(GNUSTEP_MAKEFILES)/aggregate.make include $(GNUSTEP_MAKEFILES)/application.make -include GNUmakefile.postamble fortunate-3.1/GNUmakefile.local0000644000175000017500000000202710117325465017334 0ustar gurkangurkan00000000000000 # # Version number of this release # MAJOR_VERSION = 2 MINOR_VERSION = 0 SUBMINOR_VERSION = 0 VERSION = $(MAJOR_VERSION).$(MINOR_VERSION).$(SUBMINOR_VERSION) # # Additional flags to pass to the make utility # MAKEFLAGS += -s MAKEFLAGS += warn=yes diagnose=yes debug=no messages=yes MAKEFLAGS += shared=yes strip=yes # # Additional flags to pass to the Objective-C compiler # ADDITIONAL_OBJCFLAGS += -g -Wall -Wno-import # # Additional flags to pass to the C compiler # ADDITIONAL_CFLAGS += # # Additional include directories the compiler should search # ADDITIONAL_INCLUDE_DIRS += # # Additional LDFLAGS to pass to the linker # ADDITIONAL_LDFLAGS += # # Additional library directories the linker should search # ADDITIONAL_LIB_DIRS += # # Additional tool directories the linker should search # ADDITIONAL_TOOL_LIBS += # # Flags dealing with installing and uninstalling # # # Additional directories to be created during installation # ADDITIONAL_INSTALL_DIRS += # # End of File. fortunate-3.1/MainDocument.h0000644000175000017500000000133610120273416016717 0ustar gurkangurkan00000000000000/* MainDocument.h * Chris Saldanha, June 1999 * Class to display fortunes in a simple window. */ #import #import "FortuneTextView.h" @class PreferencesController; @interface MainDocument : NSObject { IBOutlet NSWindow *mainWindow; IBOutlet NSPanel *prefsPanel; IBOutlet NSPanel *infoPanel; IBOutlet PreferencesController *prefsController; FortuneTextView *text; } - (void)activateMainWindow:(id)sender; - (void)loadNewFortuneAndUpdateWindow:(id)sender; - (void)copyFortune:(id)sender; - (void)showPrefs:(id)sender; - (void)showInfo:(id)sender; - (void)printFortune:(id)sender; - (NSString *)fortuneLocation; - (NSString *)datfilesLocation; - (NSFont*)fortuneFont; - (BOOL)showOffensive; @end fortunate-3.1/MainDocument.m0000644000175000017500000001214310163267507016735 0ustar gurkangurkan00000000000000/* MainDocument.m * Chris Saldanha, June 1999 (modified April 2001 for MacOS X 10.0) * Class to display fortunes in a simple window. * Can copy the fortune into the pasteboard from a menu option. * Clicking in the window's content view makes it go away. * For MacOS X - now using swanky classes NSTask/NSFileHandle/NSPipe instead of UNIX calls */ #import #import "MainDocument.h" #import "PreferencesController.h" @implementation MainDocument - (id)init { if ((self = [super init])) { text = nil; } return self; } - (void)activateMainWindow:(id)sender { [self loadNewFortuneAndUpdateWindow:nil]; } - (void) loadNewFortuneAndUpdateWindow:(id)sender { NSPipe *pipe; NSFileHandle *fortuneHandle, *errorHandle; NSTask *fortuneTask; NSData *fortuneData; NSMutableArray *arguments; int ret; [text autorelease]; text = [[FortuneTextView alloc] initWithFrame: NSMakeRect(0, 0, 10, 10)]; [text setFont: [self fortuneFont]]; [text setEditable: NO]; [text setRichText: NO]; [text setDrawsBackground: YES]; [text setBackgroundColor: [NSColor lightGrayColor]]; [text setMaxSize:(NSSize){1e7, 1e7}]; [text setHorizontallyResizable: YES]; [text setVerticallyResizable: YES]; [[text textContainer] setContainerSize: (NSSize){1e7, 1e7}]; [[text textContainer] setWidthTracksTextView:NO]; [text setTextContainerInset: (NSSize){5, 1}]; fortuneTask = [[NSTask alloc] init]; [fortuneTask setLaunchPath: [self fortuneLocation]]; arguments = [NSMutableArray array]; if ([self showOffensive]) [arguments addObject: @"-a"]; if ([self datfilesLocation]) [arguments addObject: [self datfilesLocation]]; [fortuneTask setArguments: arguments]; pipe = [NSPipe pipe]; fortuneHandle = [pipe fileHandleForReading]; [fortuneTask setStandardOutput: pipe]; pipe = [NSPipe pipe]; errorHandle = [pipe fileHandleForReading]; [fortuneTask setStandardError: pipe]; ret = 0; NS_DURING [fortuneTask launch]; NS_HANDLER [text setString: [NSString stringWithFormat: @"Got no fortune from %@.\nUse the preferences panel to chose the location of the fortune program.", [self fortuneLocation]]]; ret = 1; NS_ENDHANDLER if (ret != 1) { [fortuneTask waitUntilExit]; ret = [fortuneTask terminationStatus]; if (ret != 0) //failed to get a fortune... { fortuneData = [errorHandle readDataToEndOfFile]; [text setString: [NSString stringWithFormat: @"Got an error from fortune:\n%@", [NSString stringWithCString: [fortuneData bytes] length: [fortuneData length]]]]; } else //we succeeded in getting a fortune { fortuneData = [fortuneHandle readDataToEndOfFile]; [text setString: [NSString stringWithCString: [fortuneData bytes] length: [fortuneData length]]]; } } [fortuneTask release]; [text sizeToFit]; [mainWindow setContentSize: [text frame].size]; [mainWindow setContentView: text]; [mainWindow center]; //Americans don't know how to spel centre [mainWindow makeKeyAndOrderFront: self]; } - (void)copyFortune:(id)sender { [(NSTextView *)[mainWindow contentView] selectAll: nil]; [(NSTextView *)[mainWindow contentView] copy: nil]; [(NSTextView *)[mainWindow contentView] setSelectedRange: NSMakeRange(0, 0)]; } - (void)showPrefs:(id)sender { if (!prefsPanel) if(![NSBundle loadNibNamed: @"Preferences" owner: self]) return; [prefsController showPrefs: nil]; } - (void)showInfo:(id)sender { if (!infoPanel) if(![NSBundle loadNibNamed: @"Info" owner: self]) return; [infoPanel makeKeyAndOrderFront: nil]; } - (void)printFortune:(id)sender { [text print: nil]; } - (NSString *)fortuneLocation { BOOL useBundled; useBundled = [[NSUserDefaults standardUserDefaults] boolForKey: kUseBundledFortune]; if (useBundled) { return [[NSBundle mainBundle] pathForResource: @"fortune" ofType: @""]; } return [[NSUserDefaults standardUserDefaults] stringForKey: kFortuneLocation]; } - (NSString *)datfilesLocation { BOOL useBundled; useBundled = [[NSUserDefaults standardUserDefaults] boolForKey: kUseBundledDatfiles]; if (useBundled) { return [[NSBundle mainBundle] pathForResource: @"datfiles" ofType: @""]; } return [[NSUserDefaults standardUserDefaults] stringForKey: kDatfilesLocation]; } - (NSFont *)fortuneFont { NSString* fontName; float fontSize; fontSize = [[NSUserDefaults standardUserDefaults] floatForKey: kFortuneFontSize]; fontName = [[NSUserDefaults standardUserDefaults] stringForKey: kFortuneFontName]; if ((fontName == nil) || (fontSize == 0.0)) { return [NSFont userFixedPitchFontOfSize: 12.0]; } else { return [NSFont fontWithName: fontName size: fontSize]; } } - (BOOL)showOffensive { return [[NSUserDefaults standardUserDefaults] boolForKey: kShowOffensive]; } - (void)dealloc { [super dealloc]; } @end fortunate-3.1/PreferencesController.h0000644000175000017500000000241510120312053020627 0ustar gurkangurkan00000000000000/* PreferencesController.h created by chris on Wed 30-Jun-1999 */ #import #import "MainDocument.h" extern NSString* kUseBundledFortune; extern NSString* kFortuneLocation; extern NSString* kUseBundledDatfiles; extern NSString* kDatfilesLocation; extern NSString* kShowOffensive; extern NSString* kFortuneFontName; extern NSString* kFortuneFontSize; @interface PreferencesController : NSObject { IBOutlet NSPanel *prefsPanel; IBOutlet NSTextField *pathField; IBOutlet NSTextField *datfilesPathField; IBOutlet NSButton* useBundledFortuneCheckBox; IBOutlet NSButton* useBundledDatfilesCheckBox; IBOutlet NSTextField *fontField; IBOutlet NSButton *offensiveCheckBox; IBOutlet NSButton *selectFortuneButton; IBOutlet NSButton *selectDatfilesButton; IBOutlet MainDocument *mainDoc; NSFont *newFont; BOOL fontChanged; } - (void)showPrefs:(id)sender; - (void)resetPrefs:(id)sender; - (void)savePrefs:(id)sender; - (void)cancelPrefs:(id)sender; - (void)showOpenFortunePanel:(id)sender; - (void)showOpenDatfilesPanel:(id)sender; - (void)showFontPanel:(id)sender; - (void)changeFont:(id)fontManager; - (void)offensiveClicked:(id)sender; - (void)useBundledFortuneClicked:(id)sender; - (void)useBundledDatfilesClicked:(id)sender; @end fortunate-3.1/PreferencesController.m0000644000175000017500000001762010121764730020656 0ustar gurkangurkan00000000000000/* PreferencesController.m created by chris on Wed 30-Jun-1999 */ #import "PreferencesController.h" NSString* kUseBundledFortune = @"UseBundledFortune"; NSString* kFortuneLocation = @"FortuneLocation"; NSString* kUseBundledDatfiles = @"UseBundledDatfiles"; NSString* kDatfilesLocation = @"DatfilesLocation"; NSString* kShowOffensive = @"ShowOffensive"; NSString* kFortuneFontName = @"FontName"; NSString* kFortuneFontSize = @"FontSize"; @implementation PreferencesController + (void)initialize { NSMutableDictionary* standardDefs; NSUserDefaults* defaults; [super initialize]; // setup user defaults defaults = [NSUserDefaults standardUserDefaults]; standardDefs = [NSMutableDictionary dictionary]; [standardDefs setObject: @"YES" forKey: kUseBundledDatfiles]; [standardDefs setObject: @"/usr/games/fortune" forKey: kFortuneLocation]; #ifdef WITH_FORTUNE_PROGRAM [standardDefs setObject: @"YES" forKey: kUseBundledFortune]; #else [standardDefs setObject: @"NO" forKey: kUseBundledFortune]; #endif [standardDefs setObject: @"YES" forKey: kShowOffensive]; [defaults registerDefaults: standardDefs]; } - (void)showPrefs:(id)sender { [prefsPanel setFloatingPanel: YES]; [self resetPrefs: nil]; [prefsPanel makeKeyAndOrderFront: nil]; } - (void)resetPrefs:(id)sender { NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults]; BOOL useBundledFortune; BOOL useBundledDatfiles; useBundledFortune = [defaults boolForKey: kUseBundledFortune]; [useBundledFortuneCheckBox setState: (useBundledFortune ? NSOnState : NSOffState)]; [self useBundledFortuneClicked: nil]; useBundledDatfiles = [defaults boolForKey: kUseBundledDatfiles]; [useBundledDatfilesCheckBox setState: (useBundledDatfiles ? NSOnState : NSOffState)]; [self useBundledDatfilesClicked: nil]; [offensiveCheckBox setState: ([defaults boolForKey: kShowOffensive] ? NSOnState : NSOffState)]; fontChanged = NO; newFont = nil; [fontField setStringValue: [NSString stringWithFormat:@"%@ %g", [[mainDoc fortuneFont] fontName], [[mainDoc fortuneFont] pointSize]]]; } - (void)savePrefs:(id)sender { NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; NSMutableString *errors = [NSMutableString string]; NSString *datfilesLocation = nil; NSString *fortuneLocation = nil; BOOL ok = YES; BOOL showOffensive; fortuneLocation = [pathField stringValue]; datfilesLocation = [datfilesPathField stringValue]; // check settings if ([useBundledFortuneCheckBox state] == NSOffState && ![[NSFileManager defaultManager] fileExistsAtPath: fortuneLocation]) { [errors appendString: @"\nInvalid fortune program location."]; ok = NO; } if ([useBundledDatfilesCheckBox state] == NSOffState && ![[NSFileManager defaultManager] fileExistsAtPath: datfilesLocation]) { [errors appendString: @"\nInvalid datafiles location."]; ok = NO; } if (!ok) { [errors deleteCharactersInRange: NSMakeRange(0, 1)]; NSRunAlertPanel(@"Un-Fortunate Error", errors, @"Ok", nil, nil); return; } // save settings if ([useBundledFortuneCheckBox state] == NSOnState) { [defaults setBool: YES forKey: kUseBundledFortune]; } else { [defaults setBool: NO forKey: kUseBundledFortune]; [defaults setObject: fortuneLocation forKey: kFortuneLocation]; } if ([useBundledDatfilesCheckBox state] == NSOnState) { [defaults setBool: YES forKey: kUseBundledDatfiles]; } else { [defaults setBool: NO forKey: kUseBundledDatfiles]; [defaults setObject: datfilesLocation forKey: kDatfilesLocation]; } showOffensive = ([offensiveCheckBox state] == NSOnState ? YES : NO); [defaults setBool: showOffensive forKey: kShowOffensive]; if (fontChanged) { [defaults setObject: [newFont fontName] forKey: kFortuneFontName]; [defaults setFloat: [newFont pointSize] forKey: kFortuneFontSize]; } [[[NSFontManager sharedFontManager] fontPanel: NO] close]; [prefsPanel close]; } - (void)cancelPrefs:(id)sender { [prefsPanel close]; } - (void)showOpenFortunePanel:(id)sender { NSOpenPanel *openPanel = [NSOpenPanel openPanel]; int ret; [openPanel setAllowsMultipleSelection: NO]; [openPanel setCanChooseFiles: YES]; [openPanel setCanChooseDirectories: NO]; [openPanel setTitle: @"Select fortune program"]; ret = [openPanel runModalForDirectory: [[NSBundle mainBundle] resourcePath] file: nil types: nil]; if (ret == NSOKButton) [pathField setStringValue: [[openPanel filenames] objectAtIndex: 0]]; } - (void)showOpenDatfilesPanel:(id)sender { NSOpenPanel *openPanel = [NSOpenPanel openPanel]; int ret; [openPanel setAllowsMultipleSelection: NO]; [openPanel setCanChooseFiles: NO]; [openPanel setCanChooseDirectories: YES]; [openPanel setTitle: @"Select directory with fortune datafiles"]; ret = [openPanel runModalForDirectory: [[NSBundle mainBundle] resourcePath] file: nil types: nil]; if (ret == NSOKButton) [datfilesPathField setStringValue: [[openPanel filenames] objectAtIndex: 0]]; } - (void)showFontPanel:(id)sender { //[prefsPanel makeFirstResponder: fontField]; [prefsPanel makeFirstResponder: prefsPanel]; [[NSFontManager sharedFontManager] setSelectedFont: [mainDoc fortuneFont] isMultiple: NO]; [[NSFontManager sharedFontManager] orderFrontFontPanel: self]; } - (void)changeFont:(id)fontManager { [newFont autorelease]; newFont = [[fontManager convertFont: [fontManager selectedFont]] retain]; fontChanged = YES; [fontField setStringValue: [NSString stringWithFormat:@"%@ %g", [newFont fontName], [newFont pointSize]]]; [fontField display]; } - (void)offensiveClicked:(id)sender { return; } - (void)useBundledFortuneClicked:(id)sender { BOOL useBundled; useBundled = (([useBundledFortuneCheckBox state] == NSOnState) ? YES : NO); [pathField setEditable: !useBundled]; [pathField setSelectable: !useBundled]; [selectFortuneButton setEnabled: !useBundled]; if (useBundled) { NSString* whereIsFortune = [[NSBundle mainBundle] pathForResource: @"fortune" ofType: @""]; if (!whereIsFortune) { NSRunAlertPanel(@"Un-Fortunate Error", @"No fortune program bundled with Fortunate!", @"Ok", nil, nil); [useBundledFortuneCheckBox setState: NSOffState]; return; } [pathField setStringValue: whereIsFortune]; } else { [pathField setStringValue: [[NSUserDefaults standardUserDefaults] stringForKey: kFortuneLocation]]; } } - (void)useBundledDatfilesClicked:(id)sender { BOOL useBundled; useBundled = (([useBundledDatfilesCheckBox state] == NSOnState) ? YES : NO); [datfilesPathField setEditable: !useBundled]; [datfilesPathField setSelectable: !useBundled]; [selectDatfilesButton setEnabled: !useBundled]; if (useBundled) { NSString* whereAreDatfiles = [[NSBundle mainBundle] pathForResource: @"datfiles" ofType: @""]; if (!whereAreDatfiles) { NSRunAlertPanel(@"Un-Fortunate Error", @"No datafiles bundled with Fortunate!", @"Ok", nil, nil); [useBundledDatfilesCheckBox setState: NSOffState]; return; } [datfilesPathField setStringValue: whereAreDatfiles]; } else { [datfilesPathField setStringValue: [[NSUserDefaults standardUserDefaults] stringForKey: kDatfilesLocation]]; } } @end fortunate-3.1/README.rtf0000644000175000017500000000752207444246530015654 0ustar gurkangurkan00000000000000{\rtf1\mac\ansicpg10000\cocoartf100 {\fonttbl\f0\fswiss\fcharset77 Helvetica;} {\colortbl;\red255\green255\blue255;} \vieww11740\viewh9760\viewkind0 \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc \f0\fs36 \cf0 README for Fortunate v3.0, a MacOS X front-end to BSD fortune.\ \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural \fs28 \cf0 \ This is Fortunate, which provides wisdom and humour to all.\ \ The interface is written and maintained by:\ Chris Saldanha \ http://www.orange-carb.org/~csaldanh/\ \ \fs24 Fortunate is a Cocoa/Objective-C graphical front-end to the command-line BSD fortune (included) which, since the dawn of time, has been providing countless seconds of fun each time a user logs in.\ \ Fortunate is free software, and assigned to the public domain. \ The fortune command-line program and fortune files included within are taken from the FreeBSD operating system. The fortune program and files are licensed under a different license, included at the bottom of this file.\ \ To install this, just copy the Fortunate3 into your apps place, like /Applications or /Network/Applications or /Applications. I recommend you configure this to launch when you log in by dragging the Fortunate3 icon into the Login Items preference panel in the System Preferences.\ \ The window fortunes display in is auto-sized, with a maximum width of the screen itself. To make the fortune go away, either choose "Quit" from the menu, or click anywhere in text of the fortune. You can choose "New Fortune..." from the menu (or CMD-n) to replace the current (probably inane) fortune with a (hopefully) more amusing one. There is also a menu option "Copy Fortune" which copies the whole text of the current fortune into the pasteboard.\ \ This is the license under which the fortune command-line program falls under:\ \fs28 \ \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural \fs20 \cf0 * Copyright (c) 1986, 1993\ * The Regents of the University of California. All rights reserved.\ *\ * This code is derived from software contributed to Berkeley by Ken Arnold.\ *\ * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:\ * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.\ * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.\ * 3. All advertising materials mentioning features or use of this software must display the following acknowledgement:\ * This product includes software developed by the University of California, Berkeley and its contributors.\ * 4. Neither the name of the University nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.\ *\ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\ }fortunate-3.1/main.m0000644000175000017500000000016010117325547015270 0ustar gurkangurkan00000000000000#import int main(int argc, const char *argv[]) { return NSApplicationMain(argc, argv); } fortunate-3.1/fortune/0000755000175000017500000000000010120331723015636 5ustar gurkangurkan00000000000000fortunate-3.1/fortune/GNUmakefile0000644000175000017500000000042210117333566017723 0ustar gurkangurkan00000000000000include $(GNUSTEP_MAKEFILES)/common.make TOOL_NAME=fortune fortune_C_FILES = \ fortune.c \ regexpr.c fortune_CFLAGS = fortune_LDFLAGS = -include GNUmakefile.preamble -include GNUmakefile.local include $(GNUSTEP_MAKEFILES)/tool.make -include GNUmakefile.postamble fortunate-3.1/fortune/fortune.c0000644000175000017500000007623410117337377017521 0ustar gurkangurkan00000000000000/*- * Copyright (c) 1986, 1993 * The Regents of the University of California. All rights reserved. * * This code is derived from software contributed to Berkeley by * Ken Arnold. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * This product includes software developed by the University of * California, Berkeley and its contributors. * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #ifndef lint static const char copyright[] = "@(#) Copyright (c) 1986, 1993\n\ The Regents of the University of California. All rights reserved.\n"; #endif /* not lint */ #ifndef lint static const char sccsid[] = "@(#)fortune.c 8.1 (Berkeley) 5/31/93"; #endif /* not lint */ # include # include # include # include # include # include # include # include # include # include # include # include # include "strfile.h" # include "pathnames.h" /* CFS - additions for MacOS X Server and OpenStep */ #include #include #include /* END CFS ADDITIONS */ #define TRUE 1 #define FALSE 0 # define bool short # define MINW 6 /* minimum wait if desired */ # define CPERS 20 /* # of chars for each sec */ # define SLEN 160 /* # of chars in short fortune */ # define POS_UNKNOWN ((long) -1) /* pos for file unknown */ # define NO_PROB (-1) /* no prob specified for file */ # ifdef DEBUG # define DPRINTF(l,x) { if (Debug >= l) fprintf x; } # undef NDEBUG # else # define DPRINTF(l,x) # define NDEBUG 1 # endif typedef struct fd { int percent; int fd, datfd; long pos; FILE *inf; char *name; char *path; char *datfile, *posfile; bool read_tbl; bool was_pos_file; STRFILE tbl; int num_children; struct fd *child, *parent; struct fd *next, *prev; } FILEDESC; bool Found_one; /* did we find a match? */ bool Find_files = FALSE; /* just find a list of proper fortune files */ bool Fortunes_only = FALSE; /* check only "fortunes" files */ bool Wait = FALSE; /* wait desired after fortune */ bool Short_only = FALSE; /* short fortune desired */ bool Long_only = FALSE; /* long fortune desired */ bool Offend = FALSE; /* offensive fortunes only */ bool All_forts = FALSE; /* any fortune allowed */ bool Equal_probs = FALSE; /* scatter un-allocted prob equally */ #ifndef NO_REGEX bool Match = FALSE; /* dump fortunes matching a pattern */ #endif #ifdef DEBUG bool Debug = FALSE; /* print debug messages */ #endif char *Fortbuf = NULL; /* fortune buffer for -m */ int Fort_len = 0; long Seekpts[2]; /* seek pointers to fortunes */ FILEDESC *File_list = NULL, /* Head of file list */ *File_tail = NULL; /* Tail of file list */ FILEDESC *Fortfile; /* Fortune file to use */ STRFILE Noprob_tbl; /* sum of data for all no prob files */ int add_dir __P((FILEDESC *)); int add_file __P((int, char *, char *, FILEDESC **, FILEDESC **, FILEDESC *)); void all_forts __P((FILEDESC *, char *)); char *copy __P((char *, u_int)); void display __P((FILEDESC *)); void do_free __P((void *)); void *do_malloc __P((u_int)); int form_file_list __P((char **, int)); int fortlen __P((void)); void get_fort __P((void)); void get_pos __P((FILEDESC *)); void get_tbl __P((FILEDESC *)); void getargs __P((int, char *[])); void init_prob __P((void)); int is_dir __P((char *)); int is_fortfile __P((char *, char **, char **, int)); int is_off_name __P((char *)); int max __P((int, int)); FILEDESC * new_fp __P((void)); char *off_name __P((char *)); void open_dat __P((FILEDESC *)); void open_fp __P((FILEDESC *)); FILEDESC * pick_child __P((FILEDESC *)); void print_file_list __P((void)); void print_list __P((FILEDESC *, int)); void sum_noprobs __P((FILEDESC *)); void sum_tbl __P((STRFILE *, STRFILE *)); void usage __P((void)); void zero_tbl __P((STRFILE *)); #ifndef NO_REGEX char *conv_pat __P((char *)); int find_matches __P((void)); void matches_in_list __P((FILEDESC *)); int maxlen_in_list __P((FILEDESC *)); #endif #ifndef NO_REGEX #ifdef REGCMP # define RE_COMP(p) (Re_pat = regcmp(p, NULL)) # define BAD_COMP(f) ((f) == NULL) # define RE_EXEC(p) regex(Re_pat, (p)) char *Re_pat; char *regcmp(), *regex(); #else # define RE_COMP(p) (p = re_comp(p)) # define BAD_COMP(f) ((f) != NULL) # define RE_EXEC(p) re_exec(p) #endif #endif int main(ac, av) int ac; char *av[]; { #ifdef OK_TO_WRITE_DISK int fd; #endif /* OK_TO_WRITE_DISK */ (void) setlocale(LC_ALL, ""); getargs(ac, av); #ifndef NO_REGEX if (Match) exit(find_matches() != 0); #endif init_prob(); /* CFS - replaced call to srandomdev with srandom, since we don't have srandomdev on OpenStep or MacOS X Server */ srandom((int)(time((time_t *) NULL) + getpid())); do { get_fort(); } while ((Short_only && fortlen() > SLEN) || (Long_only && fortlen() <= SLEN)); display(Fortfile); #ifdef OK_TO_WRITE_DISK if ((fd = creat(Fortfile->posfile, 0666)) < 0) { perror(Fortfile->posfile); exit(1); } #ifdef LOCK_EX /* * if we can, we exclusive lock, but since it isn't very * important, we just punt if we don't have easy locking * available. */ (void) flock(fd, LOCK_EX); #endif /* LOCK_EX */ write(fd, (char *) &Fortfile->pos, sizeof Fortfile->pos); if (!Fortfile->was_pos_file) (void) chmod(Fortfile->path, 0666); #ifdef LOCK_EX (void) flock(fd, LOCK_UN); #endif /* LOCK_EX */ #endif /* OK_TO_WRITE_DISK */ if (Wait) { if (Fort_len == 0) (void) fortlen(); sleep((unsigned int) max(Fort_len / CPERS, MINW)); } exit(0); /* NOTREACHED */ } void display(fp) FILEDESC *fp; { register char *p; register unsigned char ch; char line[BUFSIZ]; open_fp(fp); (void) fseek(fp->inf, Seekpts[0], 0); for (Fort_len = 0; fgets(line, sizeof line, fp->inf) != NULL && !STR_ENDSTRING(line, fp->tbl); Fort_len++) { if (fp->tbl.str_flags & STR_ROTATED) for (p = line; (ch = *p) != '\0'; ++p) { if (isascii(ch)) { if (isupper(ch)) *p = 'A' + (ch - 'A' + 13) % 26; else if (islower(ch)) *p = 'a' + (ch - 'a' + 13) % 26; } } fputs(line, stdout); } (void) fflush(stdout); } /* * fortlen: * Return the length of the fortune. */ int fortlen() { register int nchar; char line[BUFSIZ]; if (!(Fortfile->tbl.str_flags & (STR_RANDOM | STR_ORDERED))) nchar = (Seekpts[1] - Seekpts[0] <= SLEN); else { open_fp(Fortfile); (void) fseek(Fortfile->inf, Seekpts[0], 0); nchar = 0; while (fgets(line, sizeof line, Fortfile->inf) != NULL && !STR_ENDSTRING(line, Fortfile->tbl)) nchar += strlen(line); } Fort_len = nchar; return nchar; } /* * This routine evaluates the arguments on the command line */ void getargs(argc, argv) register int argc; register char **argv; { register int ignore_case; # ifndef NO_REGEX register char *pat; # endif /* NO_REGEX */ extern char *optarg; extern int optind; int ch; ignore_case = FALSE; # ifndef NO_REGEX pat = NULL; # endif /* NO_REGEX */ # ifdef DEBUG while ((ch = getopt(argc, argv, "aDefilm:osw")) != -1) #else while ((ch = getopt(argc, argv, "aefilm:osw")) != -1) #endif /* DEBUG */ switch(ch) { case 'a': /* any fortune */ All_forts++; break; # ifdef DEBUG case 'D': Debug++; break; # endif /* DEBUG */ case 'e': Equal_probs++; /* scatter un-allocted prob equally */ break; case 'f': /* find fortune files */ Find_files++; break; case 'l': /* long ones only */ Long_only++; Short_only = FALSE; break; case 'o': /* offensive ones only */ Offend++; break; case 's': /* short ones only */ Short_only++; Long_only = FALSE; break; case 'w': /* give time to read */ Wait++; break; # ifdef NO_REGEX case 'i': /* case-insensitive match */ case 'm': /* dump out the fortunes */ (void) fprintf(stderr, "fortune: can't match fortunes on this system (Sorry)\n"); exit(0); # else /* NO_REGEX */ case 'm': /* dump out the fortunes */ Match++; pat = optarg; break; case 'i': /* case-insensitive match */ ignore_case++; break; # endif /* NO_REGEX */ case '?': default: usage(); } argc -= optind; argv += optind; if (!form_file_list(argv, argc)) exit(1); /* errors printed through form_file_list() */ if (Find_files) { print_file_list(); exit(0); } #ifdef DEBUG else if (Debug >= 1) print_file_list(); #endif /* DEBUG */ # ifndef NO_REGEX if (pat != NULL) { if (ignore_case) pat = conv_pat(pat); if (BAD_COMP(RE_COMP(pat))) { #ifndef REGCMP fprintf(stderr, "%s\n", pat); #else /* REGCMP */ fprintf(stderr, "bad pattern: %s\n", pat); #endif /* REGCMP */ } } # endif /* NO_REGEX */ } /* * form_file_list: * Form the file list from the file specifications. */ int form_file_list(files, file_cnt) register char **files; register int file_cnt; { register int i, percent; register char *sp; if (file_cnt == 0) if (Find_files) { Fortunes_only = TRUE; i = add_file(NO_PROB, FORTDIR, NULL, &File_list, &File_tail, NULL); Fortunes_only = FALSE; return i; } else return add_file(NO_PROB, "fortunes", FORTDIR, &File_list, &File_tail, NULL); for (i = 0; i < file_cnt; i++) { percent = NO_PROB; if (!isdigit((unsigned char)files[i][0])) sp = files[i]; else { percent = 0; for (sp = files[i]; isdigit((unsigned char)*sp); sp++) percent = percent * 10 + *sp - '0'; if (percent > 100) { fprintf(stderr, "percentages must be <= 100\n"); return FALSE; } if (*sp == '.') { fprintf(stderr, "percentages must be integers\n"); return FALSE; } /* * If the number isn't followed by a '%', then * it was not a percentage, just the first part * of a file name which starts with digits. */ if (*sp != '%') { percent = NO_PROB; sp = files[i]; } else if (*++sp == '\0') { if (++i >= file_cnt) { fprintf(stderr, "percentages must precede files\n"); return FALSE; } sp = files[i]; } } if (strcmp(sp, "all") == 0) sp = FORTDIR; if (!add_file(percent, sp, NULL, &File_list, &File_tail, NULL)) return FALSE; } return TRUE; } /* * add_file: * Add a file to the file list. */ int add_file(percent, file, dir, head, tail, parent) int percent; register char *file; char *dir; FILEDESC **head, **tail; FILEDESC *parent; { register FILEDESC *fp; register int fd; register char *path, *offensive; register bool was_malloc; register bool isdir; if (dir == NULL) { path = file; was_malloc = FALSE; } else { path = do_malloc((unsigned int) (strlen(dir) + strlen(file) + 2)); (void) strcat(strcat(strcpy(path, dir), "/"), file); was_malloc = TRUE; } if ((isdir = is_dir(path)) && parent != NULL) { if (was_malloc) free(path); return FALSE; /* don't recurse */ } offensive = NULL; if (!isdir && parent == NULL && (All_forts || Offend) && !is_off_name(path)) { offensive = off_name(path); if (Offend) { if (was_malloc) free(path); path = offensive; offensive = NULL; was_malloc = TRUE; DPRINTF(1, (stderr, "\ttrying \"%s\"\n", path)); file = off_name(file); } } DPRINTF(1, (stderr, "adding file \"%s\"\n", path)); over: if ((fd = open(path, 0)) < 0) { /* * This is a sneak. If the user said -a, and if the * file we're given isn't a file, we check to see if * there is a -o version. If there is, we treat it as * if *that* were the file given. We only do this for * individual files -- if we're scanning a directory, * we'll pick up the -o file anyway. */ if (All_forts && offensive != NULL) { if (was_malloc) free(path); path = offensive; offensive = NULL; was_malloc = TRUE; DPRINTF(1, (stderr, "\ttrying \"%s\"\n", path)); file = off_name(file); goto over; } if (dir == NULL && file[0] != '/') return add_file(percent, file, FORTDIR, head, tail, parent); if (parent == NULL) perror(path); if (was_malloc) free(path); return FALSE; } DPRINTF(2, (stderr, "path = \"%s\"\n", path)); fp = new_fp(); fp->fd = fd; fp->percent = percent; fp->name = file; fp->path = path; fp->parent = parent; if ((isdir && !add_dir(fp)) || (!isdir && !is_fortfile(path, &fp->datfile, &fp->posfile, (parent != NULL)))) { if (parent == NULL) fprintf(stderr, "fortune:%s not a fortune file or directory\n", path); free((char *) fp); if (was_malloc) free(path); do_free(fp->datfile); do_free(fp->posfile); do_free(offensive); return FALSE; } /* * If the user said -a, we need to make this node a pointer to * both files, if there are two. We don't need to do this if * we are scanning a directory, since the scan will pick up the * -o file anyway. */ if (All_forts && parent == NULL && !is_off_name(path)) all_forts(fp, offensive); if (*head == NULL) *head = *tail = fp; else if (fp->percent == NO_PROB) { (*tail)->next = fp; fp->prev = *tail; *tail = fp; } else { (*head)->prev = fp; fp->next = *head; *head = fp; } #ifdef OK_TO_WRITE_DISK fp->was_pos_file = (access(fp->posfile, W_OK) >= 0); #endif /* OK_TO_WRITE_DISK */ return TRUE; } /* * new_fp: * Return a pointer to an initialized new FILEDESC. */ FILEDESC * new_fp() { register FILEDESC *fp; fp = (FILEDESC *) do_malloc(sizeof *fp); fp->datfd = -1; fp->pos = POS_UNKNOWN; fp->inf = NULL; fp->fd = -1; fp->percent = NO_PROB; fp->read_tbl = FALSE; fp->next = NULL; fp->prev = NULL; fp->child = NULL; fp->parent = NULL; fp->datfile = NULL; fp->posfile = NULL; return fp; } /* * off_name: * Return a pointer to the offensive version of a file of this name. */ char * off_name(file) char *file; { char *new; new = copy(file, (unsigned int) (strlen(file) + 2)); return strcat(new, "-o"); } /* * is_off_name: * Is the file an offensive-style name? */ int is_off_name(file) char *file; { int len; len = strlen(file); return (len >= 3 && file[len - 2] == '-' && file[len - 1] == 'o'); } /* * all_forts: * Modify a FILEDESC element to be the parent of two children if * there are two children to be a parent of. */ void all_forts(fp, offensive) register FILEDESC *fp; char *offensive; { register char *sp; register FILEDESC *scene, *obscene; register int fd; auto char *datfile, *posfile; if (fp->child != NULL) /* this is a directory, not a file */ return; if (!is_fortfile(offensive, &datfile, &posfile, FALSE)) return; if ((fd = open(offensive, 0)) < 0) return; DPRINTF(1, (stderr, "adding \"%s\" because of -a\n", offensive)); scene = new_fp(); obscene = new_fp(); *scene = *fp; fp->num_children = 2; fp->child = scene; scene->next = obscene; obscene->next = NULL; scene->child = obscene->child = NULL; scene->parent = obscene->parent = fp; fp->fd = -1; scene->percent = obscene->percent = NO_PROB; obscene->fd = fd; obscene->inf = NULL; obscene->path = offensive; if ((sp = rindex(offensive, '/')) == NULL) obscene->name = offensive; else obscene->name = ++sp; obscene->datfile = datfile; obscene->posfile = posfile; obscene->read_tbl = FALSE; #ifdef OK_TO_WRITE_DISK obscene->was_pos_file = (access(obscene->posfile, W_OK) >= 0); #endif /* OK_TO_WRITE_DISK */ } /* * add_dir: * Add the contents of an entire directory. */ int add_dir(fp) register FILEDESC *fp; { register DIR *dir; /* CFS - Changed "dirent" to "direct" for OpenStep/MacOS X Server build */ register struct direct *dirent; auto FILEDESC *tailp; auto char *name; (void) close(fp->fd); fp->fd = -1; if ((dir = opendir(fp->path)) == NULL) { perror(fp->path); return FALSE; } tailp = NULL; DPRINTF(1, (stderr, "adding dir \"%s\"\n", fp->path)); fp->num_children = 0; while ((dirent = readdir(dir)) != NULL) { if (dirent->d_reclen == 0) continue; name = copy(dirent->d_name, dirent->d_reclen); if (add_file(NO_PROB, name, fp->path, &fp->child, &tailp, fp)) fp->num_children++; else free(name); } if (fp->num_children == 0) { (void) fprintf(stderr, "fortune: %s: No fortune files in directory.\n", fp->path); return FALSE; } return TRUE; } /* * is_dir: * Return TRUE if the file is a directory, FALSE otherwise. */ int is_dir(file) char *file; { auto struct stat sbuf; if (stat(file, &sbuf) < 0) return FALSE; return (sbuf.st_mode & S_IFDIR); } /* * is_fortfile: * Return TRUE if the file is a fortune database file. We try and * exclude files without reading them if possible to avoid * overhead. Files which start with ".", or which have "illegal" * suffixes, as contained in suflist[], are ruled out. */ /* ARGSUSED */ int is_fortfile(file, datp, posp, check_for_offend) char *file, **datp, **posp; int check_for_offend; { register int i; register char *sp; register char *datfile; static char *suflist[] = { /* list of "illegal" suffixes" */ "dat", "pos", "c", "h", "p", "i", "f", "pas", "ftn", "ins.c", "ins,pas", "ins.ftn", "sml", NULL }; DPRINTF(2, (stderr, "is_fortfile(%s) returns ", file)); /* * Preclude any -o files for offendable people, and any non -o * files for completely offensive people. */ if (check_for_offend && !All_forts) { i = strlen(file); if (Offend ^ (file[i - 2] == '-' && file[i - 1] == 'o')) { DPRINTF(2, (stderr, "FALSE (offending file)\n")); return FALSE; } } if ((sp = rindex(file, '/')) == NULL) sp = file; else sp++; if (*sp == '.') { DPRINTF(2, (stderr, "FALSE (file starts with '.')\n")); return FALSE; } if (Fortunes_only && strncmp(sp, "fortunes", 8) != 0) { DPRINTF(2, (stderr, "FALSE (check fortunes only)\n")); return FALSE; } if ((sp = rindex(sp, '.')) != NULL) { sp++; for (i = 0; suflist[i] != NULL; i++) if (strcmp(sp, suflist[i]) == 0) { DPRINTF(2, (stderr, "FALSE (file has suffix \".%s\")\n", sp)); return FALSE; } } datfile = copy(file, (unsigned int) (strlen(file) + 4)); /* +4 for ".dat" */ strcat(datfile, ".dat"); if (access(datfile, R_OK) < 0) { DPRINTF(2, (stderr, "FALSE (no readable \".dat\" file)\n")); #ifdef DEBUG if (Debug < 2) DPRINTF(0, (stderr, "Warning: file \"%s\" unreadable\n", datfile)); #endif free(datfile); return FALSE; } if (datp != NULL) *datp = datfile; else free(datfile); if (posp != NULL) { #ifdef OK_TO_WRITE_DISK *posp = copy(file, (unsigned int) (strlen(file) + 4)); /* +4 for ".dat" */ (void) strcat(*posp, ".pos"); #else *posp = NULL; #endif /* OK_TO_WRITE_DISK */ } DPRINTF(2, (stderr, "TRUE\n")); return TRUE; } /* * copy: * Return a malloc()'ed copy of the string */ char * copy(str, len) char *str; unsigned int len; { char *new, *sp; new = do_malloc(len + 1); sp = new; do { *sp++ = *str; } while (*str++); return new; } /* * do_malloc: * Do a malloc, checking for NULL return. */ void * do_malloc(size) unsigned int size; { void *new; if ((new = malloc(size)) == NULL) { (void) fprintf(stderr, "fortune: out of memory.\n"); exit(1); } return new; } /* * do_free: * Free malloc'ed space, if any. */ void do_free(ptr) void *ptr; { if (ptr != NULL) free(ptr); } /* * init_prob: * Initialize the fortune probabilities. */ void init_prob() { register FILEDESC *fp, *last = NULL; register int percent, num_noprob, frac; /* * Distribute the residual probability (if any) across all * files with unspecified probability (i.e., probability of 0) * (if any). */ percent = 0; num_noprob = 0; for (fp = File_tail; fp != NULL; fp = fp->prev) if (fp->percent == NO_PROB) { num_noprob++; if (Equal_probs) last = fp; } else percent += fp->percent; DPRINTF(1, (stderr, "summing probabilities:%d%% with %d NO_PROB's", percent, num_noprob)); if (percent > 100) { (void) fprintf(stderr, "fortune: probabilities sum to %d%% > 100%%!\n", percent); exit(1); } else if (percent < 100 && num_noprob == 0) { (void) fprintf(stderr, "fortune: no place to put residual probability (%d%% < 100%%)\n", percent); exit(1); } else if (percent == 100 && num_noprob != 0) { (void) fprintf(stderr, "fortune: no probability left to put in residual files (100%%)\n"); exit(1); } percent = 100 - percent; if (Equal_probs) if (num_noprob != 0) { if (num_noprob > 1) { frac = percent / num_noprob; DPRINTF(1, (stderr, ", frac = %d%%", frac)); for (fp = File_list; fp != last; fp = fp->next) if (fp->percent == NO_PROB) { fp->percent = frac; percent -= frac; } } last->percent = percent; DPRINTF(1, (stderr, ", residual = %d%%", percent)); } else { DPRINTF(1, (stderr, ", %d%% distributed over remaining fortunes\n", percent)); } DPRINTF(1, (stderr, "\n")); #ifdef DEBUG if (Debug >= 1) print_file_list(); #endif } /* * get_fort: * Get the fortune data file's seek pointer for the next fortune. */ void get_fort() { register FILEDESC *fp; register int choice; if (File_list->next == NULL || File_list->percent == NO_PROB) fp = File_list; else { choice = random() % 100; DPRINTF(1, (stderr, "choice = %d\n", choice)); for (fp = File_list; fp->percent != NO_PROB; fp = fp->next) if (choice < fp->percent) break; else { choice -= fp->percent; DPRINTF(1, (stderr, " skip \"%s\", %d%% (choice = %d)\n", fp->name, fp->percent, choice)); } DPRINTF(1, (stderr, "using \"%s\", %d%% (choice = %d)\n", fp->name, fp->percent, choice)); } if (fp->percent != NO_PROB) get_tbl(fp); else { if (fp->next != NULL) { sum_noprobs(fp); choice = random() % Noprob_tbl.str_numstr; DPRINTF(1, (stderr, "choice = %d (of %ld) \n", choice, Noprob_tbl.str_numstr)); while (choice >= fp->tbl.str_numstr) { choice -= fp->tbl.str_numstr; fp = fp->next; DPRINTF(1, (stderr, " skip \"%s\", %ld (choice = %d)\n", fp->name, fp->tbl.str_numstr, choice)); } DPRINTF(1, (stderr, "using \"%s\", %ld\n", fp->name, fp->tbl.str_numstr)); } get_tbl(fp); } if (fp->child != NULL) { DPRINTF(1, (stderr, "picking child\n")); fp = pick_child(fp); } Fortfile = fp; get_pos(fp); open_dat(fp); (void) lseek(fp->datfd, (off_t) (sizeof fp->tbl + fp->pos * sizeof Seekpts[0]), 0); read(fp->datfd, Seekpts, sizeof Seekpts); Seekpts[0] = ntohl(Seekpts[0]); Seekpts[1] = ntohl(Seekpts[1]); } /* * pick_child * Pick a child from a chosen parent. */ FILEDESC * pick_child(parent) FILEDESC *parent; { register FILEDESC *fp; register int choice; if (Equal_probs) { choice = random() % parent->num_children; DPRINTF(1, (stderr, " choice = %d (of %d)\n", choice, parent->num_children)); for (fp = parent->child; choice--; fp = fp->next) continue; DPRINTF(1, (stderr, " using %s\n", fp->name)); return fp; } else { get_tbl(parent); choice = random() % parent->tbl.str_numstr; DPRINTF(1, (stderr, " choice = %d (of %ld)\n", choice, parent->tbl.str_numstr)); for (fp = parent->child; choice >= fp->tbl.str_numstr; fp = fp->next) { choice -= fp->tbl.str_numstr; DPRINTF(1, (stderr, "\tskip %s, %ld (choice = %d)\n", fp->name, fp->tbl.str_numstr, choice)); } DPRINTF(1, (stderr, " using %s, %ld\n", fp->name, fp->tbl.str_numstr)); return fp; } } /* * sum_noprobs: * Sum up all the noprob probabilities, starting with fp. */ void sum_noprobs(fp) register FILEDESC *fp; { static bool did_noprobs = FALSE; if (did_noprobs) return; zero_tbl(&Noprob_tbl); while (fp != NULL) { get_tbl(fp); sum_tbl(&Noprob_tbl, &fp->tbl); fp = fp->next; } did_noprobs = TRUE; } int max(i, j) register int i, j; { return (i >= j ? i : j); } /* * open_fp: * Assocatiate a FILE * with the given FILEDESC. */ void open_fp(fp) FILEDESC *fp; { if (fp->inf == NULL && (fp->inf = fdopen(fp->fd, "r")) == NULL) { perror(fp->path); exit(1); } } /* * open_dat: * Open up the dat file if we need to. */ void open_dat(fp) FILEDESC *fp; { if (fp->datfd < 0 && (fp->datfd = open(fp->datfile, 0)) < 0) { perror(fp->datfile); exit(1); } } /* * get_pos: * Get the position from the pos file, if there is one. If not, * return a random number. */ void get_pos(fp) FILEDESC *fp; { #ifdef OK_TO_WRITE_DISK int fd; #endif /* OK_TO_WRITE_DISK */ assert(fp->read_tbl); if (fp->pos == POS_UNKNOWN) { #ifdef OK_TO_WRITE_DISK if ((fd = open(fp->posfile, 0)) < 0 || read(fd, &fp->pos, sizeof fp->pos) != sizeof fp->pos) fp->pos = random() % fp->tbl.str_numstr; else if (fp->pos >= fp->tbl.str_numstr) fp->pos %= fp->tbl.str_numstr; if (fd >= 0) (void) close(fd); #else fp->pos = random() % fp->tbl.str_numstr; #endif /* OK_TO_WRITE_DISK */ } if (++(fp->pos) >= fp->tbl.str_numstr) fp->pos -= fp->tbl.str_numstr; DPRINTF(1, (stderr, "pos for %s is %ld\n", fp->name, fp->pos)); } /* * get_tbl: * Get the tbl data file the datfile. */ void get_tbl(fp) FILEDESC *fp; { auto int fd; register FILEDESC *child; if (fp->read_tbl) return; if (fp->child == NULL) { if ((fd = open(fp->datfile, 0)) < 0) { perror(fp->datfile); exit(1); } if (read(fd, (char *) &fp->tbl, sizeof fp->tbl) != sizeof fp->tbl) { (void)fprintf(stderr, "fortune: %s corrupted\n", fp->path); exit(1); } /* fp->tbl.str_version = ntohl(fp->tbl.str_version); */ fp->tbl.str_numstr = ntohl(fp->tbl.str_numstr); fp->tbl.str_longlen = ntohl(fp->tbl.str_longlen); fp->tbl.str_shortlen = ntohl(fp->tbl.str_shortlen); fp->tbl.str_flags = ntohl(fp->tbl.str_flags); (void) close(fd); } else { zero_tbl(&fp->tbl); for (child = fp->child; child != NULL; child = child->next) { get_tbl(child); sum_tbl(&fp->tbl, &child->tbl); } } fp->read_tbl = TRUE; } /* * zero_tbl: * Zero out the fields we care about in a tbl structure. */ void zero_tbl(tp) register STRFILE *tp; { tp->str_numstr = 0; tp->str_longlen = 0; tp->str_shortlen = ~((unsigned long)0); } /* * sum_tbl: * Merge the tbl data of t2 into t1. */ void sum_tbl(t1, t2) register STRFILE *t1, *t2; { t1->str_numstr += t2->str_numstr; if (t1->str_longlen < t2->str_longlen) t1->str_longlen = t2->str_longlen; if (t1->str_shortlen > t2->str_shortlen) t1->str_shortlen = t2->str_shortlen; } #define STR(str) ((str) == NULL ? "NULL" : (str)) /* * print_file_list: * Print out the file list */ void print_file_list() { print_list(File_list, 0); } /* * print_list: * Print out the actual list, recursively. */ void print_list(list, lev) register FILEDESC *list; int lev; { while (list != NULL) { fprintf(stderr, "%*s", lev * 4, ""); if (list->percent == NO_PROB) fprintf(stderr, "___%%"); else fprintf(stderr, "%3d%%", list->percent); fprintf(stderr, " %s", STR(list->name)); DPRINTF(1, (stderr, " (%s, %s, %s)", STR(list->path), STR(list->datfile), STR(list->posfile))); fprintf(stderr, "\n"); if (list->child != NULL) print_list(list->child, lev + 1); list = list->next; } } #ifndef NO_REGEX /* * conv_pat: * Convert the pattern to an ignore-case equivalent. */ char * conv_pat(orig) register char *orig; { register char *sp; register unsigned int cnt; register char *new; cnt = 1; /* allow for '\0' */ for (sp = orig; *sp != '\0'; sp++) if (isalpha((unsigned char)*sp)) cnt += 4; else cnt++; if ((new = malloc(cnt)) == NULL) { fprintf(stderr, "pattern too long for ignoring case\n"); exit(1); } for (sp = new; *orig != '\0'; orig++) { if (islower((unsigned char)*orig)) { *sp++ = '['; *sp++ = *orig; *sp++ = toupper((unsigned char)*orig); *sp++ = ']'; } else if (isupper((unsigned char)*orig)) { *sp++ = '['; *sp++ = *orig; *sp++ = tolower((unsigned char)*orig); *sp++ = ']'; } else *sp++ = *orig; } *sp = '\0'; return new; } /* * find_matches: * Find all the fortunes which match the pattern we've been given. */ int find_matches() { Fort_len = maxlen_in_list(File_list); DPRINTF(2, (stderr, "Maximum length is %d\n", Fort_len)); /* extra length, "%\n" is appended */ Fortbuf = do_malloc((unsigned int) Fort_len + 10); Found_one = FALSE; matches_in_list(File_list); return Found_one; /* NOTREACHED */ } /* * maxlen_in_list * Return the maximum fortune len in the file list. */ int maxlen_in_list(list) FILEDESC *list; { register FILEDESC *fp; register int len, maxlen; maxlen = 0; for (fp = list; fp != NULL; fp = fp->next) { if (fp->child != NULL) { if ((len = maxlen_in_list(fp->child)) > maxlen) maxlen = len; } else { get_tbl(fp); if (fp->tbl.str_longlen > maxlen) maxlen = fp->tbl.str_longlen; } } return maxlen; } /* * matches_in_list * Print out the matches from the files in the list. */ void matches_in_list(list) FILEDESC *list; { register char *sp, *p; register FILEDESC *fp; int in_file; unsigned char ch; for (fp = list; fp != NULL; fp = fp->next) { if (fp->child != NULL) { matches_in_list(fp->child); continue; } DPRINTF(1, (stderr, "searching in %s\n", fp->path)); open_fp(fp); sp = Fortbuf; in_file = FALSE; while (fgets(sp, Fort_len, fp->inf) != NULL) if (!STR_ENDSTRING(sp, fp->tbl)) sp += strlen(sp); else { *sp = '\0'; if (fp->tbl.str_flags & STR_ROTATED) for (p = Fortbuf; (ch = *p) != '\0'; ++p) { if (isascii(ch)) { if (isupper(ch)) *p = 'A' + (ch - 'A' + 13) % 26; else if (islower(ch)) *p = 'a' + (ch - 'a' + 13) % 26; } } if (RE_EXEC(Fortbuf)) { printf("%c%c", fp->tbl.str_delim, fp->tbl.str_delim); if (!in_file) { printf(" (%s)", fp->name); Found_one = TRUE; in_file = TRUE; } putchar('\n'); (void) fwrite(Fortbuf, 1, (sp - Fortbuf), stdout); } sp = Fortbuf; } } } # endif /* NO_REGEX */ void usage() { (void) fprintf(stderr, "fortune [-a"); #ifdef DEBUG (void) fprintf(stderr, "D"); #endif /* DEBUG */ (void) fprintf(stderr, "f"); #ifndef NO_REGEX (void) fprintf(stderr, "i"); #endif /* NO_REGEX */ (void) fprintf(stderr, "losw]"); #ifndef NO_REGEX (void) fprintf(stderr, " [-m pattern]"); #endif /* NO_REGEX */ (void) fprintf(stderr, "[ [#%%] file/directory/all]\n"); exit(1); } fortunate-3.1/fortune/pathnames.h0000644000175000017500000000357207264101450020005 0ustar gurkangurkan00000000000000/*- * Copyright (c) 1991, 1993 * The Regents of the University of California. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * This product includes software developed by the University of * California, Berkeley and its contributors. * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * @(#)pathnames.h 8.1 (Berkeley) 5/31/93 */ #define FORTDIR "/usr/local/games" fortunate-3.1/fortune/regexpr.c0000644000175000017500000012265707263715056017516 0ustar gurkangurkan00000000000000/* regexpr.c Author: Tatu Ylonen Copyright (c) 1991 Tatu Ylonen, Espoo, Finland Permission to use, copy, modify, distribute, and sell this software and its documentation is hereby granted without fee, provided that the above copyright notice appears in all source code copies, the name of Tatu Ylonen is not used to advertise products containing this software or a derivation thereof, and all modified versions are clearly marked as such. This software is provided "as is" without express or implied warranty. Created: Thu Sep 26 17:14:05 1991 ylo Last modified: Sun Mar 29 16:47:31 1992 ylo This code draws many ideas from the regular expression packages by Henry Spencer of the University of Toronto and Richard Stallman of the Free Software Foundation. Emacs-specific code and syntax table code is almost directly borrowed from GNU regexp. $Header: /u/src/lib/tools/RCS/regexpr.c,v 1.4 92/03/29 16:52:04 ylo Exp $ */ #include #include #include "regexpr.h" char *malloc(); void free(); char *realloc(); #define MACRO_BEGIN do { #define MACRO_END } while (0) enum regexp_compiled_ops /* opcodes for compiled regexp */ { Cend, /* end of pattern reached */ Cbol, /* beginning of line */ Ceol, /* end of line */ Cset, /* character set. Followed by 32 bytes of set. */ Cexact, /* followed by a byte to match */ Canychar, /* matches any character except newline */ Cstart_memory, /* set register start addr (followed by reg number) */ Cend_memory, /* set register end addr (followed by reg number) */ Cmatch_memory, /* match a duplicate of reg contents (regnum follows)*/ Cjump, /* followed by two bytes (lsb,msb) of displacement. */ Cstar_jump, /* will change to jump/update_failure_jump at runtime */ Cfailure_jump, /* jump to addr on failure */ Cupdate_failure_jump, /* update topmost failure point and jump */ Cdummy_failure_jump, /* push a dummy failure point and jump */ Cbegbuf, /* match at beginning of buffer */ Cendbuf, /* match at end of buffer */ Cwordbeg, /* match at beginning of word */ Cwordend, /* match at end of word */ Cwordbound, /* match if at word boundary */ Cnotwordbound, /* match if not at word boundary */ #ifdef emacs Cemacs_at_dot, /* emacs only: matches at dot */ #endif /* emacs */ Csyntaxspec, /* matches syntax code (1 byte follows) */ Cnotsyntaxspec /* matches if syntax code does not match (1 byte foll)*/ }; enum regexp_syntax_op /* syntax codes for plain and quoted characters */ { Rend, /* special code for end of regexp */ Rnormal, /* normal character */ Ranychar, /* any character except newline */ Rquote, /* the quote character */ Rbol, /* match beginning of line */ Reol, /* match end of line */ Roptional, /* match preceding expression optionally */ Rstar, /* match preceding expr zero or more times */ Rplus, /* match preceding expr one or more times */ Ror, /* match either of alternatives */ Ropenpar, /* opening parenthesis */ Rclosepar, /* closing parenthesis */ Rmemory, /* match memory register */ Rextended_memory, /* \vnn to match registers 10-99 */ Ropenset, /* open set. Internal syntax hard-coded below. */ /* the following are gnu extensions to "normal" regexp syntax */ Rbegbuf, /* beginning of buffer */ Rendbuf, /* end of buffer */ Rwordchar, /* word character */ Rnotwordchar, /* not word character */ Rwordbeg, /* beginning of word */ Rwordend, /* end of word */ Rwordbound, /* word bound */ Rnotwordbound, /* not word bound */ #ifdef emacs Remacs_at_dot, /* emacs: at dot */ Remacs_syntaxspec, /* syntaxspec */ Remacs_notsyntaxspec, /* notsyntaxspec */ #endif /* emacs */ Rnum_ops }; static int re_compile_initialized = 0; static int regexp_syntax = 0; static unsigned char regexp_plain_ops[256]; static unsigned char regexp_quoted_ops[256]; static unsigned char regexp_precedences[Rnum_ops]; static int regexp_context_indep_ops; static int regexp_ansi_sequences; #define NUM_LEVELS 5 /* number of precedence levels in use */ #define MAX_NESTING 100 /* max nesting level of operators */ #ifdef emacs /* This code is for emacs compatibility only. */ #include "config.h" #include "lisp.h" #include "buffer.h" #include "syntax.h" /* emacs defines NULL in some strange way? */ #undef NULL #define NULL 0 #else /* emacs */ #define SYNTAX(ch) re_syntax_table[(unsigned char)(ch)] #define Sword 1 /* 94/01/19 (cjk) made re_syntax_table unsigned */ #ifdef SYNTAX_TABLE unsigned char *re_syntax_table; #else static unsigned char re_syntax_table[256]; #endif /* SYNTAX_TABLE */ #endif /* emacs */ /* 94/01/19 (cjk) forward declaration for memset added */ /* CFS - MacOS X Server continues to not declare memset */ //#if defined(NeXT) || defined(__APPLE__) // void *memset(void *, unsigned char, unsigned int); //#endif /* defined(NeXT) */ //MacOS X 1.0.0 finally defines memset - all these years of waiting are over! static void re_compile_initialize() { int a; #if !defined(emacs) && !defined(SYNTAX_TABLE) static int syntax_table_inited = 0; if (!syntax_table_inited) { syntax_table_inited = 1; memset(re_syntax_table, 0, 256); for (a = 'a'; a <= 'z'; a++) re_syntax_table[a] = Sword; for (a = 'A'; a <= 'Z'; a++) re_syntax_table[a] = Sword; for (a = '0'; a <= '9'; a++) re_syntax_table[a] = Sword; } #endif /* !emacs && !SYNTAX_TABLE */ re_compile_initialized = 1; for (a = 0; a < 256; a++) { regexp_plain_ops[a] = Rnormal; regexp_quoted_ops[a] = Rnormal; } for (a = '0'; a <= '9'; a++) regexp_quoted_ops[a] = Rmemory; regexp_plain_ops['\134'] = Rquote; if (regexp_syntax & RE_NO_BK_PARENS) { regexp_plain_ops['('] = Ropenpar; regexp_plain_ops[')'] = Rclosepar; } else { regexp_quoted_ops['('] = Ropenpar; regexp_quoted_ops[')'] = Rclosepar; } if (regexp_syntax & RE_NO_BK_VBAR) regexp_plain_ops['\174'] = Ror; else regexp_quoted_ops['\174'] = Ror; regexp_plain_ops['*'] = Rstar; if (regexp_syntax & RE_BK_PLUS_QM) { regexp_quoted_ops['+'] = Rplus; regexp_quoted_ops['?'] = Roptional; } else { regexp_plain_ops['+'] = Rplus; regexp_plain_ops['?'] = Roptional; } if (regexp_syntax & RE_NEWLINE_OR) regexp_plain_ops['\n'] = Ror; regexp_plain_ops['\133'] = Ropenset; regexp_plain_ops['\136'] = Rbol; regexp_plain_ops['$'] = Reol; regexp_plain_ops['.'] = Ranychar; if (!(regexp_syntax & RE_NO_GNU_EXTENSIONS)) { #ifdef emacs regexp_quoted_ops['='] = Remacs_at_dot; regexp_quoted_ops['s'] = Remacs_syntaxspec; regexp_quoted_ops['S'] = Remacs_notsyntaxspec; #endif /* emacs */ regexp_quoted_ops['w'] = Rwordchar; regexp_quoted_ops['W'] = Rnotwordchar; regexp_quoted_ops['<'] = Rwordbeg; regexp_quoted_ops['>'] = Rwordend; regexp_quoted_ops['b'] = Rwordbound; regexp_quoted_ops['B'] = Rnotwordbound; regexp_quoted_ops['`'] = Rbegbuf; regexp_quoted_ops['\''] = Rendbuf; } if (regexp_syntax & RE_ANSI_HEX) regexp_quoted_ops['v'] = Rextended_memory; for (a = 0; a < Rnum_ops; a++) regexp_precedences[a] = 4; if (regexp_syntax & RE_TIGHT_VBAR) { regexp_precedences[Ror] = 3; regexp_precedences[Rbol] = 2; regexp_precedences[Reol] = 2; } else { regexp_precedences[Ror] = 2; regexp_precedences[Rbol] = 3; regexp_precedences[Reol] = 3; } regexp_precedences[Rclosepar] = 1; regexp_precedences[Rend] = 0; regexp_context_indep_ops = (regexp_syntax & RE_CONTEXT_INDEP_OPS) != 0; regexp_ansi_sequences = (regexp_syntax & RE_ANSI_HEX) != 0; } int re_set_syntax(syntax) int syntax; { int ret; ret = regexp_syntax; regexp_syntax = syntax; re_compile_initialize(); return ret; } static int hex_char_to_decimal(ch) int ch; { if (ch >= '0' && ch <= '9') return ch - '0'; if (ch >= 'a' && ch <= 'f') return ch - 'a' + 10; if (ch >= 'A' && ch <= 'F') return ch - 'A' + 10; return 16; } char *re_compile_pattern(regex, size, bufp) char *regex; int size; regexp_t bufp; { int a, pos, op, current_level, level, opcode; int pattern_offset=0, alloc; /* 94/01/19 (cjk) pattern_offset initialized */ int starts[NUM_LEVELS * MAX_NESTING], starts_base; int future_jumps[MAX_NESTING], num_jumps; unsigned char ch=0; /* 94/01/19 (cjk) ch initialized */ char *pattern, *translate; int next_register, paren_depth, num_open_registers, open_registers[RE_NREGS]; int beginning_context; #define NEXTCHAR(var) \ MACRO_BEGIN \ if (pos >= size) \ goto ends_prematurely; \ (var) = regex[pos]; \ pos++; \ MACRO_END #define ALLOC(amount) \ MACRO_BEGIN \ if (pattern_offset+(amount) > alloc) \ { \ alloc += 256 + (amount); \ pattern = realloc(pattern, alloc); \ if (!pattern) \ goto out_of_memory; \ } \ MACRO_END #define STORE(ch) pattern[pattern_offset++] = (ch) #define CURRENT_LEVEL_START (starts[starts_base + current_level]) #define SET_LEVEL_START starts[starts_base + current_level] = pattern_offset #define PUSH_LEVEL_STARTS if (starts_base < (MAX_NESTING-1)*NUM_LEVELS) \ starts_base += NUM_LEVELS; \ else \ goto too_complex #define POP_LEVEL_STARTS starts_base -= NUM_LEVELS #define PUT_ADDR(offset,addr) \ MACRO_BEGIN \ int disp = (addr) - (offset) - 2; \ pattern[(offset)] = disp & 0xff; \ pattern[(offset)+1] = (disp>>8) & 0xff; \ MACRO_END #define INSERT_JUMP(pos,type,addr) \ MACRO_BEGIN \ int a, p = (pos), t = (type), ad = (addr); \ for (a = pattern_offset - 1; a >= p; a--) \ pattern[a + 3] = pattern[a]; \ pattern[p] = t; \ PUT_ADDR(p+1,ad); \ pattern_offset += 3; \ MACRO_END #define SETBIT(buf,offset,bit) (buf)[(offset)+(bit)/8] |= (1<<((bit) & 7)) #define SET_FIELDS \ MACRO_BEGIN \ bufp->allocated = alloc; \ bufp->buffer = pattern; \ bufp->used = pattern_offset; \ MACRO_END #define GETHEX(var) \ MACRO_BEGIN \ char gethex_ch, gethex_value; \ NEXTCHAR(gethex_ch); \ gethex_value = hex_char_to_decimal(gethex_ch); \ if (gethex_value == 16) \ goto hex_error; \ NEXTCHAR(gethex_ch); \ gethex_ch = hex_char_to_decimal(gethex_ch); \ if (gethex_ch == 16) \ goto hex_error; \ (var) = gethex_value * 16 + gethex_ch; \ MACRO_END #define ANSI_TRANSLATE(ch) \ MACRO_BEGIN \ switch (ch) \ { \ case 'a': \ case 'A': \ ch = 7; /* audible bell */ \ break; \ case 'b': \ case 'B': \ ch = 8; /* backspace */ \ break; \ case 'f': \ case 'F': \ ch = 12; /* form feed */ \ break; \ case 'n': \ case 'N': \ ch = 10; /* line feed */ \ break; \ case 'r': \ case 'R': \ ch = 13; /* carriage return */ \ break; \ case 't': \ case 'T': \ ch = 9; /* tab */ \ break; \ case 'v': \ case 'V': \ ch = 11; /* vertical tab */ \ break; \ case 'x': /* hex code */ \ case 'X': \ GETHEX(ch); \ break; \ default: \ /* other characters passed through */ \ if (translate) \ ch = translate[(unsigned char)ch]; \ break; \ } \ MACRO_END if (!re_compile_initialized) re_compile_initialize(); bufp->used = 0; bufp->fastmap_accurate = 0; bufp->uses_registers = 0; translate = bufp->translate; pattern = bufp->buffer; alloc = bufp->allocated; if (alloc == 0 || pattern == NULL) { alloc = 256; pattern = malloc(alloc); if (!pattern) goto out_of_memory; } pattern_offset = 0; starts_base = 0; num_jumps = 0; current_level = 0; SET_LEVEL_START; num_open_registers = 0; next_register = 1; paren_depth = 0; beginning_context = 1; op = -1; /* we use Rend dummy to ensure that pending jumps are updated (due to low priority of Rend) before exiting the loop. */ pos = 0; while (op != Rend) { if (pos >= size) op = Rend; else { NEXTCHAR(ch); if (translate) ch = translate[(unsigned char)ch]; op = regexp_plain_ops[(unsigned char)ch]; if (op == Rquote) { NEXTCHAR(ch); op = regexp_quoted_ops[(unsigned char)ch]; if (op == Rnormal && regexp_ansi_sequences) ANSI_TRANSLATE(ch); } } level = regexp_precedences[op]; /* printf("ch='%c' op=%d level=%d current_level=%d curlevstart=%d\n", ch, op, level, current_level, CURRENT_LEVEL_START); */ if (level > current_level) { for (current_level++; current_level < level; current_level++) SET_LEVEL_START; SET_LEVEL_START; } else if (level < current_level) { current_level = level; for (;num_jumps > 0 && future_jumps[num_jumps-1] >= CURRENT_LEVEL_START; num_jumps--) PUT_ADDR(future_jumps[num_jumps-1], pattern_offset); } switch (op) { case Rend: break; case Rnormal: normal_char: opcode = Cexact; store_opcode_and_arg: /* opcode & ch must be set */ SET_LEVEL_START; ALLOC(2); STORE(opcode); STORE(ch); break; case Ranychar: opcode = Canychar; store_opcode: SET_LEVEL_START; ALLOC(1); STORE(opcode); break; case Rquote: abort(); /*NOTREACHED*/ case Rbol: if (!beginning_context) if (regexp_context_indep_ops) goto op_error; else goto normal_char; opcode = Cbol; goto store_opcode; case Reol: if (!((pos >= size) || ((regexp_syntax & RE_NO_BK_VBAR) ? (regex[pos] == '\174') : (pos+1 < size && regex[pos] == '\134' && regex[pos+1] == '\174')) || ((regexp_syntax & RE_NO_BK_PARENS)? (regex[pos] == ')'): (pos+1 < size && regex[pos] == '\134' && regex[pos+1] == ')')))) if (regexp_context_indep_ops) goto op_error; else goto normal_char; opcode = Ceol; goto store_opcode; break; case Roptional: if (beginning_context) if (regexp_context_indep_ops) goto op_error; else goto normal_char; if (CURRENT_LEVEL_START == pattern_offset) break; /* ignore empty patterns for ? */ ALLOC(3); INSERT_JUMP(CURRENT_LEVEL_START, Cfailure_jump, pattern_offset + 3); break; case Rstar: case Rplus: if (beginning_context) if (regexp_context_indep_ops) goto op_error; else goto normal_char; if (CURRENT_LEVEL_START == pattern_offset) break; /* ignore empty patterns for + and * */ ALLOC(9); INSERT_JUMP(CURRENT_LEVEL_START, Cfailure_jump, pattern_offset + 6); INSERT_JUMP(pattern_offset, Cstar_jump, CURRENT_LEVEL_START); if (op == Rplus) /* jump over initial failure_jump */ INSERT_JUMP(CURRENT_LEVEL_START, Cdummy_failure_jump, CURRENT_LEVEL_START + 6); break; case Ror: ALLOC(6); INSERT_JUMP(CURRENT_LEVEL_START, Cfailure_jump, pattern_offset + 6); if (num_jumps >= MAX_NESTING) goto too_complex; STORE(Cjump); future_jumps[num_jumps++] = pattern_offset; STORE(0); STORE(0); SET_LEVEL_START; break; case Ropenpar: SET_LEVEL_START; if (next_register < RE_NREGS) { bufp->uses_registers = 1; ALLOC(2); STORE(Cstart_memory); STORE(next_register); open_registers[num_open_registers++] = next_register; next_register++; } paren_depth++; PUSH_LEVEL_STARTS; current_level = 0; SET_LEVEL_START; break; case Rclosepar: if (paren_depth <= 0) goto parenthesis_error; POP_LEVEL_STARTS; current_level = regexp_precedences[Ropenpar]; paren_depth--; if (paren_depth < num_open_registers) { bufp->uses_registers = 1; ALLOC(2); STORE(Cend_memory); num_open_registers--; STORE(open_registers[num_open_registers]); } break; case Rmemory: if (ch == '0') goto bad_match_register; assert(ch >= '0' && ch <= '9'); bufp->uses_registers = 1; opcode = Cmatch_memory; ch -= '0'; goto store_opcode_and_arg; case Rextended_memory: NEXTCHAR(ch); if (ch < '0' || ch > '9') goto bad_match_register; NEXTCHAR(a); if (a < '0' || a > '9') goto bad_match_register; ch = 10 * (a - '0') + ch - '0'; if (ch <= 0 || ch >= RE_NREGS) goto bad_match_register; bufp->uses_registers = 1; opcode = Cmatch_memory; goto store_opcode_and_arg; case Ropenset: { int complement,prev,offset,range,firstchar; SET_LEVEL_START; ALLOC(1+256/8); STORE(Cset); offset = pattern_offset; for (a = 0; a < 256/8; a++) STORE(0); NEXTCHAR(ch); if (translate) ch = translate[(unsigned char)ch]; if (ch == '\136') { complement = 1; NEXTCHAR(ch); if (translate) ch = translate[(unsigned char)ch]; } else complement = 0; prev = -1; range = 0; firstchar = 1; while (ch != '\135' || firstchar) { firstchar = 0; if (regexp_ansi_sequences && ch == '\134') { NEXTCHAR(ch); ANSI_TRANSLATE(ch); } if (range) { for (a = prev; a <= ch; a++) SETBIT(pattern, offset, a); prev = -1; range = 0; } else if (prev != -1 && ch == '-') range = 1; else { SETBIT(pattern, offset, ch); prev = ch; } NEXTCHAR(ch); if (translate) ch = translate[(unsigned char)ch]; } if (range) SETBIT(pattern, offset, '-'); if (complement) { for (a = 0; a < 256/8; a++) pattern[offset+a] ^= 0xff; } break; } case Rbegbuf: opcode = Cbegbuf; goto store_opcode; case Rendbuf: opcode = Cendbuf; goto store_opcode; case Rwordchar: opcode = Csyntaxspec; ch = Sword; goto store_opcode_and_arg; case Rnotwordchar: opcode = Cnotsyntaxspec; ch = Sword; goto store_opcode_and_arg; case Rwordbeg: opcode = Cwordbeg; goto store_opcode; case Rwordend: opcode = Cwordend; goto store_opcode; case Rwordbound: opcode = Cwordbound; goto store_opcode; case Rnotwordbound: opcode = Cnotwordbound; goto store_opcode; #ifdef emacs case Remacs_at_dot: opcode = Cemacs_at_dot; goto store_opcode; case Remacs_syntaxspec: NEXTCHAR(ch); if (translate) ch = translate[(unsigned char)ch]; opcode = Csyntaxspec; ch = syntax_spec_code[(unsigned char)ch]; goto store_opcode_and_arg; case Remacs_notsyntaxspec: NEXTCHAR(ch); if (translate) ch = translate[(unsigned char)ch]; opcode = Cnotsyntaxspec; ch = syntax_spec_code[(unsigned char)ch]; goto store_opcode_and_arg; #endif /* emacs */ default: abort(); } beginning_context = (op == Ropenpar || op == Ror); } if (starts_base != 0) goto parenthesis_error; assert(num_jumps == 0); ALLOC(1); STORE(Cend); SET_FIELDS; return NULL; op_error: SET_FIELDS; return "Badly placed special character"; bad_match_register: SET_FIELDS; return "Bad match register number"; hex_error: SET_FIELDS; return "Bad hexadecimal number"; parenthesis_error: SET_FIELDS; return "Badly placed parenthesis"; out_of_memory: SET_FIELDS; return "Out of memory"; ends_prematurely: SET_FIELDS; return "Regular expression ends prematurely"; too_complex: SET_FIELDS; return "Regular expression too complex"; } #undef CHARAT #undef NEXTCHAR #undef GETHEX #undef ALLOC #undef STORE #undef CURRENT_LEVEL_START #undef SET_LEVEL_START #undef PUSH_LEVEL_STARTS #undef POP_LEVEL_STARTS #undef PUT_ADDR #undef INSERT_JUMP #undef SETBIT #undef SET_FIELDS static void re_compile_fastmap_aux(code, pos, visited, can_be_null, fastmap) char *code, *visited, *can_be_null, *fastmap; int pos; { int a, b, syntaxcode; if (visited[pos]) return; /* we have already been here */ visited[pos] = 1; for (;;) switch (code[pos++]) { case Cend: *can_be_null = 1; return; case Cbol: case Cbegbuf: case Cendbuf: case Cwordbeg: case Cwordend: case Cwordbound: case Cnotwordbound: #ifdef emacs case Cemacs_at_dot: #endif /* emacs */ break; case Csyntaxspec: syntaxcode = code[pos++]; for (a = 0; a < 256; a++) if (SYNTAX(a) == syntaxcode) fastmap[a] = 1; return; case Cnotsyntaxspec: syntaxcode = code[pos++]; for (a = 0; a < 256; a++) if (SYNTAX(a) != syntaxcode) fastmap[a] = 1; return; case Ceol: fastmap['\n'] = 1; if (*can_be_null == 0) *can_be_null = 2; /* can match null, but only at end of buffer*/ return; case Cset: for (a = 0; a < 256/8; a++) if (code[pos + a] != 0) for (b = 0; b < 8; b++) if (code[pos + a] & (1 << b)) fastmap[(a << 3) + b] = 1; pos += 256/8; return; case Cexact: fastmap[(unsigned char)code[pos]] = 1; return; case Canychar: for (a = 0; a < 256; a++) if (a != '\n') fastmap[a] = 1; return; case Cstart_memory: case Cend_memory: pos++; break; case Cmatch_memory: for (a = 0; a < 256; a++) fastmap[a] = 1; *can_be_null = 1; return; case Cjump: case Cdummy_failure_jump: case Cupdate_failure_jump: case Cstar_jump: a = (unsigned char)code[pos++]; a |= (unsigned char)code[pos++] << 8; pos += (int)(short)a; if (visited[pos]) { /* argh... the regexp contains empty loops. This is not good, as this may cause a failure stack overflow when matching. Oh well. */ /* this path leads nowhere; pursue other paths. */ return; } visited[pos] = 1; break; case Cfailure_jump: a = (unsigned char)code[pos++]; a |= (unsigned char)code[pos++] << 8; a = pos + (int)(short)a; re_compile_fastmap_aux(code, a, visited, can_be_null, fastmap); break; default: abort(); /* probably some opcode is missing from this switch */ /*NOTREACHED*/ } } static int re_do_compile_fastmap(buffer, used, pos, can_be_null, fastmap) char *buffer, *fastmap, *can_be_null; int used, pos; { char small_visited[512], *visited; if (used <= sizeof(small_visited)) visited = small_visited; else { visited = malloc(used); if (!visited) return 0; } *can_be_null = 0; memset(fastmap, 0, 256); memset(visited, 0, used); re_compile_fastmap_aux(buffer, pos, visited, can_be_null, fastmap); if (visited != small_visited) free(visited); return 1; } void re_compile_fastmap(bufp) regexp_t bufp; { if (!bufp->fastmap || bufp->fastmap_accurate) return; assert(bufp->used > 0); if (!re_do_compile_fastmap(bufp->buffer, bufp->used, 0, &bufp->can_be_null, bufp->fastmap)) return; if (bufp->buffer[0] == Cbol) bufp->anchor = 1; /* begline */ else if (bufp->buffer[0] == Cbegbuf) bufp->anchor = 2; /* begbuf */ else bufp->anchor = 0; /* none */ bufp->fastmap_accurate = 1; } #define INITIAL_FAILURES 128 /* initial # failure points to allocate */ #define MAX_FAILURES 4100 /* max # of failure points before failing */ int re_match_pattern_2(bufp, string1, size1, string2, size2, pos, regs, mstop) regexp_t bufp; char *string1, *string2; int size1, size2, pos, mstop; regexp_registers_t regs; { struct failure_point { char *text, *partend, *code; } *failure_stack_start, *failure_sp, *failure_stack_end, initial_failure_stack[INITIAL_FAILURES]; char *code, *translate, *text, *textend, *partend, *part_2_end; char *regstart_text[RE_NREGS], *regstart_partend[RE_NREGS]; char *regend_text[RE_NREGS], *regend_partend[RE_NREGS]; int a, b, ch, reg, regch, match_end; char *regtext, *regpartend, *regtextend; #define PREFETCH \ MACRO_BEGIN \ if (text == partend) \ { \ if (text == textend) \ goto fail; \ text = string2; \ partend = part_2_end; \ } \ MACRO_END #define NEXTCHAR(var) \ MACRO_BEGIN \ PREFETCH; \ (var) = (unsigned char)*text++; \ if (translate) \ (var) = (unsigned char)translate[(var)]; \ MACRO_END assert(pos >= 0 && size1 >= 0 && size2 >= 0 && mstop >= 0); assert(mstop <= size1 + size2); assert(pos <= mstop); if (pos <= size1) { text = string1 + pos; if (mstop <= size1) { partend = string1 + mstop; textend = partend; } else { partend = string1 + size1; textend = string2 + mstop - size1; } part_2_end = string2 + mstop - size1; } else { text = string2 + pos - size1; partend = string2 + mstop - size1; textend = partend; part_2_end = partend; } if (bufp->uses_registers && regs != NULL) for (a = 0; a < RE_NREGS; a++) regend_text[a] = NULL; code = bufp->buffer; translate = bufp->translate; failure_stack_start = failure_sp = initial_failure_stack; failure_stack_end = initial_failure_stack + INITIAL_FAILURES; #if 0 /* re_search_pattern_2 has already done this, and otherwise we get little benefit from this. So I'll leave this out. */ if (bufp->fastmap_accurate && !bufp->can_be_null && text != textend && !bufp->fastmap[translate ? (unsigned char)translate[(unsigned char)*text] : (unsigned char)*text]) return -1; /* it can't possibly match */ #endif continue_matching: for (;;) { switch (*code++) { case Cend: if (partend != part_2_end) match_end = text - string1; else match_end = text - string2 + size1; if (regs) { regs->start[0] = pos; regs->end[0] = match_end; if (!bufp->uses_registers) { for (a = 1; a < RE_NREGS; a++) { regs->start[a] = -1; regs->end[a] = -1; } } else { for (a = 1; a < RE_NREGS; a++) { if (regend_text[a] == NULL) { regs->start[a] = -1; regs->end[a] = -1; continue; } if (regstart_partend[a] != part_2_end) regs->start[a] = regstart_text[a] - string1; else regs->start[a] = regstart_text[a] - string2 + size1; if (regend_partend[a] != part_2_end) regs->end[a] = regend_text[a] - string1; else regs->end[a] = regend_text[a] - string2 + size1; } } } if (failure_stack_start != initial_failure_stack) free((char *)failure_stack_start); return match_end - pos; case Cbol: if (text == string1 || text[-1] == '\n') /* text[-1] always valid */ break; goto fail; case Ceol: if (text == string2 + size2 || (text == string1 + size1 ? (size2 == 0 || *string2 == '\n') : *text == '\n')) break; goto fail; case Cset: NEXTCHAR(ch); if (code[ch/8] & (1<<(ch & 7))) { code += 256/8; break; } goto fail; case Cexact: NEXTCHAR(ch); if (ch != (unsigned char)*code++) goto fail; break; case Canychar: NEXTCHAR(ch); if (ch == '\n') goto fail; break; case Cstart_memory: reg = *code++; regstart_text[reg] = text; regstart_partend[reg] = partend; break; case Cend_memory: reg = *code++; regend_text[reg] = text; regend_partend[reg] = partend; break; case Cmatch_memory: reg = *code++; if (regend_text[reg] == NULL) goto fail; /* or should we just match nothing? */ regtext = regstart_text[reg]; regtextend = regend_text[reg]; if (regstart_partend[reg] == regend_partend[reg]) regpartend = regtextend; else regpartend = string1 + size1; for (;regtext != regtextend;) { NEXTCHAR(ch); if (regtext == regpartend) regtext = string2; regch = (unsigned char)*regtext++; if (translate) regch = (unsigned char)translate[regch]; if (regch != ch) goto fail; } break; case Cstar_jump: /* star is coded as: 1: failure_jump 2 ... code for operand of star star_jump 1 2: ... code after star We change the star_jump to update_failure_jump if we can determine that it is safe to do so; otherwise we change it to an ordinary jump. plus is coded as jump 2 1: failure_jump 3 2: ... code for operand of plus star_jump 1 3: ... code after plus For star_jump considerations this is processed identically to star. */ a = (unsigned char)*code++; a |= (unsigned char)*code++ << 8; a = (int)(short)a; { char map[256], can_be_null; char *p1, *p2; p1 = code + a + 3; /* skip the failure_jump */ assert(p1[-3] == Cfailure_jump); p2 = code; /* p1 points inside loop, p2 points to after loop */ if (!re_do_compile_fastmap(bufp->buffer, bufp->used, p2 - bufp->buffer, &can_be_null, map)) goto make_normal_jump; /* If we might introduce a new update point inside the loop, we can't optimize because then update_jump would update a wrong failure point. Thus we have to be quite careful here. */ loop_p1: /* loop until we find something that consumes a character */ switch (*p1++) { case Cbol: case Ceol: case Cbegbuf: case Cendbuf: case Cwordbeg: case Cwordend: case Cwordbound: case Cnotwordbound: #ifdef emacs case Cemacs_at_dot: #endif /* emacs */ goto loop_p1; case Cstart_memory: case Cend_memory: p1++; goto loop_p1; case Cexact: ch = (unsigned char)*p1++; if (map[ch]) goto make_normal_jump; break; case Canychar: for (b = 0; b < 256; b++) if (b != '\n' && map[b]) goto make_normal_jump; break; case Cset: for (b = 0; b < 256; b++) if ((p1[b >> 3] & (1 << (b & 7))) && map[b]) goto make_normal_jump; p1 += 256/8; break; default: goto make_normal_jump; } /* now we know that we can't backtrack. */ while (p1 != p2 - 3) { switch (*p1++) { case Cend: abort(); /* we certainly shouldn't get this inside loop */ /*NOTREACHED*/ case Cbol: case Ceol: case Canychar: case Cbegbuf: case Cendbuf: case Cwordbeg: case Cwordend: case Cwordbound: case Cnotwordbound: #ifdef emacs case Cemacs_at_dot: #endif /* emacs */ break; case Cset: p1 += 256/8; break; case Cexact: case Cstart_memory: case Cend_memory: case Cmatch_memory: case Csyntaxspec: case Cnotsyntaxspec: p1++; break; case Cjump: case Cstar_jump: case Cfailure_jump: case Cupdate_failure_jump: case Cdummy_failure_jump: goto make_normal_jump; default: printf("regexpr.c: processing star_jump: unknown op %d\n", p1[-1]); break; } } goto make_update_jump; } make_normal_jump: /* printf("changing to normal jump\n"); */ code -= 3; *code = Cjump; break; make_update_jump: /* printf("changing to update jump\n"); */ code -= 2; a += 3; /* jump to after the Cfailure_jump */ code[-1] = Cupdate_failure_jump; code[0] = a & 0xff; code[1] = a >> 8; /* fall to next case */ case Cupdate_failure_jump: failure_sp[-1].text = text; failure_sp[-1].partend = partend; /* fall to next case */ case Cjump: a = (unsigned char)*code++; a |= (unsigned char)*code++ << 8; code += (int)(short)a; break; case Cdummy_failure_jump: case Cfailure_jump: if (failure_sp == failure_stack_end) { if (failure_stack_start != initial_failure_stack) goto error; failure_stack_start = (struct failure_point *) malloc(MAX_FAILURES * sizeof(*failure_stack_start)); failure_stack_end = failure_stack_start + MAX_FAILURES; memcpy((char *)failure_stack_start, (char *)initial_failure_stack, INITIAL_FAILURES * sizeof(*failure_stack_start)); failure_sp = failure_stack_start + INITIAL_FAILURES; } a = (unsigned char)*code++; a |= (unsigned char)*code++ << 8; a = (int)(short)a; if (code[-3] == Cdummy_failure_jump) { /* this is only used in plus */ assert(*code == Cfailure_jump); b = (unsigned char)code[1]; b |= (unsigned char)code[2] << 8; failure_sp->code = code + (int)(short)b + 3; failure_sp->text = NULL; code += a; } else { failure_sp->code = code + a; failure_sp->text = text; failure_sp->partend = partend; } failure_sp++; break; case Cbegbuf: if (text == string1) break; goto fail; case Cendbuf: if (size2 == 0 ? text == string1 + size1 : text == string2 + size2) break; goto fail; case Cwordbeg: if (text == string2 + size2) goto fail; if (size2 == 0 && text == string1 + size1) goto fail; if (SYNTAX(text == string1 + size1 ? *string1 : *text) != Sword) goto fail; if (text == string1) break; if (SYNTAX(text[-1]) != Sword) break; goto fail; case Cwordend: if (text == string1) goto fail; if (SYNTAX(text[-1]) != Sword) goto fail; if (text == string2 + size2) break; if (size2 == 0 && text == string1 + size1) break; if (SYNTAX(*text) == Sword) goto fail; break; case Cwordbound: /* Note: as in gnu regexp, this also matches at the beginning and end of buffer. */ if (text == string1 || text == string2 + size2 || (size2 == 0 && text == string1 + size1)) break; if ((SYNTAX(text[-1]) == Sword) ^ (SYNTAX(text == string1 + size1 ? *string2 : *text) == Sword)) break; goto fail; case Cnotwordbound: /* Note: as in gnu regexp, this never matches at the beginning and end of buffer. */ if (text == string1 || text == string2 + size2 || (size2 == 0 && text == string1 + size1)) goto fail; if (!((SYNTAX(text[-1]) == Sword) ^ (SYNTAX(text == string1 + size1 ? *string2 : *text) == Sword))) goto fail; break; case Csyntaxspec: NEXTCHAR(ch); if (SYNTAX(ch) != (unsigned char)*code++) goto fail; break; case Cnotsyntaxspec: NEXTCHAR(ch); if (SYNTAX(ch) != (unsigned char)*code++) break; goto fail; #ifdef emacs case Cemacs_at_dot: if (PTR_CHAR_POS((unsigned char *)text) + 1 != point) goto fail; break; #endif /* emacs */ default: abort(); /*NOTREACHED*/ } } abort(); /*NOTREACHED*/ fail: if (failure_sp != failure_stack_start) { failure_sp--; text = failure_sp->text; if (text == NULL) goto fail; partend = failure_sp->partend; code = failure_sp->code; goto continue_matching; } if (failure_stack_start != initial_failure_stack) free((char *)failure_stack_start); return -1; error: if (failure_stack_start != initial_failure_stack) free((char *)failure_stack_start); return -2; } #undef PREFETCH #undef NEXTCHAR #undef PUSH_FAILURE int re_match_pattern(bufp, string, size, pos, regs) regexp_t bufp; char *string; int size, pos; regexp_registers_t regs; { return re_match_pattern_2(bufp, string, size, (char *)NULL, 0, pos, regs, size); } int re_search_pattern_2(bufp, string1, size1, string2, size2, pos, range, regs, mstop) regexp_t bufp; char *string1, *string2; int size1, size2, pos, range, mstop; regexp_registers_t regs; { char *fastmap, *translate, *text, *partstart, *partend; int dir, ret; char anchor; assert(size1 >= 0 && size2 >= 0 && pos >= 0 && mstop >= 0); assert(pos + range >= 0 && pos + range <= size1 + size2); assert(pos <= mstop); fastmap = bufp->fastmap; translate = bufp->translate; if (fastmap && !bufp->fastmap_accurate) re_compile_fastmap(bufp); anchor = bufp->anchor; if (bufp->can_be_null == 1) /* can_be_null == 2: can match null at eob */ fastmap = NULL; if (range < 0) { dir = -1; range = -range; } else dir = 1; if (anchor == 2) if (pos != 0) return -1; else range = 0; for (; range >= 0; range--, pos += dir) { if (fastmap) { if (dir == 1) { /* searching forwards */ if (pos < size1) { text = string1 + pos; if (pos + range > size1) partend = string1 + size1; else partend = string1 + pos + range; } else { text = string2 + pos - size1; partend = string2 + pos + range - size1; } partstart = text; if (translate) while (text != partend && !fastmap[(unsigned char) translate[(unsigned char)*text]]) text++; else while (text != partend && !fastmap[(unsigned char)*text]) text++; pos += text - partstart; range -= text - partstart; if (pos == size1 + size2 && bufp->can_be_null == 0) return -1; } else { /* searching backwards */ if (pos <= size1) { text = string1 + pos; partstart = string1 + pos - range; } else { text = string2 + pos - size1; if (range < pos - size1) partstart = string2 + pos - size1 - range; else partstart = string2; } partend = text; if (translate) while (text != partstart && !fastmap[(unsigned char) translate[(unsigned char)*text]]) text--; else while (text != partstart && !fastmap[(unsigned char)*text]) text--; pos -= partend - text; range -= partend - text; } } if (anchor == 1) { /* anchored to begline */ if (pos > 0 && (pos <= size1 ? string1[pos - 1] : string2[pos - size1 - 1]) != '\n') continue; } assert(pos >= 0 && pos <= size1 + size2); ret = re_match_pattern_2(bufp, string1, size1, string2, size2, pos, regs, mstop); if (ret >= 0) return pos; if (ret == -2) return -2; } return -1; } int re_search_pattern(bufp, string, size, startpos, range, regs) regexp_t bufp; char *string; int size, startpos, range; regexp_registers_t regs; { return re_search_pattern_2(bufp, string, size, (char *)NULL, 0, startpos, range, regs, size); } /* 94/01/19 (cjk) hide these on NeXT */ #if !defined(NeXT) static struct re_pattern_buffer re_comp_buf; char *re_comp(s) char *s; { if (s == NULL) { if (!re_comp_buf.buffer) return "Out of memory"; return NULL; } if (!re_comp_buf.buffer) { /* the buffer will be allocated automatically */ re_comp_buf.fastmap = malloc(256); re_comp_buf.translate = NULL; } return re_compile_pattern(s, strlen(s), &re_comp_buf); } int re_exec(s) char *s; { int len = strlen(s); return re_search_pattern(&re_comp_buf, s, len, 0, len, (regexp_registers_t)NULL) >= 0; } #endif /* !defined(NeXT) */ #ifdef TEST_REGEXP int main() { char buf[500]; char *cp; struct re_pattern_buffer exp; struct re_registers regs; int a,pos; char fastmap[256]; exp.allocated = 0; exp.buffer = 0; exp.translate = NULL; exp.fastmap = fastmap; /* re_set_syntax(RE_NO_BK_PARENS|RE_NO_BK_VBAR|RE_ANSI_HEX); */ while (1) { printf("Enter regexp:\n"); gets(buf); cp=re_compile_pattern(buf, strlen(buf), &exp); if (cp) { printf("Error: %s\n", cp); continue; } re_compile_fastmap(&exp); printf("dump:\n"); for (pos = 0; pos < exp.used;) { printf("%d: ", pos); switch (exp.buffer[pos++]) { case Cend: strcpy(buf, "end"); break; case Cbol: strcpy(buf, "bol"); break; case Ceol: strcpy(buf, "eol"); break; case Cset: strcpy(buf, "set "); for (a = 0; a < 256/8; a++) sprintf(buf+strlen(buf)," %02x", (unsigned char)exp.buffer[pos++]); break; case Cexact: sprintf(buf, "exact '%c' 0x%x", exp.buffer[pos], (unsigned char)exp.buffer[pos]); pos++; break; case Canychar: strcpy(buf, "anychar"); break; case Cstart_memory: sprintf(buf, "start_memory %d", exp.buffer[pos++]); break; case Cend_memory: sprintf(buf, "end_memory %d", exp.buffer[pos++]); break; case Cmatch_memory: sprintf(buf, "match_memory %d", exp.buffer[pos++]); break; case Cjump: case Cdummy_failure_jump: case Cstar_jump: case Cfailure_jump: case Cupdate_failure_jump: a = (unsigned char)exp.buffer[pos++]; a += (unsigned char)exp.buffer[pos++] << 8; a = (int)(short)a; switch (exp.buffer[pos-3]) { case Cjump: cp = "jump"; break; case Cstar_jump: cp = "star_jump"; break; case Cfailure_jump: cp = "failure_jump"; break; case Cupdate_failure_jump: cp = "update_failure_jump"; break; case Cdummy_failure_jump: cp = "dummy_failure_jump"; break; default: cp = "unknown jump"; break; } sprintf(buf, "%s %d", cp, a + pos); break; case Cbegbuf: strcpy(buf,"begbuf"); break; case Cendbuf: strcpy(buf,"endbuf"); break; case Cwordbeg: strcpy(buf,"wordbeg"); break; case Cwordend: strcpy(buf,"wordend"); break; case Cwordbound: strcpy(buf,"wordbound"); break; case Cnotwordbound: strcpy(buf,"notwordbound"); break; default: sprintf(buf, "unknown code %d", (unsigned char)exp.buffer[pos - 1]); break; } printf("%s\n", buf); } printf("can_be_null = %d uses_registers = %d anchor = %d\n", exp.can_be_null, exp.uses_registers, exp.anchor); printf("fastmap:"); for (a = 0; a < 256; a++) if (exp.fastmap[a]) printf(" %d", a); printf("\n"); printf("Enter strings. An empty line terminates.\n"); while (fgets(buf, sizeof(buf), stdin)) { if (buf[0] == '\n') break; a = re_search_pattern(&exp, buf, strlen(buf), 0, strlen(buf), ®s); printf("search returns %d\n", a); if (a != -1) { for (a = 0; a < RE_NREGS; a++) { printf("buf %d: %d to %d\n", a, regs.start[a], regs.end[a]); } } } } } #endif /* TEST_REGEXP */ fortunate-3.1/fortune/regexpr.h0000644000175000017500000001360305517321133017476 0ustar gurkangurkan00000000000000/* regexpr.h Author: Tatu Ylonen Copyright (c) 1991 Tatu Ylonen, Espoo, Finland Permission to use, copy, modify, distribute, and sell this software and its documentation is hereby granted without fee, provided that the above copyright notice appears in all source code copies, the name of Tatu Ylonen is not used to advertise products containing this software or a derivation thereof, and all modified versions are clearly marked as such. This software is provided "as is" without express or implied warranty. Created: Thu Sep 26 17:15:36 1991 ylo Last modified: Fri Jan 3 12:05:45 1992 ylo Small changes made by Christopher J. Kane 94/01/19 marked with "(cjk)", for the NeXT system. Changes also made to regexpr.c. - hide re_comp(), re_exec() - renamed re_match.* to re_match_pattern.* and re_search.* to re_search_pattern.* to avoid tiresome library conflicts on NeXT (re_match conflicted) - eliminated all compiler warnings */ #ifndef REGEXPR_H #define REGEXPR_H #define RE_NREGS 10 /* number of registers available */ typedef struct re_pattern_buffer { char *buffer; /* compiled pattern */ int allocated; /* allocated size of compiled pattern */ int used; /* actual length of compiled pattern */ char *fastmap; /* fastmap[ch] is true if ch can start pattern */ char *translate; /* translation to apply during compilation/matching */ char fastmap_accurate; /* true if fastmap is valid */ char can_be_null; /* true if can match empty string */ char uses_registers; /* registers are used and need to be initialized */ char anchor; /* anchor: 0=none 1=begline 2=begbuf */ } *regexp_t; typedef struct re_registers { int start[RE_NREGS]; /* start offset of region */ int end[RE_NREGS]; /* end offset of region */ } *regexp_registers_t; /* bit definitions for syntax */ #define RE_NO_BK_PARENS 1 /* no quoting for parentheses */ #define RE_NO_BK_VBAR 2 /* no quoting for vertical bar */ #define RE_BK_PLUS_QM 4 /* quoting needed for + and ? */ #define RE_TIGHT_VBAR 8 /* | binds tighter than ^ and $ */ #define RE_NEWLINE_OR 16 /* treat newline as or */ #define RE_CONTEXT_INDEP_OPS 32 /* ^$?*+ are special in all contexts */ #define RE_ANSI_HEX 64 /* ansi sequences (\n etc) and \xhh */ #define RE_NO_GNU_EXTENSIONS 128 /* no gnu extensions */ /* definitions for some common regexp styles */ #define RE_SYNTAX_AWK (RE_NO_BK_PARENS|RE_NO_BK_VBAR|RE_CONTEXT_INDEP_OPS) #define RE_SYNTAX_EGREP (RE_SYNTAX_AWK|RE_NEWLINE_OR) #define RE_SYNTAX_GREP (RE_BK_PLUS_QM|RE_NEWLINE_OR) #define RE_SYNTAX_EMACS 0 #ifdef __STDC__ int re_set_syntax(int syntax); /* This sets the syntax to use and returns the previous syntax. The syntax is specified by a bit mask of the above defined bits. */ char *re_compile_pattern(char *regex, int regex_size, regexp_t compiled); /* This compiles the regexp (given in regex and length in regex_size). This returns NULL if the regexp compiled successfully, and an error message if an error was encountered. The buffer field must be initialized to a memory area allocated by malloc (or to NULL) before use, and the allocated field must be set to its length (or 0 if buffer is NULL). Also, the translate field must be set to point to a valid translation table, or NULL if it is not used. */ int re_match_pattern(regexp_t compiled, char *string, int size, int pos, regexp_registers_t regs); /* This tries to match the regexp against the string. This returns the length of the matched portion, or -1 if the pattern could not be matched and -2 if an error (such as failure stack overflow) is encountered. */ int re_match_pattern_2(regexp_t compiled, char *string1, int size1, char *string2, int size2, int pos, regexp_registers_t regs, int mstop); /* This tries to match the regexp to the concatenation of string1 and string2. This returns the length of the matched portion, or -1 if the pattern could not be matched and -2 if an error (such as failure stack overflow) is encountered. */ int re_search_pattern(regexp_t compiled, char *string, int size, int startpos, int range, regexp_registers_t regs); /* This rearches for a substring matching the regexp. This returns the first index at which a match is found. range specifies at how many positions to try matching; positive values indicate searching forwards, and negative values indicate searching backwards. mstop specifies the offset beyond which a match must not go. This returns -1 if no match is found, and -2 if an error (such as failure stack overflow) is encountered. */ int re_search_pattern_2(regexp_t compiled, char *string1, int size1, char *string2, int size2, int startpos, int range, regexp_registers_t regs, int mstop); /* This is like re_search, but search from the concatenation of string1 and string2. */ void re_compile_fastmap(regexp_t compiled); /* This computes the fastmap for the regexp. For this to have any effect, the calling program must have initialized the fastmap field to point to an array of 256 characters. */ /* 94/01/19 (cjk) hide these on NeXT */ #if !defined(NeXT) char *re_comp(char *s); /* BSD 4.2 regex library routine re_comp. This compiles the regexp into an internal buffer. This returns NULL if the regexp was compiled successfully, and an error message if there was an error. */ int re_exec(char *s); /* BSD 4.2 regexp library routine re_exec. This returns true if the string matches the regular expression (that is, a matching part is found anywhere in the string). */ #endif /* !defined(NeXT) */ #else /* __STDC__ */ int re_set_syntax(); char *re_compile_pattern(); int re_match_pattern(); int re_match_pattern_2(); int re_search_pattern(); int re_search_pattern_2(); void re_compile_fastmap(); /* 94/01/19 (cjk) hide these on NeXT */ #if !defined(NeXT) char *re_comp(); int re_exec(); #endif /* !defined(NeXT) */ #endif /* __STDC__ */ #endif /* REGEXPR_H */ fortunate-3.1/fortune/strfile.h0000644000175000017500000000516206152464132017476 0ustar gurkangurkan00000000000000/*- * Copyright (c) 1991, 1993 * The Regents of the University of California. All rights reserved. * * This code is derived from software contributed to Berkeley by * Ken Arnold. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * This product includes software developed by the University of * California, Berkeley and its contributors. * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * @(#)strfile.h 8.1 (Berkeley) 5/31/93 */ #define STR_ENDSTRING(line,tbl) \ (((unsigned char)(line)[0]) == (tbl).str_delim && (line)[1] == '\n') typedef struct { /* information table */ #define VERSION 1 unsigned long str_version; /* version number */ unsigned long str_numstr; /* # of strings in the file */ unsigned long str_longlen; /* length of longest string */ unsigned long str_shortlen; /* length of shortest string */ #define STR_RANDOM 0x1 /* randomized pointers */ #define STR_ORDERED 0x2 /* ordered pointers */ #define STR_ROTATED 0x4 /* rot-13'd text */ unsigned long str_flags; /* bit field for flags */ unsigned char stuff[4]; /* long aligned space */ #define str_delim stuff[0] /* delimiting character */ } STRFILE; fortunate-3.1/datfiles/0000755000175000017500000000000010163270006015752 5ustar gurkangurkan00000000000000fortunate-3.1/datfiles/limerick0000644000175000017500000043157406345471565017536 0ustar gurkangurkan00000000000000A bad little girl in Madrid, A most reprehensible kid, Told her Tante Louise That her cunt smelled like cheese, And the worst of it was that it did! % A bather whose clothing was strewed By breezes that left her quite nude, Saw a man come along And, unless I am wrong, You expected this line to be lewd. % A bather whose clothing was strewed By breezes that left her quite nude, Saw a man come along And, unless I'm quite wrong, You expected this line to be lewd. % A beat schizophrenic said, "Me? I am not I, I'm a tree." But another, more sane, Shouted, "I'm a Great Dane!" And covered his pants leg with pee. % A beautiful belle of Del Norte Is reckoned disdainful and haughrty Because during the day She says: "Boys, keep away!" But she fucks in the gloaming like forty. % A beautiful lady named Psyche Is loved by a fellow named Ikey. One thing about Ike The lady can't like Is his prick, which is dreadfully spikey. % A beetling young woman named Pridgets Had a violent abhorrence of midgets; Off the end of a wharf She once pushed a dwarf Whose truncation reduced her to fidgets. -- Edward Gorey % A big-bosomed Bunny named Gression Sold cigars at a key-club concession. When she swiveled about Even strong men cried out, For her costume did not keep her flesh in. % A bobby of Nottingham Junction Whose organ had long ceased to function Deceived his good wife For the rest of her life With the aid of his constable's truncheon. % A broken-down harlot named Tupps Was heard to confess in her cups: "The height of my folly Was diddling a collie- But I got a nice price for the pups." % A broken-down harlot named Tupps Was heard to confess in her cups: "The height of my folly Was fucking a collie -- But I got a nice price for the pups." % A burleyque dancer, a pip Named Virginia, could peel in a zip; But she read science fiction And died of constriction Attempting a Moebius strip. -- Cyril Kornbluth, "The Unfortunate Topology" % A busy young lady named Gloria Was had by Sir Gerald du Maurier And then by six men, Sir Gerald again, And the band at the Waldorf-Astoria. % A cabin boy on an old clipper Grew steadily flipper and flipper. He plugged up his ass With fragments of glass And thus circumcised his old skipper. % A cautious young fellow named Lodge Had seatbelts installed in his Dodge. When his date was strapped in, He committed a sin, Without even leaving his grodge. % A cautious young fellow named Lodge, Had seatbelts installed in his Dodge. With his date all strapped in He committed a sin Without even leaving the garage. -- "A Boy and His Dog" % A cautious young fellow named Tunney Had a whang that was worth any money. When eased in half-way, The girl's sigh made him say, "Why the sigh?" "For the rest of it, honey." % A certain young man, it was noted, Went about in the heat thickly-coated; He said, "You may scoff, But I shan't take it off; Underneath I am horribly bloated." -- Edward Gorey % A certain young person of Ghent, Uncertain if lady or gent, Shows his organs at large For a small handling charge To assist him in paying the rent. % A certain young sheik of Algiers Said to his harem, "My dears, Though you may think it odd of me, I'm tired of just sodomy Let's try straight fucking." (loud cheers!) % A chap down in Oklahoma Had a cock that could sing La Paloma, But the sweetness of pitch Couldn't put off the hitch Of impotence, size and aroma. % A charmer from old Amarillo, Sick of finding strange heads on her pillow, Decided one day That to keep men away She would stuff up her crevice with Brillo. % A chippy who worked in Black Bluff Had a pussy as large as a muff. It had room for both hands And some intimate glands, And was soft as a little duck's fluff. % A clerical student named Pryne Through pain sought to reach the divine: He wore a hair shirt, Quite often ate dirt, And bathed every Friday in brine. -- Edward Gorey % A clever young man named Eugene Invented a jack-off machine. On the twenty-third stroke The fuckin' thing broke And beat both his balls to a creame. % A clever young man named Eugene Invented a jack-off machine. On the twenty-third stroke The goddam thing broke And beat both his balls to a creame. % A cocksucking steno named Beeman Remarked as she swallowed my semen : "On my minuscule salary I must watch every calorie, So I get `ahead' eating you he-men!" % A computer called Illiac4 Had a rather tough bug in its core. It chewed up its cards And spewed yards and yards Of illegible tape on the floor. % A computer, to print out a fact, Will divide, multiply, and subtract. But this output can be No more than debris, If the input was short of exact. -- Gigo % A contortionist hailing from Lynch Used to rent out his tool by the inch. A foot cost a quid -- He could and he did Stretch it to three in a pinch. % A corpulent maiden named Kroll Had a notion exceedingly droll: At a masquerade ball, Dressed in nothing at all, She backed in as a Parker House roll. % A couple was fishing near Clombe When the maid began looking quite glum, And said, "Bother the fish! I'd rather coish!" Which they did -- which was why they had come. % A cowhand way out in Seattle Had a dooflicker flat as a paddle. He said, "No, I can't fuck A lamb or a duck, But golly! it just fits the cattle." % A crusader's wife slipped from the garrison And had an affair with a Saracen. She was not oversexed, Or jealous or vexed, She just wanted to make a comparison. % A CS student named Lin Had a prick the size of a pin It was no good for girls But just great for squirrels Who squealed with delight with it in. % A cute little twerp from Samoa Had a cock of one inch and no moa. It was good for keyholes And debutantes' peeholes But not worth a damn on a whoa. % A daredevil skater named Lowe, Leaps barrels arranged in the snow, But is proudest of doing, Some incredible screwing, Since he's jumped thirteen girls in a row! % A deep-throated virgin named Netty Was sucking a cock on the jetty. She said, "It tastes nice, Much better than rice, Though not quite as good as spaghetti." % A delighted, incredulous bride Remarked to her groom at her side : "I never could quite Believe till tonight Our anatomies would coincide." % A dentist, young doctor Malone, Got a charming girl patient alone, And, in his depravity, Filled the wrong cavity. God, how his practice has grown. % A despairing old landlord named Fyfe, With a frigid and quarrelsome wife, Let his third-story front, To a willing young cunt, Who supplied him a new lease on life! % A desperate spinster from Clare Once knelt in the moonlight all bare, And prayed to her God For a romp on the sod-- 'Twas a passerby answered her prayer. % A distinguished professor from Swarthmore Got along with a sexy young sophomore. As quick as a glance He stripped off his pants, But he found that the sophomore'd got off more. % A doctoral student from Buckingham Wrote his thesis on cunts and on fucking'em. But a dropout from paree Taught him Gamahuchee - so he added a footnote on sucking 'em. % A doctoral student from Buckingham Wrote his thesis on cunts and on fucking'em. But a dropout from paree Taught him Gamahuchee So he added a footnote on sucking 'em. % A do-it-yourselfer named Alice, Used a dynamite stick for a phallus. She blew her vagina To South Carolina, And her tits landed somewhere in Dallas. A cute friend of hers, Fanny Hill, Used two dynamite sticks for a dil. They found her vagina, In South Carolina, And part of her ass in Brazil. % A dolly in Dallas named Alice, Whose overworked sex is all callous, Wore the foreskin away On uncircumcised Ray, Through exuberance, tightness, and malice. % A dreary young bank clerk named Fennis Wished to foster an aura of menace; To make people afraid He wore gloves of grey suede And white footgear intended for tennis. -- Edward Gorey % A dreary young bank clerk named Fennis Wished to foster an aura of menace. To make people afraid He wore gloves of grey suede And white footgear intended for tennis. -- Edward Gorey, "Amphigorey" % A dulcet-voiced callgirl named Shedd, Who's cultured, well-spoken, well-bred, Had achieved some reknown For her tone going down-- There's a nice civil tongue in her head. % A fair-haired young damsel named Grace Thought it very, very foolish to place Her hand on your cock When it turned hard as rock, For fear it would explode in your face. % A farmer I know named O'Doole Had a long and incredible tool. He can use it to plow, Or to diddle a cow, Or just as a cue-stick at pool. % A fellatrix's healthful condition Proved the value of spunk as nutrition. Her remarkable diet (I suggest that you try it) Was only her clients' emission. % A fellow whose surname was Hunt Trained his cock to perform a slick stunt: This versatile spout Could be turned inside out, Like a glove, and be used as a cunt. % A fisherman off of Cape Cod Said, "I'll bugger that tuna, by God!" But the high-minded fish Resented his wish, And nimbly swam off with his rod. % A foolish geologist from Kissen Just didn't know what he was missin', By studying rock And neglecting his cock, And using it merely for pissin'. % A Frenchman who lived in Alsace Had sex with a virgin named Grace. When he popped her cherry, She made things hairy By bleeding all over his face. % A frustrated lady named Alice Used a dynamite stick for a phallus. They found her vagina In North Carolina And bits of her tits were in Dallas. % A gay young prince from Morocco Made love in a manner rococco. He painted his penis To resemble a venus And flavored his semen with cocoa. % A geneticist living in Delft Scientifically played with himself, And when he was done He labled it: son, And filed him away on a shelf. % A geneticist living in Delft Scientifically played with himself, And when he was done He labled it: son, And filed him away on a shelf. A gentleman, otherwise meek, Detested with passion the leek; When offered one out He dealt such a clout To the maid, she was down for a week. -- Edward Gorey % A gentleman, otherwise meek, Detested with passion the leek; When offered one out He dealt such a clout To the maid, she was down for a week. -- Edward Gorey % A german composer named Bruckner Remarked to a lady while fuckener : "Less lento, my dear, With your cute little rear; I like a hot presto when muckener!" % A gift was delivered to Laura From a cousin who lived in Gomorrah; Wrapped in tissue and crepe, It was peeled, like a grape, And emitted a pale, greenish aura. -- Edward Gorey % A gifted young fellow from Sparta Was widely renowned as a farta'. He could fart anything From "Of Thee I Sing," To Beethoven's "Moonlight Sonata." % A girl camper once had an affair With a fellow all covered with hair. When she gave him his hat She realized that She'd been had by Smokey the Bear. % A girl of the Enterprise crew Refused every offer to screw. But a Vulcan named Spock Crawled under her smock, And now she is eating for two. % A girl of uncertain nativity Had an ass of extreme sensitivity While she sat on the lap Of a German or Jap, She could sense Fifth Column activity. % A graduate student named Zac Was said to be great in the sack. An inch of his boner Put girls in a coma And two gave them epileptic attacks. % A graduate student named Zac Was said to be great in the sack. An inch of his boner Put girls in a coma And two gave them epileptic attacks. % A greedy young lady from Sidney Liked it in up to her kidney, Till a man from Quebec Shoved it up to her neck-- He really diddled her, didn' he? % A green-thumbed young farmer from Leeds Once swallowed a package of seeds. In a month, his ass Was covered with grass And his balls were grown over with weeds. % A guest in a household quite charmless Was informed its eccentric was harmless: "If you're caught unawares At the head of the stairs, Just remember, he's eyeless and armless." -- Edward Gorey % A habit depraved and unsavory Held the bishop of Bingham in slavery Midst screeches and howls He deflowered young owls Which he kept in an underground aviary % A habit obscene and bizarre, Has taken a-hold of papa. He brings home young camels And other odd mammals, And gives them a go at mama. % A habit obscene and unsavory, Holds a CS professor in slavery. With maniacal howls, He deflowers young owls, That he keeps in an underground aviary. % A hacker who screwed a mag tape Was caught and convicted of rape. To jail he did go, From which, to his woe He couldn't get out with ESC. % A hacker-turned-pervert named Fisk Made love to the drive of his disk. The thing circumsized him, Which rather suprised him. He wasn't aware of *that* risk. % A handsome young rodent named Gratian As a lifeguard became a sensation. All the lady mice waved And screamed to be saved By his mouse-to-mouse resuscitation. % A happy old hooker named Grace Once sponsored a cunt-lapping race. It was hard for beginners To tell who were winners : There were cunt hairs all over the place. % A hardware debugger named Court Shoved his tool in an Ethernet port. But its buffer array Only handled 1K, So the port's driver cut it off short. % A haughty young wench of Del Norte Would fuck only men over forty. Said she, "It's too quick With a young fellow's prick; I like it to last, and be warty." % A headstrong young woman in Ealing Threw her two weeks' old child at the ceiling; When quizzed why she did, She replied, "To be rid Of a strange, overpowering feeling." -- Edward Gorey % A hearty young fellow named Yost Once had an affair with a ghost. At the height of the spasm The poor ectoplasm Cried, "Goodie, I feel it ... almost." % A hearty young fellow named Yost Once had an affair with a ghost. At the height of the spasm The poor ectoplasm Cried, "Goodie, I feel it... almost." % A hidebound young virgin named Carrie Would say, when the fellows got hairy : "Keep your prick in your pants Till the end of this dance--" Which is why Carrie still has her cherry. % A highly aesthetic young Jew Had eyes of a heavenly blue; The end of his dillie Was shaped like a lilly, And his balls were too utterly two! % A highway patrol buff named Claire, Once screwed half a troop on a dare, And her parts grew so hot, There was steam on her twat, So they nicknamed her Smokey the Bare! % A horny young fellow named Reg, Was jerking off under a hedge. The gardener drew near With a huge pruning shear, And trimmed off the edge of his wedge. % A huge-organed female in Dallas, Named Alice, who yearned for a phallus, Was virgo intacto, Because, ipso facto, No phallus in Dallas fit Alice. % A joker who haunts Monticello Is really a terrible fellow. In the midst of caresses He fills ladies dresses With garter snakes, ice cubes, and jello. % A lacklustre lady of Brougham Weaveth all night at her loom. Anon she doth blench When her lord and his wench Pull a chain in the neighbouring room. % A lad, at his first copulation, Cried, "What a sensation! Inflation, Gyration, elation Throughout the duration, I guess I'll give up masturbation." % A lad from far-off Transvaal Was lustful, but tactful withal. He'd say, just for luck, "Mam'selle, do you fuck?" But he'd bow till he almost would crawl. % A lad of the brainier kind Had erogenous zones in his mind. He got his sensations, By solving equations, (Of course, in the end, he went blind.) % A lady born under a curse Used to drive forth each day in a hearse; From the back she would wail Through a thickness of veil: "Things do not get better, but worse." -- Edward Gorey % A lady both callous and brash Met a man with a vast black moustache; She cried, "Shave it, O do! And I'll put it with glue On my hat as a sort of panache." -- Edward Gorey % A lady from Kalamazoo Once found she had nothing to do, So she sat on the stairs And she counted her hairs: 4,302. % A lady from Old Little Rock In fidelity took little stock, And deserted her man In the streets of Japan For a boy with a prehensile cock. % A lady removing her scanties, Heard them crackle electrical chanties. Said her beau, "Have no fear, For the reason is clear: You simply have amps in your panties. % A lady stockholder quite hetera Decided her fortune to bettera: On the floor, quite unclad, She successively had Merrill Lynch, Pierce, Fenner, et cetera... % A lady was seized with intent To revise her existence misspent. So she climbed up the dome Of St. Peter's in Rome, Where she stayed through the following Lent. -- Edward Gorey % A lady while dining at Crewe Found an elephant's whang in her stew. Said the waiter, "Don't shout, And don't wave it about, Or the others will all want one too." % A lady, while dining in Crewe, Found an elephant's whang in her stew. Said the waiter, "Don't shout Or wave it about Or the others will ask for one, too." % A lady who signs herself "Vexed" Writes to say she believes she's been hexed: "I don't mind my shins Being stuck full of pins, But I fear I am coming unsexed." -- Edward Gorey % A lady with features cherubic Was famed for her area pubic. When they asked her its size She replied in surprise, "Are you speaking of square feet, or cubic?" % A lass at the foot of her class Asked a brainier chick how to pass. She replied, "With no fuss You can get a B-plus, By letting the prof pat your ass." % A lecherous barkeep named Dale, After fucking his favorite female, Mixed Drambuie and scotch With the cream in her crotch For a lustier, Rusty-er Nail. % A licentious old justice of Salem Used to catch all the harlots and jail 'em. But instead of a fine He would stand them in line, With his common-law tool to impale 'em. % A limerick packs laughs anatomical Into space that is quite economical. But the good ones I've seen So seldom are clean, And the clean ones so seldom are comical. % A linguist thought it a farce That memory space was so sparse. One day they increased it. Said he as he seized it: "At last! Enough core for the parse". % A lonely young lad of Eton Used always to sleep with the heat on, Till he ran into a lass Who showed him her ass -- Now they sleep with only a sheet on. % A lovely young diver named Nancy, Wore a bikini bottom quite chancy, The fish of Bonaire, Watched her Derriere, And the sea fans all tickled her fancy. % A lovely young maid from St. Jude Once rode through the streets in the nude. The police cried, "Whatam-- Agnificent bottom" And slapped it as hard as they could. % A lovely young maid from St. Jude Once rode through the streets in the nude. The police cried, "Whatam-- Agnificent bottom" And slapped it as hard as they cude. % A lusty young maid from Seattle Got pleasure by sleeping with cattle; Till she found a bull Who filled her so full It made both her ovaries rattle. % A lusty young woodsman of Maine For years with no woman had lain, But he found sublimation At a high elevation In the crotch of a pine -- God, the pain! % A madam who ran a bordello Put come in her pineapple jello, For the rich, sexy taste And not wanting to waste That greasy kid stuff from a fellow. % A maestro directing in Rome Had a quaint way of driving it home. Whoever he climbed Had to keep her tail timed To the beat of his old metronome. % A maiden who lived in Virginny Had a cunt that could bark, neigh and whinny. The horsey set rushed her, But success finally crushed her For her tone soon became harsh and tinny. % A maiden who travelled in France Once got on a train, just by chance. The engineer fucked her, The conductor sucked her, And the fireman came in his pants. % A maiden who wrote of big cities Some songs full of love, fun and pities, Sold her stuff at the shop Of a musical wop Who played with her soft little titties. % A man was once heard to boast, That he received a parcel by post, It contained, so we heard, A magnificent turd, And the balls of his grandfather's ghost. % A marine being sent to Hong Kong Got a doctor to alter his dong. He sailed off with a tool Flat and thin as a rule - When he got there he found he was wrong. % A mathematician named Hall Had a hexhedronical ball, And the square of its weight Times his pecker's, plus eight, Was four-fifths of five-eighths of fuck-all. % A mathematician named Hall Has a hexahedronical ball, And the cube of its weight Times his pecker's, plus eight Is his phone number -- give him a call... % A mathematician named Klein Thought the Mobius band was divine. Said he, "If you glue The edges of two, You'll get a weird bottle like mine! % A middle-aged codger named Bruin Found his love life completely in ruin, For he flirted with flirts Wearing pants and no skirts, And he never got in for no screwin'. % A milkmaid there was, with a stutter, Who was lonely and wanted a futter. She had nowhere to turn, So she diddled a churn, And managed to come with the butter. % A mortician who practised in Fife Made love to the corpse of his wife. "How could I know, Judge? She was cold, did not budge-- Just the same as she'd acted in life." % A nasty old drunk in Carmel Thinks it funny to piss in the well. He says, "Some don't favor That unusual flavor, But I don't drink the stuff -- what the hell!" % A nervous young fellow named Fred Took a charming young widow to bed. When he'd diddled a while She remarked with a smile, "You've got it all in but the head." % A new dramatist of the absurd Has a voice that will shortly be heard. I learn from my spies He's about to devise An unprintable three-letter word. % A newlywed couple from Goshen Spent their honeymoon sailing the ocean. In twenty-eight days They got laid eighty ways -- Imagine such fucking devotion! % A newly-wed man of Peru Found himself in a terrible stew: His wife was in bed Much deader than dead, And so he had no one to screw. % A notorious whore named Ms. Hearst, In the pleasures of men was well-versed. Reads the sign o'er the head Of her well-rumpled bed "The customer always comes first." % A novice was told by the Abbot: "Consider the goat and the rabbit. While they roll in the hay You just stay home and pray. You've got to get out of that habit." % A nudist resort at Benares Took a midget in all unawares. But he made members weep For he just couldn't keep His nose out of private affairs. % A nurse motivated by spite Tied her infantine charge to a kite; She launched it with ease On the afternoon breeze, And watched till it flew out of sight. -- Edward Gorey % A pansy who lived in Khartoum Took a lesbian up to his room. They argued all night Over who had the right To do what, with which, and to whom. % A passionate red-haired girl When you kissed her, her senses would whirl, And her twat would get wet, And would wiggle and fret, And her cunt-lips would curl and unfurl. % A pathetic old maid of Bordeaux Fell in love with a dashing young beau. To arrest his regard She would squat in his yard And longingly pee in the sneaux. % A petulant man once said, "Pish, Your cunt is as big as a dish." She replied, "Why, you fool, With your limp little tool, It's like driving a pin with a fish." % A physical fellow named Fisk Could screw at a rate very brisk. So fast was his action The Fitzgerald contraction Would shrink up his rod to a disk. % A pious old woman named Tweak Had taught her vagina to speak. It was frequently liable To quote from the Bible, But when fucking -- not even a squeak! % A pious young lady named Finnegan Would caution her friend, "Well, you're in again; So time it aright, Make it last through the night, For I certainly don't want to sin again!" % A pious young lady of Chichester Made all of the saints in their niches stir And each morning at matin Her breast in pink satin Made the bishop of Chichester's breeches stir. % A playful young chemist named Byrd Had an urge that could not be deferred. So to irritate Knox He shit in his sox, And plastered the walls with his turd. % A plumber whose name was John Brink Plumbed the cook as she bent o'er the sink. Her resistance was stout, And John Brink petered out, With his pipe-wrench all limber and pink. % A potter who lived in Bombay Once fashioned a cunt out of clay; But the heat of his prick Kilned the damn thing to brick And chafed all his foreskin away. % A pretty wife living in Tours Demanded her daily amour. But the husband said, "No! It's to much. Let it go! My backsides are dragging the floor." % A pretty young boy known as Kevin Was raped in a pasture by seven Lascivious beasts (Oh, those Anglican priests) And such is the Kingdom of Heaven. % A pretty young lady named Vogel Once sat herself down on a molehill. A curious mole Nosed into her hole -- Ms. Vogel's ok, but the mole's ill. % A pretty young lady named Vogel Once sat herself down on a molehill. A curious mole Nosed into her hole -- Ms. Vogel's okay, but the mole's ill. % A pretty young lady named Vogel Once sat herself down on a molehill. A curious mole Nosed into her hole- Ms. Vogel's ok, but the mole's ill. % A pretty young lady named Vogel Once sat herself down on a molehill. A curious mole Nosed into her hole -- Ms. Vogel's okay, but the mole's ill. % A pretty young maiden from France Decided she'd "just take a chance." She let herself go For an hour or so, And now all her sisters are aunts. % A princess who lived near a bog Met a prince in the form of a frog. Now she and her prince Are the parents of quints, Four boys and one fine polliwog. % A princess who reigned in Baroda Made her home on a purple pagoda. She festooned the walls Of her halls with the balls And the tools of the fools who be-stroda'. % A programmer down in Moline Said, I'm the match for any machine. My secret's aversion, To loops and recursion, Just acres of in-line routine. -- W.J. Wilson % A progressive professor named Winners Held classes each evening for sinners. They were graded and spaced So the vile and debased Would not be held back by beginners. % A rapist who reeked of cheap booze Attempted to ravish Miss Hughes. She cried, "I suppose There's no time for my clothes, But PLEASE let me take off my shoes!" % A rapturous young fellatrix One day was at work on five pricks. With an unholy cry She whipped out her glass eye: "Tell the boys I can now take on six." % A reckless young lady of France Had no qualms about taking a chance, But she thought it was crude To get screwed in the nude, So she always went home with damp pants. % A remarkable race are the Persians; They have such peculiar diversions. They make love the whole day In the usual way And save up the nights for perversions. % A remarkable race are the Persians, They have such peculiar diversions. They screw the whole day In the regular way, And save up the nights for perversions. % A responsive young girl from the East In bed was an able artiste. She had learned two positions From family physicians, And ten more from the old parish priest. % A romantic attraction has clung To a chap of whom damsels have sung: "'Tis the Scourge from the East, That lascivious beast Who was known as Attila the Hung!" % A sailor who slept in the sun, Woke to find his fly buttons undone, He remarked with a smile, "Good grief, a sun-dial! And now it's a quarter-past one." % A savvy young hooker named Gail Got busted and lodged in the jail. But the jailer got hot, To be lodged in her twat, And so Gail made the bail with her tail. % A scandal involving an oyster Sent the Countess of Clews to a cloister She preferred it, in bed, To the count (so she said) 'Cause it's longer and stronger and moister. % A scream from the crypt of St. Giles Resounded for miles upon miles. Said the friar, "Good gracious, The brother Ignatious Forgeteth the abbot hath piles." % A seafaring hacker named Slatey Went to bed with a VAX/780. The thing's learned to swear With a nautical air, And refers to its users as "matey". % A sex-loving coed named Bree Caught the clap from her Apple IIE. The joystick, she found, Had been fooling around With a neighboring student's PC. % A silly young man from Hong Kong Had hands that were skinny and long. He ate rice with his fingers-- The taste of it lingers, But now all his fingers are gone. % A slick talking pirate named Bruce To steal code, had a plan to seduce An Apple II+. Now Bruce wears a truss And was jailed for computer abuse. % A software technician from Digital Had hardware extremely prodigical. It's rumoured, I hear, That when he was near He made the ladies all flustered and fidgital. % A space shuttle pilot named Ventry, Made love to a lovely girl sentry. She started to pout, Because it fell out, But the mission was saved by re-entry. % A sperm faced, alack and forsooth, His moment of sexual truth. He'd expected to fall On a womb's spongy wall But was dashed to his death on a tooth. % A spinster in Kalamazoo Once strolled after dark by the zoo. She was seized by the nape, And fucked by an ape, And she murmured, "A wonderful screw." And she added, "You're rough, yes, and hairy, But I hope -- yes I do -- that I marry A man with a prick Half as stiff and as thick As the kind that you zoo-keepers carry." % A spunky young schoolboy named Fred Used totoss off each night while in bed. Said his mother, "Dear lad, That's exceedingly bad-- Jump in here with your mamma instead." % A starship commander named Kirk Emerged from his cabin berserk. He grabbed a girl yeoman Beneath the abdomen, And gave her a physical jerk. % A stout Gaelic warrior, McPherson, Was having a captive, a person Who was not averse Though she had the curse, And he'd breeches of bristling furs on. % A structured programmer named Drew Was intensely turned on by "goto". When he saw it in code He'd shoot off his load. It's a good thing his shop used so few. % A studious professor named Nestor Bet a whore all his books that he could best her. But she drained out his balls And skipped up the walls, Beseeching poor Nestor to rest her. % A sweetheart named Teresa Arden Went down on her beau in the garden. He said, "Good lord, Tess, Don't swallow that mess " And she replied, "Ulp, beg your pardon?" % A sweetheart named Teresa Arden Went down on her beau in the garden. He said, "Good lord, Tess, Don't swallow that mess!" And she replied, "Ulp, beg your pardon?" % A systems programmer named Sprotic Found his software intensely erotic. In jealous distress He wiped his OS. It's possible that he's psychotic. % A talented fuckstress, Miss Chisholm, Was renowned for her fine paroxysm. While the man detumesced She still spent on with zest, Her rapture sheer anachronism. % A talented girl from Detroit Could fuck you in ways quite adroit. She could squeeze her vagina To a pin-point or finer Or open it out like a quoit. % A team playing baseball in Dallas Called te umpire blind out of malice. While this worthy had fits The team made eight hits And a girl in the bleachers named Alice. % A team playing baseball in Dallas Called the umpire blind out of malice. While this worthy had fits The team made eight hits And a girl in the bleachers named Alice. % A teenage protester named Lil Cried, "Those watergate spies make me ill First they bugged our martinis, Our bras and bikinis, And now they are bugging the pill." % A thrice-married gal from L.A. Said, "My hymen's intact to this day, 'Cause my first (a shrink) talked of it, The voyeur only gawked at it, And my most recent man's a gourmet." % A tidy young lady of Streator Dearly loved to nibble a peter. She always would say, "I prefer it this way. I think it is very much neater." % A timid young woman named Jane Found parties a terrible strain; With movements uncertain She'd hide in a curtain And make sounds like a rabbit in pain. -- Edward Gorey % A tired young trollop of Nome Was worn out from her toes to her dome. Eight miners came screwing, But she said, "Nothing doing; One of you has to go home!" % A trapper named Francois Lefebrve Once captured and buggered a beabrve. The result of this fuck Was a three titted duck, A canoe, and an Irish retriebrve. % A tutor who tooted a flute Tried to tutor two tutors to toot Said the two to the tutor: "Is it harder to toot or To tutor two tutors to toot" % A vengeful technician named Schmitz Caused a disk drive to go on the fritz. He covered the platter With bats' fecal matter. Now it's seek time is really the pits. % A very intelligent turtle Found programming UNIX a hurdle The system, you see, Ran as slow as did he, And that's not saying much for the turtle. % A very odd pair are the Pitts: His balls are as large as her tits, Her tits are as large As an invasion barge-- Neither knows how the other cohabits. % A wanton young lady from Wimley Reproached for not acting quite primly Said, "Heavens above! I know sex isn't love, But it's such an entrancing facsimile." % A water pipe suited miss Hunt; She used it for many a bunt. But the unlucky wench Got it caught in her trench --- It took twenty-two men and a big Stillson wrench, To get the thing out of her cunt. % A water pipe suited miss Hunt; She used it for many a bunt. But the unlucky wench Got it caught in her trench --- It took twenty-two men and a big Stillson wrench, To get the thing out of her cunt. % A weary old lecher named Blott Took a luscious young blond to his yacht. Too lazy to rape her, He made darts out of paper, Which he leisurely tossed at her twat. % A whimsical fellow named Bloch Could beat the base drum with his cock. With a special erection He could play a selection From Johann Sebastian Bach. % A wicked stone cutter named Cary Drilled holes in divine statuary. With eyes full of malice He pulled out his phallus, And buggered a stone Virgin Mary. % A wide-bottomed girl named Trasket Had a hole as big as a basket. A spot, as a bride, In it now, you could hide, And include with your luggage your mascot. % A widow whose singular vice Was to keep her late husband on ice Said, "It's been hard since I lost him -- I'll never defrost him! Cold comfort, but cheap at the price." % A wonderful bird is the pelican. His mouth can hold more than his belican. He can take in his beak Enough food for a week. And I'm darned if I know how the helican. % A wonderful bird is the pelican. His mouth can hold more than his belican. He can take in his beak Enough food for a week. I'm darned if I know how the helican. % A wonderful tribe are the Sweenies, Renowned for the length of their peenies. The hair on their balls Sweeps the floors of their halls, But they don't look at women, the meanies. % A wood-fetish busboy named Gable Is rapid, is thorough, is able; But when everything's cleared, He gives way to the weird, As he lovingly busses each table. % A worn-out young husband named Lehr Her daily his wife's plaintive prayer: "Slip on a sheath, quick, Then slip your big dick Between these lips covered with hair." % A worried young man from Stamboul Discovered red spots on his tool. Said the doctor, a cynic, "Get out of my clinic Just wipe off the lipstick, you fool." % A worried young man from Stamboul Founds lots of red spots on his tool. Said the doctor, a cynic, "Get out of my clinic; Just wipe off the lipstick, you fool!" % A young bride and groom of Australia Remarked as they joined genitalia : "Though the system seems odd, We are thankful that God Developed the genus Mammalia." % A young fellow discovered through Freud That although of penis devoid, He could practice coitus By eating a foetus, And his parents were quite overjoyed. % A young Juliet of St. Louis On a balcony stood acting screwy. Her Romeo climbed, But he wasn't well timed, And half-way up, off he went -- blooey! % A young lad named Lester McGraw Caught a stranger on top of his Maw. As he watched him stick her He said, with a snicker, "You do it much faster than Paw." % A young lady sat by the sea, Just as proper as proper could be. A young fellow goosed her, And roughly seduced her, So she thanked him and went home to tea. % A young lady who lived by the Usk Subsisted each day on a rusk; She ate the first bite Before it was light, And the last crumb sometime after dusk. -- Edward Gorey % A young lass got married at Chester; Her mother she kissed and she blessed her. Said she, "You're in luck -- 'E's a stunning good fuck, For I've 'ad 'im meself down in Leicester." % A young maiden from France was no prude, She decided to dive in the nude, But her buddy, behind, Went out of his mind, When he noticed where she was tatooed. % A young man by a girl was desired To give her the thrills she required, But he died of old age Ere his cock could assuage The volcanic desire it inspired. % A young man from the banks of the Po Found his cock had elongated so, That when he'd pee It was never he But only his neighbors who'd know. % A young man grew increasingly peaky In a house where the hinges were squeaky, The ferns curled up brown, The ceilings flaked down, And all of the faucets were leaky. -- Edward Gorey % A young man maintained that his trigger Was so big that there weren't any bigger. But this long and thick pud Was so heavy it could Scarcely lift up its head. It lacked vigor. % A young man of acumen and daring, Who'd amassed a great fortune in herring, Was left quite alone When it soon became known That their use at his board was unsparing. -- Edward Gorey % A young man of Llanfairpwllgwyngyll While bent over plucking a dingle Had the whole of Eisteddfod Taking turns at his pod While they sang some impossible jingle. % A young man with passions quite gingery Tore a hole in his sister's best lingerie. He slapped her behind And made up his mind To add incest to insult and injury. % A young polo-player of Berkeley Made love to his sweetheart beserkly. In the midst of each chukker He would break off and fuck her Horizontally, laterally and verkeley. % A young systems programmer of Sprotic Found his software intensely erotic. In jealous distress He wiped his OS. It's possible that he's a psychotic. % A young violinist from Rio Was seducing a woman named Cleo. As she took down her panties She said, "No andantes; I want this allegro con brio!" % A young wife in the outskirts of Reims Preferred frigging to going to mass. Said her husband, "Take Jacques, Or any young cock, For I cannot live up to your ass." % A young woman got married at Chester, Her mother she kissed her and blessed her. Says she, "You're in luck, He's a stunning good fuck, For I've had him myself down in Leicester." % According to experts, the oyster In its shell - a crustacean cloister - May frequently be Either he or a she Or both, if it should be its choice ter. % Alas for the Countess d'Isere, Whose muff wasn't furnished with hair. Said the Count, "Quelle surprise!" When he parted her thighs; "Magnifique! Pourtant pas de la guerre." % All the female apes ran from King Kong For his dong was unspeakably long. But a friendly giraffe Quaffed his yard and a half, And ecstatically burst into song. % An aesthete from South Carolina Had a cock that tickled like China, But while shooting his load It cracked like old Spode, So he's bought him a Steuben vagina. % An agreeable girl named Miss Doves Likes to jack off the young men she loves. She will use her bare fist If the fellows insist But she really prefers to wear gloves. % An AI researcher named Bluth Wrote, to find out the sexual truth, Eroticon VI, Which he taught certain tricks Which I'm sure can't be found in Knuth. % An amazon giantess named Dunne Let a midget screw her for fun. But the poor little runt Was engulfed in her cunt And re-born as the twin of his son. % An ambitious lady named Harriet Once dreamed she was raped in a chariot By seventeen sailors A monk and three tailors, Mohammed and Judas Iscariot. % An anonymous woman we knew Was dozing one day in her pew; When the preacher yelled "Sin!" She said, "Count me in As soon as the service is through." % An architect fellow named Yoric Could, when feeling euphoric, Display for selection Three kinds of erection- Corinthian, ionic, and doric. % An architect fellow named Yoric Could, when feeling euphoric, Display for selection Three kinds of erection- Corinthian,ionic,and doric. % An ardent young man named Magruder Once wooed a girl nude in Bermuda. She thought it quite lewd To be wooed in the nude, But magruder was shrewder, he screwed her. % An Argentine gaucho named Bruno Who said, "Fucking is one thing I do know. Women are fine And sheep are divine But llamas are numero uno." % An ARPAnaut name of Corvette Had a fetish involving the net. As he fondled his IMP His cock went from limp To as hard as concrete which has set. % An arrogant wench from Salt Lake Liked to tease all the boys on the make. She was finally the prize Of a man twice her size And all she recalls is the ache. % An artist who lived in Australia Once painted his ass like a Dahlia. The drawing was fine, The colour - devine, The scent - ah, that was a failia. % An artist who lived in Australia Once painted his ass like a Dahlia. The drawing was fine, The colour - divine, The scent - ah, that was a failia. % An eager young hacker named Gus Once buggered a VAX Unibus. The hardware went bad, But not the young lad (Except for the toupee and truss). % An eager young hacker named Gus Once buggered a VAX Unibus. The hardware went bad, But not the young lad He didn't expect all that fuss! % An Edwardian father named Udgeon, Whose offspring provoked him to dudgeon, Used on Saturday nights To turn down the lights, And chase them around with a bludgeon. -- Edward Gorey % An envious girl named McMeanus Was jealous of her lover's big penis. It was small consolation That the rest of the nation Of women were with her in weeness. % An exotic young lady named Suki Once danced in a troupe of kabuki When asked for a fuck She said, "Solly, no luck-- See here: looky looky, no nuki " % An impish young fellow named James Had a passion for idiot games. He lighted the hair Of his lady's affair And laughed as she pissed through the flames. % An impotent Scot named MacDougall Had to husband his sperm and be frugal. He was gathering semen To gender a he-man, By screwing his wife through a bugle. % An incautious young woman named Venn Was seen with the wrong sort of men; She vanished one day, But the following May Her legs were retrieved from a fen. -- Edward Gorey % An indefatigable woman named Bavel Had often occasion to travel; On the way she would sit And furiously knit, And on the way back she'd unravel. -- Edward Gorey % An ingenious young man in South Bend Made a synthetic ass for a friend, But the friend shortly found Its construction unsound, It was simply a bother -- no end. % An innocent maiden named Herridge Was cruelly tricked ito marriage; When she later found out What her spouse was about, She threw herself under a carriage. -- Edward Gorey % An inquisitive virgin named Dora Asked the man who started to bore 'er : "Do you mean birds and bees Go through antics like these, To suppy us our fauna and flora?" % An irate young lady named Booker Told her husband, "You beast, I'm no hooker! If you want it queer ways, Go to whores for your lays!" So he packed up his tool and forsook 'er. % An octagenerian Jew To his wife remained steadfastly true. This was not from compunction, But due to dysfunction Of his spermatic glands -- nuts to you. % An old couple just at Shrovetide Were having a piece -- when he died. The wife for a week Sat tight on his peak, And bounced up and down as she cried. % An old electronic designer Had designs on a minor named Dinah. He couldn't carry them out For his prick was too stout, And too small was the minor's vagina. % An old gentleman's crotchets and quibblings Were a terrible trial to his siblings, But he was not removed Till one day it was proved That the bell-ropes were damp with his dribblings. -- Edward Gorey % An old maid who had a pet ape Lived in fear of perpetual rape. His red, hairy phallus So filled her with malice That she sealed up her snatch with Scotch tape. % An old man at the Folies Bergere Had a jock, a most wondrous affair: It snipped off a twat-curl From each new chorus girl, And he had a wig made of the hair. % An organist playing in York Had a prick that could hold a small fork, And between obbligatos He'd munch at tomatoes, To keep up his strength while at work. % An orgasmic young sex star named Sue Was a hit as she writhed to a screw. Her climatic fame spread With an ad blitz that said: Coming soon at a theater near you! % An uptight young lady named Breerley Who valued her morals too dearly Had sex, so I hear, Only once every year, And she strained her vagina severely. % And earnest young woman in Thrace Said, "Darling, that's not the right place!" So he gave her a thwack, And did on her back, What he couldn't have done face to face. % And then there's the story that's fraught With disaster -- of balls that got caught, When a chap took a crap In the woods, and a trap Underneath... Oh, I can't bear the thought! % As for weirdness, the guy who's the tops Is a kinky old butcher named Pops. Since he thinks it's effete To be beating his meat, What he's into is licking his chops. % As he came in his chubby choirboy, Father Burke said, "There's no greater joy! If no sodomy levens And possible heavens, Existence will merely annoy." % As the breeches-buoy swing towards the rocks, Its occupant cried, "Save my socks! I could not bear the loss, For with scarlet silk floss My mama has embroidered their clocks." -- Edward Gorey % As tourists inspected the apse An ominous series of raps Came from under the altar, Which caused some to falter And others to shriek and collapse. -- Edward Gorey % Asked a supplicant priest of the pontiff, "Do I sin if I do what I want, if I screw a young nun In the eastertide sun?" His holiness murmured, "Gut yontiff." % At a contest for farting in Butte One lady's exertion was cute : It won the diploma For fetid aroma, And three judges were felled by the brute. % At a dance, a girl from Connecticut Showed an absolute absence of etiquette Letting all comers press Through the skirt of her dress And wiping the mess with her petticoat. % At the end of all civilization Is the planet Terminus's location. There's a girl there whose feat, Without stone or concrete, Nonetheless, was to lay the Foundation. % At the moment Japan declared war A sailor was fucking a whore. He said, "After this poke `Long and hard' ain't no joke; This means months 'til I get back ashore." % At the Villa Nemetia the sleepers Are disturbed by a phantom in weepers; It beats all night long A dirge on a gong As it staggers about in the creepers. -- Edward Gorey % At Vassar, sex isn't injurious, Though of love we are never penurious. Thanks to vulcanized aids, Though we may die old maids, At least we shall never die curious. % At whist drives and strawberry teas Fan would giggle and show off her knees; But when she was alone She'd drink eau de cologne, And weep from a sense of unease. -- Edward Gorey % Augustus, for slpashing his soup, Was put for the night on the stoop; In the morning he'd not Repented a jot, And next day he was dead of the croup. -- Edward Gorey % Augustus, for splashing his soup, Was put for the night on the stoop; In the morning he'd not Repented a jot, And next day he was dead of the croup. -- Edward Gorey % Back in the days of old Adam The grass served as mattress for madam, And they spent the whole day On the sex that today They would bounce on box springs, if they had 'em. % Each Friday his engines abort, But Scotty is never caught short. He fills his machines With space-navy beans, And farts the ship back into port. % Each night Father fills me with dread When he sits on the foot of my bed; I'd not mind that he speaks In gibbers and squeaks, But for the seventeen years he's been dead. -- Edward Gorey % Each night Father fills me with dread When he sits on the foot ofmy bed; I'd not mind that he speaks In gibbers and squeaks, But for the seventeen years he's been dead. -- Edward Gorey % From deep in the crypt at St. Giles Came a bellow that echoed for miles. Said the rector, "My gracious, Has Father Ignatius Forgotten the Bishop has piles!?" % From Number Nine, Penwiper Mews, There is really abominable news; They've discovered a head In the box for the bread, But nobody seems to know whose. -- Edward Gorey % From the bathing machine came a din As of jollification within; It was heard far and wide, And the incoming tide Had a definite flavour of gin. -- Edward Gorey % "Fucked by the finger of Fate!" Bewailed a young fellow named Tate. "Since dating Miss Baugh, My whole tongue has been raw-- It must have been something I ate." % In the case of a lady named Frost, Whose cunt's a good two feet acrost, It's the best part of valor To bugger the gal, or You're apt to fall in and get lost. % In the Garden of Eden lay Adam, Complacently stroking his madam, And loud was his mirth For on all of the earth There were only two balls -- and he had 'em. % In the garden of Eden lay Adam, Complacently stroking his madam And loud was his mirth For on all of the earth There were only two balls and he had'em. % In the little French town of Le'Beau, Lived a maiden exceedingly droll. At a masquerade ball, Clad in nothing at all, She backed in as a Parker house roll. % It always delights me at Hank's To walk up the old river banks. One time in the grass I stepped on an ass, And heard a young girl murmur, "Thanks." % It had snowed, and the man in the drift, Flagged her down and asked, "Give me a lift?" They sat in her Bentley, She fondled him gently, And the lift that he'd asked for was swift! % The late Brigham Young was no neuter -- No faggot, no fairy, no fruiter. Where ten thousand virgins Succumbed to his urgin's There now stands the great State of Utah. % The latest reports from Good Hope State that apes there have pricks thick as rope, And fuck high, wide, and free, From the top of one tree To the top of the next -- what a scope! % The limerick, a verse form iniquitous, Has nonetheless been ubiquitous. Once Congress in session, Declared its suppression, But people got around that by writing the last line with no rhyme or meter. % The limerick is furtive and mean; You must keep her in close quarantine, Or she sneaks to the slums And promptly becomes Disorderly, drunk, and obscene. -- Morris Bishop % The limerick is furtive and mean; You must keep her in close quarantine, Or she sneaks to the slums And promptly becomes Disorderly, drunk, and obscene. -- Morris Bishop % The old archeologist, Throstle, Discovered a marvelous fossil. He knew from its bend And the knot on the end, T'was the penis of Paul the Apostle. % There a young man from the Coast Who had an affair with a ghost. At the height of orgasm Said the pallid phantasm, "I think I can feel it -- almost!" % There once was a bishop from Birmingham Who deflowered young girls while confirming 'em. As they knelt on the hassock He lifted his cassock And slipped his episcopal worm in 'em. % There once was a boy named Carruthers Who was busily fucking his mother "I know it's a sin," He said, shoving it in, "But it's better than blowing my brother." % There once was a chick named Longet, Who went out to Aspen to play. Along came a Spyder, Who sat down beside her And she blew the poor bastard away. % There once was a clergyman's daughter Who detested the pony he bought her, Till she found that its dong Was as hard and as long As the prayers her father had taught her. She married a fellow named Tony Who soon found her fucking the pony. Said he, "What's it got, My dear, that I've not?" Sighed she, "Just a yard-long bologna." % There once was a couple named Kelley, Who lived their life belly to belly. Because in their haste They used library paste, Instead of petroleum jelly. % There once was a couple named Kelly Who walked around belly-to-belly. It seems in their haste, They used Carter's paste Instead of petroleum jelly. % There once was a dentist named Stone Who saw all his patients alone. In a fit of depravity He filled the wrong cavity, And my, how his practice has grown! % There once was a Duchess of Beever Who slept with her golden retriever. Said the potted old Duke : "Such tricks make me puke! Were it not for her money, I'd leave her." % There once was a Duchess of Bruges Whose cunt was incredibly huge. Said the king to this dame As he thunderously came: "Mon Dieu! Apres moi, le deluge!" % There once was a fag of Khartoom Who spent the night in a Lesbians room. They argued all night, Over who had the right, To do what, and with which, and to whom. % There once was a fairy named Avers Who encircled his cock with lifesavers. Though buggers all claimed That their asses were maimed, Sixy-niners all cheered the new flavors. % There once was a fellow named Bob Who in sexual ways was a snob. One day he was swimmin' With twelve naked women And deserted them all for a gob. % There once was a fellow named Brewster Who said to his wife, as he goosed her, "It used to be grand But look at my hand You're not wiping as clean as ya uster." % There once was a fellow named Howard, Whose tool it was nuclear-powered, While grabbing some ass, He reached critical mass, But think of the girl he deflowered! % There once was a fellow named Potts Who was prone to having the trots But his humble abode Was without a commode So his carpet was covered with spots. % There once was a fellow named Siegel Who attempted to bugger a beagle, But the mettlesome bitch Turned and said with a twitch, "It's fun, but you know it's illegal." % There once was a fellow named Sweeney Who spilled gin all over his weenie. Not being uncouth, He added vermouth And slipped his amour a martini. % There once was a fencer named Fisk, Whose speed was incredibly brisk. So fast was his action, The Fitzgerald contraction, Foreshortended his foil to a disk. % There once was a fiesty young terrier Who liked to bite girls on the derriere. He'd yip and he'd yap, Then leap up and snap; And the fairer the derriere the merrier. % There once was a floozie named Annie Whose prices were cosy--but cannie: A buck for a fuck, Fifty cents for a suck, And a dime for a feel of her fanny. % There once was a freshman named Lin, Whose tool was as thin as a pin, A virgin named Joan From a bible belt home, Said "This won't be much of a sin." % There once was a gangster named Brown - the sneakiest bastard in town. He was caught by G-men Shooting his semen Where the cops would slip and fall down. % There once was a gaucho named Bruno, Who said, "About sex, well, I do know, Sheep are just fine, Chickens, divine, But iguanas are Numero Uno." % There once was a gay young Parisian Who screwed an appendix incision, And the girl of his choice Could hardly rejoice At the horrible lack of precision. % There once was a girl from Cornell Whose teats were shaped like a bell. When you touched them they shrunk, Except when she was drunk, And then they got bigger than hell. % There once was a girl from Decatur, Who got laid by a big alligator. Now nobody knew The result of that screw, 'Cause after he laid her, he ate her. % There once was a girl from Madras Who had such a beautiful ass - It was not round and pink ( as you bastards think ) But had two ears, a tail, and ate grass. % There once was a girl from Madras Who had such a beautiful ass - It was not round and pink (As you bastards think) But had two ears, a tail, and ate grass. % There once was a girl from Spokane, Went to bed with a one-legged man. She said, "I know you-- You've really got two! Why didn't you say so when we began?" % There once was a girl named Irene Who lived on distilled kerosene But she started absorbin' A new hydrocarbon And since then has never benzene. % There once was a girl named Louise Who cunt hair hung down to her knees The crabs in her twat Tied the hairs in a knot And constructed a flying trapeze % There once was a girl named Mcgoffin Who was diddled amazingly often. She was rogered by scores Who'd been turned down by whores, And was finally screwed in her coffin. % There once was a girl named Priscilla Whose vagina was flavored vanilla. The taste was so fine Man and beast stood in line (Including a stud armadilla). % There once was a girl so lovely, Who wanted to make love in the bubbly, She strapped on her tanks, And started her pranks, But the lobsters all thought she was ugly. % There once was a golfer named Leer, Who got put in the clink for a year, For an action obscene, On the very first green. Where the sign said "Enter course here." % There once was a gouty old colonel Who grew glum when the weather grew vernal, And he cried in his tiffin For his prick wouldn't stiffen, And the size of the thing was infernal. % There once was a guardsman from Buckingham Who said, "As for girls, I hate fucking 'em. But when I meet boys, God! how I enjoys Just licking their peckers and sucking 'em." % There once was a hacker named Ken Who inherited truckloads of Yen. So he built him some chicks, Of silicon chips, And hasn't been heard from since then. % There once was a handsome young seaman Who with ladies was really a demon. In peace or in war, At sea or on shore, He could certainly dish out the semen. % There once was a horny old bitch With a motorized self-frigger which She would use with delight All day long and all night - Twenty bucks: Abercrombie & Fitch. % There once was a horse named Lily Whose dingus was really a dilly. It was vaginoid duply, And labial quadruply -- In fact, he was really a filly. % There once was a husky young Viking Whose sexual prowess was striking. Every time he got hot He would scour the twat Of some girl that might be to his liking. % There once was a jolly old bloke Who picked up a girl for a poke. He took down her pants, Fucked her into a trance, And then shit into her shoe for a joke. % There once was a kiddie named Carr Caught a man on top of his mar. As he saw him stick 'er, He said with a snicker, "You do it much faster than par." % There once was a lady from Exeter, So pretty that men craned their necks at her. One was even so brave As to take out and wave The distinguishing mark of his sex at her. % There once was a lady from Kansas Whose cunt was as big as Bonanzas. It was nine inches deep And the sides were quite steep -- It had whiskers like General Carranza's. % There once was a lady named Carter, Fell in love with a virile young Tartar. She stripped off his pants, At his prick quickly glanced, And cried: "For that I'll be a martyr!" % There once was a lady named Clair, Who posessed a magnificent pair. Or that's what I thought, Till I saw one get caught, On a thorn and begin losing air. % There once was a lady named Myrtle Who had an affair with a turtle. She had crabs, so they say, In a year and a day Which proved that that turtle was fertile. % There once was a lawyer named Rex With minuscule organs of sex. Arraigned for exposure, He maintained with composure, "De minimis non curat lex." [Trans: the law does not concern itself with small things. Ed.] % There once was a lifeguard named Lee Who rescued a girl from the sea She asked how to pay, And he said "Try this way, Go down for the third time on me." % There once was a maid from Mobile Whose cunt was made of blue steel. She only got thrills From pneumatic drills And an off-centered emery wheel. % There once was a man from Bombay He would do it all night and all day He soon became sore You shoulda' heard him roar When his wife rubbed his balls with Ben-Gay! % There once was a man from Calcutta Who used to beat off in the gutta The heat of the sun Affected his gun And turned all his cream into butta! % There once was a man from Dunoon, Who always ate soup with a fork. He said "When I eat Either fish, foul or flesh, I otherwise finish too quick." % There once was a man from Exameter Who had a prodigious diameter But it wasn't the size That brought forth the cries 'Twas his rythm, iambic pentameter. % There once was a man from Madras, Whose balls were made out of brass. When they clanged together, They played "Stormy Weather", And lightning shot out of his ass. % There once was a man from Nantee Who buggered an ape in a tree. The results were most horrid All ass and no forehead Three balls and a purple goatee. % There once was a man from Nantucket Who kept all his cash in a bucket. His daughter, named Nan, Ran away with a man, And as for the bucket, Nantucket. The pair of them went to Manhasset, (Nan and the man with the asset.) Pa followed them there, But they left in a tear, And as for the asset, Manhasset. Pa followed the pair to Pawtucket, (Nan and the man with the bucket.) Pa said to the man, "You're welcome to Nan." But as for the bucket, Pawtucket. % There once was a man from Nantucket, Whose cock was so long he could suck it. He said with a grin, As he wiped off his chin, If my ear were a cunt I could fuck it! % There once was a man from Nantucket Whose dick was so long he could suck it. He said with a grin As he wiped off his chin, "If my ear was a cunt, I could fuck it." % There once was a man from Racine, Who invented a screwing machine. Both concave and convex, It could please either sex, But, oh, what a bastard to clean! % There once was a man from Sandem Who was making his girl on a tandem. At the peak of the make She jammed on the brake And scattered his semen at random. % There once was a man from Sydney Who could put it up to her kidney. But the man from Quebec Put it up to her neck; He had a big one, now didn't he? % There once was a man named Lodge, who had seatbelts installed in his Dodge. When his date was strapped in, He committed a sin, without ever leaving the garage. % There once was a man named McGruder, Who canoed with a girl in Bermuder. But the girl thought it crude, To be wooed in the nude, So McGru took an oar and subduder. % There once was a man named McSweeny Who spilled lots of gin on his weeney So just to be couth He added vermouth And slipped his best girl a martini. % There once was a man named McSweeny Who spilled some raw gin on his weeny. Just to be couth, He added vermouth, And slipped his girlfriend a martini. % There once was a man named Parridge With peculiar views on marriage. He sucked off his brother, Fucked his own mother, And gobbled his sister's miscarriage. % There once was a man with a hernia Who said to his doctor, "Gol dern ya, When you work on my middle Be sure you don't fiddle With things that do not concern ya." % There once was a member of Mensa Who was a most excellent fencer. The sword that he used Was his -- (line is refused, And has now been removed by the censor). % There once was a miner named Dave, Who kept a dead whore in his cave. She was ugly as shit, And missing one tit, But think of the money he saves. % There once was a monk of Camyre Who was seized with a carnal desire And the primary cause Was the abbess's drawers Which were hung up to dry by the fire. % There once was a newspaper vendor, A person of dubious gender. He would charge one-and-two For permission to view His remarkable double pudenda. % There once was a plumber from Leigh Who was plumbing his maid by the sea. Said she, "Please stop plumbing, I think someone's coming!" Said he, "Yes, I know love, it's me." % There once was a pretty young Mrs. Whose tearful but short story thrs. Her mind lost its grasp - Now she thinks she's an asp And just sits in the corner and hrs. % There once was a queen of Bulgaria Whose bush had grown hairier and hairier, Till a prince from Peru Who came up for a screw Had to hunt for her cunt with a terrier. % There once was a reverend at Kings Whose mind 'twas on heavenly things. But his heart was on fire For a boy in the choir Whose buns were like jelly on springs. % There once was a sad Maitre d'hotel Who said, "They can all go to hell! What they do to my wife -- Why it ruins my life; And the worst is they all do it well." % There once was a sailor named Gasted, A swell guy, as long as he lasted, He could jerk himself off In a basket, aloft, Or a breeches-buoy swung from the masthead. % There once was a Scot named McAmeter With a tool of prodigious diameter. It was not the size That cause such surprise; 'Twas his rhythm -- iambic pentameter. % There once was a son-of-a-bitch, Neither clever, nor handsome, nor rich, Yet the girls he would dazzle, And fuck to a frazzle, And then ditch them, the son-of-a-bitch! % There once was a spaceman named Spock Who had a huge Vulcanized cock. A girl from Missouri Whose name was Uhura Just fainted away from the shock. % There once was a Swede in Minneapolis, Discovered his sex life was hapless: The more he would screw The more he'd want to, And he feared he would soon be quite sapless. % There once was a Usenetter named Mark, Whose gender was kept in the dark. He/she/it said with a nod, "My ancestors were odd!" Did Noah need two for the ark? % There once was a whore from Regina Who had a stupendous vagina. To save herself time, She had six at a time, And another one working behind her. % There once was a woman from Arden Who sucked off a man in a garden. He said, "My dear Flo, Where does all that stuff go?" And she said, "[Swallow hard] I beg pardon?" % There once was a yokel of Beaconsfield Engaged to look after the deacon's field, But he lurked in the ditches And diddled the bitches Who happened to cross that antique 'un's field. % There once was a young fellow named Blaine, And he screwed some disgusting old jane. She was ugly and smelly, With an awful pot-belly, But... well, they were caught in the rain. % There once was a young girl from Natches Who chanced to be born with two snatches She often said, "Shit! I'd give either tit For a guy with equipment that matches." % There once was a young man from Boston Who drove around town in an Austin, There was room for his ass, And a gallon of gas, So he hung out his balls and he lost 'em. % There once was a young man from France Who waited ten years for his chance; Then he muffed it... % There once was a young man from Yuma Who attempted sex with a puma He gave up real quick Minus nose, toes, and prick In obvious pain and ill huma. % There once was a young man from Yuma, Who told an elephant joke to a puma. Now his dry bleached bones lie, Under hot Asian skies, 'Cause the puma had no sense of huma. % There once was a young man named Clyde Who fell in an outhouse, and died. He had a twin brother Who fell in another And now they're interred side by side. % There once was a young man named Gene, Who invented a screwing machine. Concave and convex, It served either sex, And it played with itself inbetween. % There once was a young man named Lancelot Whom the townsfolk would look at askance a lot For when he should pass A desirable lass The front of his pants would advance a lot. % There once was an Arpanet freak, Who better response-time did seek. He searched coast to coast, For a reliable host, Whose logger took less than a week. % There once was an old man from Esser, Who's knowledge grew lesser and lesser. It at last grew so small, He knew nothing at all, And now he's a College Professor. % There once were two brothers named Luntz Who buggered each other at once. When asked to account For this intricate mount, They said, "Ass-holes are tighter than cunts." % There once were two women from Birmingham. And this is the story concerning 'em. They lifted the frock And fondled the cock Of the bishop as he was confirming 'em. % There was a bluestocking in Florence Wrote anti-sex pamphlets in torrents, Till a Spanish grandee, Got her off with his knee, And she burned all her works with abhorrence. % There was a family named Doe, An ideal family to know. As father screwed mother, She said, "You're heavier than brother." And he said, "Yes, Sis told me so!" % There was a fat lady of China Who'd a really enormous vagina, And when she was dead They painted it red, And used it for docking a liner. % There was a fat man from Rangoon Whose prick was much like a ballon. He tried hard to ride her And when finally inside her She thought she was pregnant too soon. % There was a gay countess of Bray, And you may think it odd when I say, That in spite of high station, Rank and education, She always spelled cunt with a 'k'. % There was a gay countess of Bray, And you may think it odd when I say, That in spite of high station, Rank and education, She always spelled cunt with a 'k'. % There was a gay dog from Ontario Who fancied himself a Lothario. At a wench's glance He'd snatch off his pants And make for her Mons Venerio. % There was a gay parson of Norton Whose prick, although thick, was a short 'un. To make up for this loss, He had balls like a horse, And never spent less than a quartern. % There was a gay parson of Tooting Whose roe he was frequently shooting, Till he married a lass With a face like my arse, And a cunt you could put a top-boot in. % There was a girl from Aberystwyth Who brought grain to the mill to get grist with. The miller's son Jack Laid her flat on her back And united the organs they pissed with. % There was a lewd fellow named Duff Who loved to dive deep in the muff. With his head in a whirl He said, "Spread it, Pearl; I cunt get enough of the stuff!" % There was a man from Mich. Who used to wish and wich. That spring would come So he could bum Around and go out fich. % There was a pianist named Liszt Who played with one hand while he pissed, But as he grew older His technique grew bolder, And in concert jacked off with his fist. % There was a poor parson from Goring, Who made a small hole in his flooring, Fur-lined it all round, Then laid on the ground, And declared it was cheaper than whoring. % There was a strong man of Drumrig Who one day did seven times frig. He buggered three sailors, Four dogs and two tailors, And ended by fucking a pig. % There was a teenager named Donna Who never said, "No, I don't wanna." Two days out of three She would shoot LSD, And on weekends she smoked marijuana. % There was a young belle of old Natchez Whose garments were always in patchez. When comment arose On the state of her clothes She, drawled, "When ah itchez, ah scratchez." % There was a young blade from South Greece Whose bush did so greatly increase That before he could shack He must hunt needle in stack. 'Twas as bad as being obese. % There was a young bride, a Canuck, Told her husband, "Let's do more than suck. You say that I, maybe, Can have my first baby-- Let's give up this Frenchin' and fuck!" % There was a young bride of Antigua Whose husband said, "Dear me, how big you are!" Said the girl, "What damn'd rot! Why, you've only felt my twot, My legs and my arse and my figua!" % There was a young chap in Arabia Who courted a widow named Fabia. "Yes, my tongue is as long As the average man's dong," He said, licking the lips of her labia. % There was a young cook with the art Of making a delicious tart With a handful of shit, Some snot and some spit, And he'd flavor the whole with a fart. % There was a young curate whose brain Was deranged from the use of cocaine; He lured a small child To a copse dark and wild, Where he beat it to death with his cane. -- Edward Gorey % There was a young damsel named Baker Who was poked in a pew by a Quaker. He yelled, "My God! what Do you call this -- a twat? Why, the entrance is more than an acre!" % There was a young dolly named Molly Who thought that to frig was a folly. Said she, "Your pee-pee Means nothing to me, But I'll do it just to be jolly." % There was a young fellow called Clyde Who fell in an outhouse and died. He had a twin brother Who fell in another So now they're interred side by side. % There was a young fellow from Cal., In bed with a passionate gal. He leapt from the bed, To the toilet he sped; Said the gal, "What about me, old pal?" % There was a young fellow from Florida Who liked a friend's wife, so he borrowed her. When they got into bed He cried, "God strike me dead! This ain't a cunt -- it's a corridor!" % There was a young fellow from Kent Whose cock was so long that it bent To save himself trouble He put it in double And instead of coming, he went. % There was a young fellow from Leeds Who swallowed a package of seeds. Great tufts of grass Sprouted out of his ass And his balls were all covered with weeds. % There was a young fellow from Parma Who was solemnly screwing his charmer. Said the damsel demure, "You'll excuse me, I'm sure, But I must say you fuck like a farmer." % There was a young fellow name Tucker Who, instructing a novice cock-sucker, Said, "Don't bow out your lips Like an elephant's hips, The boys like it best when they pucker." % There was a young fellow named Ades Whose favorite fruit was young maids. But sheep, nigger boys, whores, And the knot holes in doors Were by no means exempt from his raids. % There was a young fellow named Babbitt Who could screw nine times like a rabbit, But a girl from Johore Could do it twice more, Which was just enough extra to crab it. % There was a young fellow named Bill, Who took an atomic pill, His navel corroded, His asshole exploded, And they found his nuts in Brazil. % There was a young fellow named Blaine, And he screwed some disgusting old jane. She was ugly and smelly With an awful pot-belly, But... well, they were caught in the rain. % There was a young fellow named Bliss Whose sex life was strangely amiss, For even with Venus His recalcitrant penis Would never do better than t h i s . % There was a young fellow named Bowen Whose pecker kept growin' and growin'. It grew so tremendous, So long and so pendulous, 'Twas no good for fuckin' -- just showin'. % There was a young fellow named Brewer Whose girl made her home in a sewer. Thus he, the poor soul, Could get into her hole, And still not be able to screw her! % There was a young fellow named Case Who entered a cunt-lapping race. He licked his way clean Through Number thirteen, But then slipped and got pissed in the face. % There was a young fellow named Charteris Put his hand where his young lady's garter is. Said she, "I don't mind, And higher up you'll find The place where my fucker and farter is." % There was a young fellow named Cribbs Whose cock was so big it had ribs. They were inches apart, And to suck it took art, While to fuck it took forty-two trips. % There was a young fellow named dick Who had a magnificent prick. It was shaped like a prism And shot so much gism It made every cocksucker sick. % There was a young fellow named Feeney Whose girl was a terrible meany. The hatch of her snatch Had a catch that would latch - She could only be screwed by Houdini. % There was a young fellow named Fletcher, Was reputed an infamous lecher. When he'd take on a whore She'd need a rebore, And they'd carry him out on a stretcher. % There was a young fellow named Fyfe Whose marriage was ruined for life, For he had an aversion To every perversion, And only liked fucking his wife. Well, one year the poor woman struck, And she wept, and she cursed at her luck, And said, "Where have you gotten us With your goddamn monotonous Fuck after fuck after fuck? "I once knew a harlot named Lou -- And a versatile girl she was, too. After ten years of whoredom She perished of boredom When she married a jackass like you!" % There was a young fellow named Gene Who first picked his asshole quite clean. He next picked his toes, And lastly his nose, And he never did wash in between. % There was a young fellow named Gluck Who found himself shit out of luck. Though he petted and wooed, When he tried to get screwed He found virgins just don't give a fuck. % There was a young fellow named Goody Who claimed that he wouldn't, but would he? If he found himself nude With a gal in the mood The question's not woody but could he? % There was a young fellow named Grant Who was made like the sensitive plant. When they asked "Do you fuck?" He replied, "No such luck. I would if I could, but I can't." % There was a young fellow named Grimes Who fucked his girl seventeen times In the course of a week -- And this isn't to speak Of assorted venereal crimes. % There was a young fellow named Harry, Had a joint that was long, huge and scary. He grabbed him a virgin, Who, without any urgin', Immediately spread like a fairy. % There was a young fellow named Hatch Who was fond of the music of Bach. He said: "It's not fussy Like Brahms and Debussy; Sit down, and I'll play you a snatch." % There was a young fellow named Kimble Whose prick was exceedingly nimble, But fragile and slender, And dainty and tender, So he kept it encased in a thimble. % There was a young fellow named Meek Who invented a lingual technique. It drove women frantic, And made them romantic, And wore all the hair off his cheek. % There was a young fellow named Morgan Who possessed an unusual organ: The end of his dong, Which was nine inches long, Was tipped with the head of a gorgon. % There was a young fellow named Paul Who confessed, "I have only one ball. But the size of my prick Is God's dirtiest trick, For my girls always ask, 'Is that all?'" % There was a young fellow named Pell Who didn't like cunt very well. He would finger or fuck one, But never would suck one-- He just couldn't get used to the smell. % There was a young fellow named Price Who dabbled in all sorts of vice. He had virgins and boys And mechanical toys, And on Mondays... he meddled with mice! % There was a young fellow named Prynne Whose prick was so short and so thin, His wife found she needed A Fuckoscope -- she did -- To see if he'd gotten it in. % There was a young fellow named Skinner Who took a young lady to dinner At a quarter to nine, They sat down to dine, At twenty to ten it was in her. The dinner, not Skinner -- Skinner was in her before dinner. There was a young fellow named Tupper Who took a young lady to supper. At a quarter to nine, They sat down to dine, And at twenty to ten it was up her. Not the supper -- not Tupper -- It was some son-of-a-bitch named Skinner! % There was a young fellow named Sweeney, Whose girl was a terrible meanie, The hatch of her snatch, Had a catch that would latch, She could only be screwed by Houdini. % There was a young fellow of Burma Whose betrothed had good reason to murmur. But now that he's married he's Been using cantharides And the root of their love is much firmer. % There was a young fellow of Greenwich Whose balls were all covered with spinach. He had such a tool It was wound on a spool, And he reeled it out inich by inich. But this tale has an unhappy finich, For due to the sand in the spinach His ballocks grew rough And wrecked his wife's muff, And scratched up her thatch in the scrimmage. % There was a young fellow of Harrow Whose john was the size of a marrow. He said to his tart, "How's this for a start? My balls are outside in a barrow." % There was a young fellow of Kent Whose prick was so long that it bent, So to save himself trouble He put it in double, And instead of coming he went. % There was a young fellow of Mayence Who fucked his own arse in defiance Not only of custom And morals, dad-bust him, But of most of the known laws of science. % There was a young fellow of Perth Whose balls were the finest on earth. They grew to such size That one won a prize, And goodness knows what they were worth. % There was a young fellow of Strensall Whose prick was as sharp as a pencil. On the night of his wedding It went through the bedding, And shattered the chamber utensil. % There was a young fellow of Warwick Who had reason for feeling euphoric, For he could by election Have triune erection: Ionic, Corinthian, and Doric. % There was a young fellow whose dong Was prodigiously massive and long. On each side of his whang Two testes did hang That attracted a curious throng. % There was a young gaucho named Bruno Who said, "Screwing is one thing I do know. A woman is fine, And a sheep is divine, But a llama is Numero Uno." % There was a young gaucho named Bruno Who said, "There is one thing I do know, Women are fine And children devine, But the llama is numero uno." % There was a young German named Ringer Who was screwing an opera singer. Said he with a grin, "Well, I've sure got it in!" Said she, "You mean that ain't your finger?" % There was a young girl from Annista Who dated a lecherous mister. He fondled her titty, Got one finger shitty, Then screwed up his courage and kissed 'er. % There was a young girl from Decatur Who was raped by an alligator. But no one quite knew How she relished that screw, For after he screwed her, he ate her. % There was a young girl from Dundee, From her fanny there grew a plum tree. No one ate the nice fruit, To tell you the truth, Because they knew it came from her tooty-toot-toot. % There was a young girl from East Lynn Whose mother ( to save her from sin ) Had filled up her crack With hard-setting shellac, But the boys picked it out with a pin. % There was a young girl from Hong Kong Who said, "You are utterly wrong To say my vagina Is the largest in China Just because of your mean little dong." % There was a young girl from Hong Kong Whose cervical cap was a gong. She said with a yell, As a shot rang her bell, "I'll give you a ding for a dong!" % There was a young girl from Medina Who could completely control her vagina. She could twist it around Like the cunts that are found In Japan, Manchukuo and China. % There was a young girl from New York Who plugged up her cunt with a cork. A woodpecker or two Made the grade it is true, But it totally baffled the stork. Till along came a man who presented A tool that was strangely indented. With a dizzying twirl He punctured that girl, And thus was the cork-screw invented. % There was a young girl from New York Who plugged up her quim with a cork A woodpecker or two Made the grade, it is true, But it totally baffled the stork. % There was a young girl from Peru, Who had nothing whatever to do. So she sat on the stairs, And counted cunt hairs, Four thousand, three hundred and two. % There was a young girl from Peru, Who noticed her lovers were few; So she walked out her door With a fig leaf, no more, And now she's in bed - with the flu. % There was a young girl from Samoa Who pledged that no man would know her. One young fellow tried, But she wriggled aside, And he spilled all his spermatozoa. % There was a young girl from Seattle, Whose hobby was sucking off cattle. But a bull from the South Shot a wad in her mouth That made both her ovaries rattle. % There was a young girl from Siam Who said to her boyfriend Priam, "To seduce me, of course, You'll have to use force, And thank goodness you're stronger than I am. % There was a young girl from St. Cyr Whose reflex reactions were queer. Her escort said, "Mable, Get up off the table; That money's to pay for the beer." % There was a young girl from St. Paul Who went to a newspaper ball. Her dress caught on fire And burnt her entire Front page and sport section and all. % There was a young girl from the Bronix Who had a vagina of onyx. She had so much `tsoris' With her clitoris, She traded it in for a Packard. % There was a young girl from the coast Who, just when she needed it most, Lost her Kotex and bled All over the bed, And the head and the beard of her host. % There was a young girl in Berlin Who eked out a living through sin. She didn't mind fucking, But much preferred sucking, And she'd wipe off the pricks on her chin. % There was a young girl in Berlin Who was fucked by an elderly Finn. Though he diddled his best, And fucked her with zest, She kept asking, "Hey, Pop, is it in?" % There was a young girl in Dakota Had a letter from Ickes; he wrote her: "In addition to gas We are rationing ass, And you've greatly exceeded your quota." % There was a young girl name McKnight Who got drunk with her boy-friend one night. She came to in bed, With a split maidenhead-- That's the last time she ever was tight. % There was a young girl named Ann Heuser Who swore that no man could surprise her. But Pabst took a chance, Found a Schlitz in her pants, And now she is sadder Budweiser. % There was a young girl named Heather Whose twitcher was made out of leather. She made a queer noise, Which attracted the boys, By flapping the edges together. % There was a young girl named McCall Whose cunt was exceedingly small, But the size of her anus Was something quite heinous -- It could hold seven pricks and one ball. % There was a young girl named O'Clare Whose body was covered with hair. It was really quite fun To probe with one's gun, For her quimmy might be anywhere. % There was a young girl named O'Malley Who wanted to dance in the ballet. She got roars of applause When she kicked off her drawers, But her hair and her bush didn't tally. % There was a young girl named Saphire Who succumbed to her lovers desire. She said, "It's a sin, But now that it's in, Could you shove it a few inches higher?" % There was a young girl named Sapphire Who succumbed to her lover's desire. She said, "It's a sin, But now that it's in, Could you shove it a few inches higher?" % There was a young girl of Aberystwyth Who screwed every man that she kissed with. She tickled the balls Of the men in the halls, And pulled on the prongs that they pissed with. % There was a young girl of Aberystwyth Who took grain to the mill to get grist with. The miller's sun, Jack, Laid her flat on her back, And united the organs they pissed with. % There was a young girl of Angina Who stretched catgut across her vagina. From the love-making frock (With the proper sized cock) Came Toccata and Fugue in D minor. % There was a young girl of Asturias With a penchant for practices curious. She loved to bat rocks With her gentlemen's cocks -- A practice both rude and injurious. % There was a young girl of Batonger who diddled herself with a conger, When asked how it feels To be pleasured by eels She said, "Just like a man, only longer. % There was a young girl of Cah'lina, Had a very capricious vagina: To the shock of the fucker "Twould suddenly pucker, And whistle the chorus of "Dinah." % There was a young girl of Cape Cod Who dreamt she'd been buggered by God. But it wasn't Jehovah That turned the girl over, 'Twas Roger the lodger, the dirty old codger, the bugger, the bastard, the sod! % There was a young girl of Cape Town Who usually fucked with a clown. He taught her the trick Of sucking his prick, And when it went up -- she went down. % There was a young girl of Coxsaxie Whose skirt was more mini than maxi. She was fucked at the show In the twenty-third row, And once more going home in the taxi. % There was a young girl of Darjeeling Who could dance with such exquisite feeling There was never a sound For miles around Save of fly-buttons hitting the ceiling. % There was a young girl of Des Moines Whose cunt could be fitted with coins, Till a guy from Hoboken Went and dropped in a token, And now she rides free on the ferry. % There was a young girl of Detroit Who at fucking was very adroit: She could squeeze her vagina To a pin-point, or finer, Or open it out like a quoit. And she had a friend named Durand Whose cock could contract or expand. He could diddle a midge Or the arch of a bridge -- Their performance together was grand! % There was a young girl of East Lynne Whose mother, to save her from sin, Had filled up her crack, To the brim with shellac, But the boys picked it out with a pin. % There was a young girl of Gibraltar Who was raped as she knelt at the altar. It really seems odd That a virtuous God Should answer her prayers and assault her. % There was a young girl of LLewellyn Whose breasts were as big as a melon. They were big it is true, But her cunt was big too, Like a bifocal, full-color, aerial view Of Cape Horn and the Straits of Magellan. % There was a young girl of Mobile, Who hymen was made of chilled steel, To give her a thrill, Took a rotary drill, Or a number nine emery wheel. % There was a young girl of Moline Whose fucking was sweet and obscene. She would work on a prick With every known trick, And finish by winking it clean. % There was a young girl of Newcastle Whose charms were declared universal. While one man in front Wired into her cunt, Another was engaged at her arsehole. % There was a young girl of Pawtucket Whose box was as big as a bucket. Her boy-friend said, "Toots, I'll have to wear boots, For I see I must muck it, not fuck it." % There was a young girl of Penzance Who boarded a bus in a trance. The passengers fucked her, Likewise the conductor, While the driver shot off in his pants. % There was a young girl of Pitlochry Who was had by a man in a rockery. She said, "Oh! You've come All over my bum; This isn't a fuck -- it's a mockery." % There was a young girl of Rangoon Who was blocked by the Man in the Moon. "Well, it has been great fun," She remarked when he'd done, "But I'm sorry you came quite so soon." % There was a young girl of Spitzbergen, Whose people all thought her a virgin, Till they found her in bed With her twat very red, And the head of a kid just emergin'. % There was a young girl, very sweet, Who thought sailors' meat quite a treat. When she sat on their lap She unbuttoned their flap, And always had plenty to eat. % There was a young girl who begat Three babies named Nat, Pat and Tat. T'was fun in the breeding But hell in the feeding When she found there's no tit for Tat. % There was a young girl who begat Three brats, by name Nat, Pat, and Tat. It was fun in the breeding, But hell in the feeding, When she found there was no tit for Tat. % There was a young harlot from Kew Who filled her vagina with glue. She said with a grin, "If they pay to get in, They'll pay to get out of it too." % There was a young harlot named Schwartz Whose cock-pit was studded with warts, And they tickled so nice She drew a high price From the studs at the summer resorts. Her pimp, a young fellow named Biddle, Was seldom hard up for a diddle, For according to rumor His tool had a tumor And a fine row of warts down the middle. % There was a young hayseed from Tiffan Whose cock would constantly stiffen. The knob out in front Attracted foul cunt Which he greatly delighted in sniffin'. % There was a young idler named Blood, Made a fortune performing at stud, With a fifteen-inch peter, A double-beat metre, And a load like the Biblical Flood. % There was a young Jew of Far Rockaway Whose screams could be heard for a block away. Perceiving his error, The Rabbi in terror Cried, "God! I have cut his whole cock away!" % There was a young lad - name of Durcan Who was always jerkin' his gherkin. His father said, "Durcan Stop jerkin' your gherkin Your gherkin's for ferkin', not jerkin'. % There was a young lad from Nahant Who was made like the Sensitve Plant. When asked, "Do you fuck?" He replied, "No such luck. I would if I could but I can't." % There was a young lad from Siam, Whose sexlife was caught in a jam. He loved them real small, 'Cause they're funner to ball, So he went out and bought him a lamb! % There was a young lad name of Durcan Who was always jerkin' his gherkin. His father said, "Durcan! Stop jerkin' your gherkin! Your gherkin's for ferkin', not jerkin'. % There was a young lad name of Ward Who strung himself up with a cord Said he, of his work (Ere the rope snapped with a jerk) "I am leaving because I am bored." - E.A. Guest % There was a young lad named McFee Who was stung in the balls by a bee He made oodles of money By oozing pure honey Every time he attempted to pee. % There was a young lady at sea Who complained that it hurt her to pee. Said the brawny old mate, "That accounts for the state Of the cook and the captain and me." % There was a young lady at sea Who said, "God, how it hurts me to pee." "I see," said the mate, "That accounts for the state Of the captain, the purser, and me." % There was a young lady called Ciss Who went to the river to piss. A young man in a punt Put his hand on her cunt; No wonder she thought it was bliss. % There was a young lady from Bangor Who slept while the ship lay at anchor She woke in dismay When she heard the mate say: "Let's lift up the topsheet and spanker!" % There was a young lady from Bright, Whose speed was much faster than light. She went out one day In a relative way And returned on the previous night. % There was a young lady from Bristol Who went to the Palace called Crystal. Said she, "It's all glass, And as round as my ass," And she farted as loud as a pistol. % There was a young lady from Brussels Who was proud of her vaginal muscles. She could easily plex them And so interflex them As to whistle love songs through her bustles. % There was a young lady from Drew Who ended her verse at line two. % There was a young lady from Dumfries Who said to her boyfriend, "It's some freeze! My navel's all bare, So stick it in there, Before both my legs and my bum freeze." % There was a young lady from Exeter, So pretty that men craned their necks at her. One was even so brave As to take out and wave The distinguishing mark of his sex at her. % There was a young lady from Hyde Who ate a green apple and died. While her lover lamented The apple fermented And made cider inside her inside. % There was a young lady from Maine Who claimed she had men on her brain. But you knew from the view, As her abdomen grew, It was not on her brain that he'd lain. % There was a young lady from Munich Who had an affair with a eunuch. At the height of their passion He dealt her a ration % There was a young lady from Munich Who had an affair with a eunuch. At the height of their passion He dealt her a ration From a squirt gun concealed in his tunic. % There was a young lady from Norway Who hung by her heels in a doorway. She told her young man, "Get off the divan, I think I've discovered one more way " % There was a young lady from Prentice Who had an affair with a dentist. To make things easier He used anesthesia, And diddled her, `non compos mentis'. % There was a young lady from Rheims Who amazingly pissed in four streams. A friend poked around And a fly-button found Lodged tight in her hole so it seems. % There was a young lady from Rio Who slept with the Fornier trio. As she dropped her panties She said, "No andanties I want this allegro con brio." % There was a young lady from Siam Who said to her lover, one Kiam, "You may kiss me of course, But you'll have to use force. Though god knows you're stronger than I am." % There was a young lady from Spain Who demurely undressed on a train. A helpful young porter Helped more than he orter, And she promptly cried "Help me again" % There was a young lady from Spain Who got sick as she rode on a train; Not once, but again, And again, and again, And again, and again, and again. % There was a young lady from Spain Whose face was exceedingly plain, But her cunt had a pucker That made the men fuck her, Again, and again, and again. % There was a young lady from Troy Had a moustache, just like a young boy Though it tickled to kiss 'Twas a source of much bliss When she used it to brush a man's toy. % There was a young lady from Wheeling Who claimed to lack sexual feeling. But a cynic named Boris Just touched her clitoris And she had to be scraped off the ceiling. % There was a young lady from Wheeling Who had a peculiar feeling. She laid on her back And tickled her crack And pissed all over the ceiling. % There was a young lady from Wooster Who complained that too many men gooster. So she traded her scanties For sandpaper panties, Now they goose her much less than they used 'ter. % There was a young lady in Reno, Who lost all her dough playing Keno. But she lay on her back, And opened her crack, So now she owns the Casino! % There was a young lady named Alice Who was known to have peed in a chalice. 'Twas the common belief It was done for relief, And not out of protestant malice. % There was a young lady named Astor Who never let any get past her. She finally got plenty By stopping twenty, Which certainly ought to last her. % There was a young lady named Banker, Who slept while the ship lay at anchor, She woke in dismay, When she heard the mate say, "Now hoist up the topsheet and spanker." % There was a young lady named Blount Who had a rectangular cunt. She learned for diversion Posterior perversion, Since no one could fit here in front. % There was a young lady named Bower Who dwelt in an Ivory Tower. But a poet from Perth Laid her flat on the earth, And proceeded with penis to plough her. % There was a young lady named Brent With a cunt of enormous extent, And so deep and so wide, The acoustics inside Were so good you could hear when you spent. % There was a young lady named Bright Who could travel much faster than light. She took off one day, In a relative way, And returned on the previous night. % There was a young lady named Brook Who never could learn how to cook. But on a divan She could please any man- She knew every darn trick in the book! % There was a young lady named Cager Who, as the result of a wager, Consented to fart The entire oboe part Of Mozart's quartet in F major. % There was a young lady named Ciss Who said, "I think skating's a bliss " But she'll never restate, For a wheel off her skate .siht ekil gnihtemos pu hsinif reh edaM % There was a young lady named Clair Who possessed a magnificent pair; At least so I thought Till I saw one get caught On a thorn, and begin losing air. % There was a young lady named Dot Whose cunt was so terribly hot That ten bishops of Rome And the Pope's private gnome Failed to quench her Vesuvial twat. % There was a young lady named Duff With a lovely, luxuriant muff. In his haste to get in her One eager beginner Lost both of his balls in the rough. % There was a young lady named Etta Who was constantly seen in a swetta. Three reasons she had: To keep warm wasn't bad, But the other two reasons were betta. % There was a young lady named Fleager Who was terribly, terribly eager To be all the rage On the tragedy stage, Though her talents were pitifully meagre. -- Edward Gorey % There was a young lady named Flo Whose lover had pulled out too slow. So they tried it all night, Till he got it just right... Well, practice makes pregnant, you know. % There was a young lady named Flynn Who thought fornication a sin, But when she was tight It seemed quite all right, So everyone filled her with gin. % There was a young lady named Gilda Who went on a date with a builder. He said that he would, And he could and he should, And he did and it damn well near killed her. % There was a young lady named Gloria Who was had by Sir Gerald Du Maurier, And then by six men, Sir Gerald again, And the band at the Waldorf-Astoria. % There was a young lady named Gloria, Whose boyfriend said, "May I explore ya?" She replied to the chap, "I'll draw you a map, Of where others have been to before ya." % There was a young lady named Grace Who would not take a prick in her "place." Though she'd kiss it and suck it, She never would fuck it-- She just couldn't relax face-to-face. % There was a young lady named Hall, Wore a newspaper dress to a ball. The dress caught on fire And burned her entire Front page, sporting section, and all. % There was a young lady named Hatch Who would always come through in a scratch. If a guy wouldn't neck her, She'd grab up his pecker And shove the damn thing up her snatch. % There was a young lady named Mable Who liked to sprawl out on the table, Then cry to her man, "Stuff in all you can -- Get your ballocks in, too, if you're able." % There was a young lady named Mandel Who caused quite a neighborhood scandal By coming out bare On the main village square And frigging herself with a candle. % There was a young lady named Maud, A terrible society fraud: In company, I'm told, She was distant and cold, But if you got her alone, Oh God! % There was a young lady named May Who strolled in a park by the way, And she met a youg man Who fucked her and ran -- Now she goes to the park every day. % There was a young lady named Nance Who learned about fucking in France, And when you'd insert it She'd squeeze till she hurt it, And shoved it right back in your pants. % There was a young lady named Nelly Whose tits would jiggle like jelly. They could tickle her twat Or be tied in a knot, And could even swat flies on her belly. % There was a young lady named Ransom Who was raped three times in a hansom When she cried out for more Said a voice from the floor, "My name, ma'am, is Simpson, not Samson % There was a young lady named Ransom Who was rogered three times in a hansom. When she cried out for more A voice from the floor Replied, "My name is Simpson, not Samson." % There was a young lady named Riddle Who had an untouchable middle. She had many friends Because of her ends, Since it isn't the middle you diddle. % There was a young lady named Rose Who fainted whenever she chose; She did so one day While playing croquet, But was quickly revived with a hose. -- Edward Gorey % There was a young lady named Rose With erogenous zones in her toes. She remained onanistic Till a foot-fetishistic Young man became one of her beaux. % There was a young lady named Schneider Who often kept trysts with a spider. She found a strange bliss, In the hiss of her piss, As it strained through the cobwebs inside her. % There was a young lady named Smith Whose virtue was largely a myth. She said, "Try as I can I can't find a man Who it's fun to be virtuous with." % There was a young lady named Twiss Who said she thought fucking a bliss, For it tickled her bum And caused her to come .siht ekil gniyl ylbatrofmoc elihW % There was a young lady named Wylde Who kept herself quite undefiled By thinking of Jesus; Contagious diseases; And the bother of having a child. % There was a young lady of Arden, The tool of whose swain wouldn't harden. Said she with a frown, "I've been sadly let down By the tool of a fool in a garden." % There was a young lady of Bicester Who was nicer by far than her sister: The sister would giggle And wiggle and jiggle, But this one would come if you kissed her. % There was a young lady of Brabant Who slept with an impotent savant. She admitted, "We shouldn't, But it turned out he couldn't- So you can't say we have when we haven't." % There was a young lady of Bude Who walked down the street in the nude. A bobby said, "Whattum Magnificent bottom!" And slapped it as hard as he could. % There was a young lady of Carmia Whose housekeeping ways would alarm ya. At every cold snap She would climb in your lab, So her little base burner could warm ya. % There was a young lady of Dee Who went down to the river to pee. A man in a punt Put his hand on her cunt, And God! how I wish it were me. % There was a young lady of Dee Whose hymen was split into three. And when she was diddled The middle string fiddled : "Nearer My God To Thee." % There was a young lady of Dexter Whose husband exceedingly vexed her, For whenever they'd start He'd unfailingly fart With a blast that damn nearly unsexed her. % There was a young lady of Dover Whose passion was such that it drove her To cry, when you came, "Oh dear! What a shame! Well, now we shall have to start over." % There was a young lady of Ealing And her lover before her was kneeling. Said she, "Dearest Jim, Take your hands off my quim; I much prefer fucking to feeling." % There was a young lady of fashion Who had oodles and oodles of passion. To her lover she said, As they climbed into bed, "Here's one thing the bastards can't ration!" % There was a young lady of Fez Who was known to the public as "Jez." Jezebel was her name, Sucking cocks was the game She excelled at (so everyone says). % There was a young lady of Gaza Who shaved her cunt bare with a razor. The crabs, in a lump, Made tracks to her rump - This passing parade did amaze her. % There was a young lady of Gaza Who shaved her cunt bare with a razor. The crabs, in a lump, Made tracks to her rump - This passing parade did amaze her. % There was a young lady of Gaza Who shaved her cunt bare with a razor. The crabs, in a lump, Made tracks to her rump-- This passing parade did amaze her. % There was a young lady of Gloucester, Met a passionate fellow who tossed her. She wasn't much hurt, But he dirtied her skirt, So think of the anguish it cost her. % There was a young lady of Gloucester Whose friends they thought they had lost her Till they found on the grass The marks of her arse, And the knees of the man who had crossed her. % There was a young lady of Kent, Who admitted she knew what it meant When men asked her to dine, And plied her with wine, She knew, oh she knew -- but she went! % There was a young lady of Lee Who scrambled up into a tree, When she got there Her arsehole was bare, And so was her C U N T. % There was a young lady of Lincoln Who said that her cunt was a pink'un, So she had a prick lent her Which turned it magenta, This artful old lady of Lincoln. % There was a young lady of Natchez Who chanced to be born with two snatches, And she often said, "Shit! Why, I'd give either tit For a man with equipment that matches." There was a young fellow named Locke Who was born with a two-headed cock. When he'd fondle the thing It would rise up and sing An antiphonal chorus by Bach. But whether these two ever met Has not been recorded as yet, Still, it would be diverting To see him inserting His whang while it sang a duet. % There was a young lady of Norway Who hung by her toes in a doorway. She said to her beau "Just look at me Joe I think I've discovered one more way." % There was a young lady of Rhyll In an omnibus was taken ill, So she called the conductor, Who got in and fucked her, Which did more good than a pill. % There was a young lady of Spain Who took down her pants on a train. There was a young porter Saw more than he orter, And asked her to do it again. % There was a young lady of Spain Who was fucked by a monk in a drain. They did it again And again and again, And again and again and again. % There was a young lady of Twickenham Who thought men had not enough prick in 'em. On her knees every day To God she would pray To lengthen and strengthen and thicken 'em. % There was a young lady of Wheeling Said to her beau, "I've a feeling My little brown jug Has need of a plug" -- And straightaway she started to peeling. % There was a young lady of Wheeling Who professed to lack sexual feeling. But a cynic named Boris Just touched her clitoris, And she had to be scraped off the ceiling. % There was a young lady who said, As her bridegroom got into the bed, "I'm tired of this stunt, That they do with one's cunt, You can get up my bottom instead." % There was a young lady whose cunt Could accomodate a small punt. Her mother said, "Annie, It matches your fanny, Which never was that of a runt." % There was a young lady whose thighs, When spread showed a slit of such size, And so deep and so wide, You could play cards inside, Much to her bridegroom's surprise. % There was a young lass from Surat. The cheeks of her ass were so fat That they had to be parted Whenever she farted, And also whenever she shat. % There was a young lass from Surat. The cheeks of her ass were so fat That they had to be parted Whenever she farted, And also whenever she shat. % There was a young laundress named Wrangle Whose tits tilted up at an angle. "They may tickle my chin," She said with a grin, "But at least they keep out of the mangle." % There was a young maiden from Osset Whose quim was nine inches across it. Said a young man named Tong, With tool nine inches long, "I'll put bugger-in if I loss it." % There was a young man from Bear Ridge Who had strange ideas about marriage. He fucked his wife's mother And sucked off her brother And ate up her sister's miscarriage. % There was a young man from Bel-Aire Who was screwing his girl on the stair. But the banister broke So he doubled his stroke And finished her off in mid-air. % There was a young man from Bengal Who claimed he had only one ball, But two little bitches Pulled down this man's breeches And proved he had nothing at all. % There was a young man from Biloxi Whose bowels responded to Moxie. Drinking glass after glass, He would tune up his ass, Till he played like the band at the Roxy. % There was a young man from Bombay Who fashioned a cunt out of clay But the heat of his prick Turned it into a brick And rubbed all his foreskin away. % There was a young man from Boston Who rode around in an Austin. There was room for his ass And a gallon of gas, But his balls hung out and he lost 'em. % There was a young man from Calcutta Who was heard in his beard to mutter, "If her Bartholin glands Don't respond to my hands, I'm afraid I shall have to use butter." % There was a young man from Dallas Who had an exceptional phallus. He couldn't find room In any girl's womb Without rubbing it first with Vitalis. % There was a young man from Dundee Who buggered an ape in a tree. The results were quite horrid: All ass and no forehead, Three balls and a purple goatee. % There was a young man from East Lizes Whose balls were of two different sizes One was so small It was no ball at all The other was large and won prizes. % There was a young man from East Wubley Whose cock was bifurcated doubly. Each quadruplicate shaft Had two balls hanging aft, And the general effect was quite lovely. There was a young man from Hong Kong Who had a trifurcated prong: A small one for sucking, A large one for fucking, And a `boney' for beating a gong. % There was a young man from Glengozzle Who found a remarkable fossil. He knew by the bend And the wart on the end, 'Twas the peter of Paul the Apostle. % There was a young man from Jodhpur Who found he could easily cure His dread diabetes By eating a foetus Served up in a sauce of manure. % There was a young man from Kent Whose tool was so long that it bent. To save himself trouble He put it in double And instead of coming, he went. % There was a young man from Lynn Whose cock was the size of a pin. Said his girl with a laugh As she felt his staff, "This won't be much of a sin." % There was a young man from Maine Whose prick was as strong as a crane; It was almost as long, So he strolled with his dong Extended in sunshine and rain. % There was a young man from Nantucket Whose cock was so long he could suck it. But he looked in the glass, And saw his own ass, And broke his neck trying to fuck it. % There was a young man from Nantucket Whose cock was so long he could suck it. He said with a grin, While wiping his chin, "If my ear was a cunt, I could fuck it." % There was a young man from New Haven Who had an affair with a raven. He said with a grin As he wiped off his chin, "Nevermore!" % There was a young man from Peru, Who took a long trip by canoe. While staring at Venus, And rubbing his penis, He wound up with a handful of goo. % There was a young man from Purdue Who was only just learning to screw, But he hadn't the knack, And he got too far back -- In the right church, but in the wrong pew. % There was a young man from Racine Who invented a fucking machine. Concave or convex, It served either sex, But oh what a bitch to keep clean. % There was a young man from Rangoon Who used to lament 'neath the moon That he had the luck To be born of a fuck That was scraped off the sheets with a spoon. % There was a young man from Salinas Who had an extremely long penis: Believe it or not, When he lay on his cot It reached from Marin to Martinez. % There was a young man from Seattle Whose testicles tended to rattle. He said as he fuck-ed Some stones in a bucket, "If Stravinsky won't deafen you -- that'll." % There was a young man from Siam Who said, "I go in with a wham, But I soon lose my starch Like the mad month of March, And the lion comes out like a lamb." % There was a young man from St. Paul's Who read "Harper's Bazaar" and "McCall's" Till he grew such a passion For feminine fashion That he knitted a snood for his balls. % There was a young man from Stamboul Who boasted so torrid a tool That each female crater Explored by this satyr Seemed almost unpleasantly cool. % There was a young man from Tibet- And this is the strangest one yet- Whose tool was so long, So pointed and strong, He could bugger six Greeks "en brochette". % There was a young man in Havana, Banged his girl on a player-piana. At the height of their fever Her ass hit the lever And: yes, he has no banana. % There was a young man in Norway, Tried to jerk himself off in a sleigh, But the air was so frigid It froze his cock rigid, And all he could come was frappe. % There was a young man in the choir Whose penis rose higher and higher, Till it reached such a height It was quite out of sight -- But of course you know I'm a liar. % There was a young man, name of Fred, Who spent every Thursday in bed; He lay with his feet Outside of the sheet, And the pillows on top of his head. -- Edward Gorey % There was a young man, name of Saul, Who was able to bounce either ball, He could stretch them and snap them, And juggle and clap them, Which earned him the plaudits of all. % There was a young man named Crockett Whose balls got caught in a socket. His wife was a bitch So she threw the switch, And Crockett went off like a rocket. % There was a young man named Crockett Whose balls got caught in a socket. His wife was a bitch, Yeah, she threw the switch, And Crockett went off like a rocket. % There was a young man named Hughes Who swore off all kinds of booze. He said, "When I'm muddled My senses get fuddled, And I pass up too many screws." % There was a young man named Knute Who had warts all over his root. He put acid on these And now when he pees, He fingers the thing like a flute. % There was a young man named Laplace Whose balls were made out of spun glass. When they banged together They played "Stormy Weather" And lightning shot out of his ass. % There was a young man named McNamiter With a tool of prodigious diameter. But it wasn't the size Gave the girls a surprise, But his rythm -- iambic pentameter. % There was a young man named Rex Who really was small for his sex. When tried for exposure The judge's disclosure Was "de minimus non curat lex." % There was a young man named Zerubbabel Who had only one real, and one rubber ball. When they asked if his pleasure Was only half measure, He replied, "That is highly improbable." % There was a young man named Zerubbabub Who belonged to the Block, Fuck & Bugger Club But the pride of his life Were the tits of his wife -- One real, and one India-rubber bub. % There was a young man of Arras Who stretched himself out on the grass, And with no little trouble, He bent himself double, And stuck his prick well up his ass. % There was a young man of Australia Who went on a wild bacchanalia. He buggered a frog, Two mice and a dog, And a bishop in fullest regalia. % There was a young man of Belgrade Who remarked, "I'm a queer piece of trade. I will suck, without charge, Any cock, if it's large. If it's small, I expect to be paid." % There was a young man of Belgrade Who slept with a girl in the trade. She said to him, "Jack, Try the hole in the back; The front one is badly decayed." % There was a young man of Bengal Who swore he had only one ball, But two little bitches Unbuttoned his britches, And found he had no balls at all. % There was a young man of Bombay Who buggered his dad once a day. He said, "I like, rather, Fucking my father -- He's clean, and there's nothing to pay." % There was a young man of Calcutta, Who tried to write "cunt" on a shutter. When he got to c-u, A pious Hindoo Knocked him ass-over-head in the gutter. % There was a young man of Cape Horn Who wished he had never been born, And he wouldn't have been If his father had seen That the end of the rubber was torn. % There was a young man of Coblenz Whose ballocks were simply immense: It took forty-four draymen, A priest and three laymen To carry them thither and thence. % There was a young man of Darjeeling Whose cock reached up to the ceiling. In the electric light socket, He'd put it and rock it-- Oh God! What a wonderful feeling! % There was a young man of Devizes Whose balls were of different sizes. His tool when at ease, Hung down to his knees, Oh, what must it be when it rises! % There was a young man of Devizes, Whose balls were of different sizes. One was so small, It was nothing at all; The other took numerous prizes. % There was a young man of Dumfries Who said to his girl, "If you please, It would give me great bliss If, while playing with this, You would pay some attention to these!" % There was a young man of Greenwich Whose balls were all covered with spinach. So long was his tool That it wound round a spool, And he let it out inach by inach. % There was a young man of high station Who was found by a pious relation Making love in a ditch To -- I won't say a bitch -- But a woman of no reputation. % There was a young man of Khartoum, The strength of whose balls was his doom. So strong was his shootin', The third law of Newton Propelled the poor chap to the Moon. % There was a young man of Khartoum Who lured a poor girl to her doom. He not only fucked her, But buggered and sucked her-- And left her to pay for the room. % There was a young man of Kildare Who was fucking a girl on the stair. The bannister broke, But he doubled his stroke And finished her off in mid-air. % There was a young man of Kutki Who could blink himself off with one eye. For a while though, he pined, When his organ declined To function, because of a stye. % There was a young man of Lahore Whose prick was one inch and no more. It was all right for key-holes And little girl's pee-holes, But not worth a damn with a whore. % There was a young man of Lake Placid Whose prick was lethargic and flaccid. When he wanted to sport He would have to resort To injections of sulphuric acid. % There was a young man of Madras Whose balls were constructed of brass. When jangled together They played "Stormy Weather", And lightning shot out of his ass. % There was a young man of Missouri Who fucked with a terrible fury. Till hauled into court For his beastial sport, And condemned by a poorly-hung jury. % There was a young man of Natal And Sue was the name of his gal. One day, north of Aden, He got his hard rod in, And came clear up Suez Canal. % There was a young man of Natal Who was fucking a Hottentot gal. Said she, "You're a sluggard!" Said he, "You be buggered! I like to fuck slow and I shall." % There was a young man of Ostend Who let a girl play with his end. She took hold of Rover, And felt it all over, And it did what she didn't intend. % There was a young man of Ostend Whose wife caught him fucking her friend. "It's no use, my duck, Interrupting our fuck, For I'm damned if I draw till I spend." % There was a young man of Saskatchewan, Whose penis was truly gargantuan. It was good for large whores, And for small dinosaurs, And was rough enough to scratch a match upon. % There was a young man of Seattle Who bested a bull in a battle. With fire and gumption He assumed the bull's function, And deflowered a whole herd of cattle. % There was a young man of St. John's Who wanted to bugger the swans. But the loyal hall porter Said, "Pray take my daughter! Those birds are reserved for the dons." % There was a young man of Tibet -- And this is the strangest one yet -- His prick was so long, And so pointed and strong, He could bugger six sheep en brochette. % There was a young man of Toulouse Who had a deficient prepuce, But the foreskin he lacked He made up in his sac; The result was, his balls were too loose. % There was a young man who appeared To his friends with a full growth of beard; They at once said, "Although We can't say why it's so, The effect is uncommonly weird." -- Edward Gorey % There was a young man who said "God, I find it exceedingly odd, That the willow oak tree Continues to be, When there's no one about in the Quad." "Dear Sir, your astonishment's odd, For I'm always about in the Quad; And that's why the tree, Continues to be," Signed "Yours faithfully, God." % There was a young man with a fiddle Who asked of his girl, "Do you diddle?" She replied, "Yes, I do, But prefer to with two -- It's twice as much fun in the middle." % There was a young man with a prick Which into his wife he would stick Every morning and night If it stood up all right -- Not a very remarkable trick. His wife had a nice little cunt: It was hairy, and soft, and in front, And with this she would fuck him, Though sometimes she'd suck him -- A charming, if commonplace, stunt. % There was a young man with one foot Who had a very long root. If he used this peg As an extra leg Is a question exceedingly moot. % There was a young miss from Johore Who'd lie on a mat on the floor; In a manner uncanny She'd wobble her fanny, And drain your nuts dry to the core. % There was a young monk from Siberia Whose life got drearia' and drearia' Till he did to a nun What shouldn't be done And made her a mother superia'. % There was a young monk from Tibet And this is the damnedest one yet His cock was so long And incredibly strong That he buggered six Greeks en brochette. % There was a young monk in Siberia, Whose morals were very inferior, He jumped on a nun Which he shouldn't have done, And now she's a Mother Superior. % There was a young monk of Dundee Who complained that it hurt him to pee, He said, "Pax vobiscum, Now why won't the piss come? I'm afraid I've the c-l-a-p." % There was a young parson of Harwich, Tried to grind his betrothed in a carriage. She said, "No, you young goose, Just try self-abuse. And the other we'll try after marriage." % There was a young peasant named Gorse Who fell madly in love with his horse. Said his wife, "You rapscallion, That horse is a stallion -- This constitutes grounds for divorce." % There was a young person of Kent Who was famous wherever he went. All the way through a fuck, He would quack like a duck, And he crowed like a cock when he spent. % There was a young physicist named Fisk Whose lovemaking was rather brisk. So quick was his action, The Lorentz Contraction Shortened his rod to a disc !! % There was a young plumber named Lee Who was plumbing his girl by the sea. She said, "Stop your plumbing, There's somebody coming" Said the plumber, still plumbing, "It's me." % There was a young poet named Dan, Whose poetry never would scan. When told this was so, He said, "Yes, I know, It's because I try to put every possible syllable into that last line that I can." % There was a young royal marine, Who tried to fart "God Save the Queen". When he reached the soprano Out came only guano And his britches weren't fit to be seen. % There was a young sailor from Brighton, Who remarked to his girl, "You're a tight one." She replied, "'Pon my soul, You're in the wrong hole; There's plenty of room in the right one." % There was a young sapphic named Anna Who stuffed her friend's cunt with banana, Which she sucked, bit by bit, From her partner's warm slit, In the most approved lesbian manner. % There was a young Scot in Madrid Who got fifty-five fucks for a quid. When they said, "Are you faint?" He replied, "No, I ain't, But I don't feel as good as I did." % There was a young soldier from Munich Whose penis hung down past his tunic, And their chops girls would lick When they thought of his prick, But alas! he was only a eunuch. % There was a young sportsman named Peel Who went for a trip on his wheel; He pedalled for days Through crepuscular haze, And returned feeling somewhat unreal. -- Edward Gorey % There was a young squaw of Wohunt Who possessed a collapsible cunt. It had many odd uses, Produced no papooses, And fitted both giant and runt. % There was a young student from Yale Who was getting his first piece of tail. He shoved in his pole, But in the wrong hole, And a voice from beneath yelled: "No sale!" % There was a young trollop at Yale, Who had verses tattooed on her tail, And on her behind, For the sake of the blind, A duplicate version in Braille. % There was a young whore from Kaloo Who filled her vagina with glue. She said with a grin, "If they pay to get in, They can pay to get out again too!" % There was a young woman called Pearl Who quite resembled a churl; When she asked a young man named Tex Whether he would like to have sex, "Certainly," quoth he, "Who's the girl?" % There was a young woman from Bude, Who went for a swim in the nude, But a man in a punt, Grabbed at her elbow, And said "Hey, lady, you can't swim here, it's private property." % There was a young woman in Dee Who stayed with each man she did see. When it came to a test She wished to be best, And practice makes perfect, you see. % There was a young woman named Alice Who peed in a Catholic chalice. She said, "I do this From a great need to piss, And not from sectarian malice." % There was a young woman named Ells Who was subject to curious spells When got up very oddly, She'd cry out things ungodly by the palms in expensive hotels. -- Edward Gorey % There was a young woman named Florence Who for fucking professed an abhorrence, But they found her in bed With her cunt flaming red, And her poodle-dog spending in torrents. % There was a young woman named Plunnery Who rejoiced in the practice of gunnery. Till one day unobservant, She blew up a servant, And was forced to retire to a nunnery. -- Edward Gorey % There was a young woman named Sutton Who said, as she carved up the mutton, "My father preferred The last sheep in the herd -- This is one of his children I'm cuttin'." % There was a young woman of Cheadle, Who once gave the clap to a beadle. Said she, "Does it itch?" "It does, you damned bitch, And it burns like hell-fire when I peedle." % There was a young woman of Condover Whose husband had ceased to be fond of 'er. Her pussy was juicy, Her arse soft and goosey, But peroxide had now made a blonde of 'er. % There was a young woman of Croft Who played with herself in a loft, Having reasoned that candles Could never cause scandals, Besides which they did not go soft. Said another young woman of Croft, Amusing herself in the loft, "A salami or wurst Is what I'd choose first -- With bologna you know you've been boffed." % There was a young woman, quite handsome, Who got stuck in a sleeping room transom. When she offered much gold For release, she was told That the view was worth more than the ransom. % There was a young woman whose stammer Was atrocious, and so was her grammar; But they were not improved When her husband was moved To knock out her teeth with a hammer. -- Edward Gorey % There was an old abbess quite shocked To find nuns where the candles were locked. Said the abbess, "You nuns Should behave more like guns, And never go off till you're cocked." % There was an old bishop from Buckingham Who fell in love with some oysters while shucking 'em. His wife with distain Could scarcely restrain That sprightly old bishop from * * *. % There was an old count of Swoboda Who would not pay a whore what he owed her. So, with great savoir-faire, She stood on a chair And pissed in his whiskey-and-soda. % There was an old curate of Hestion Who'd errect at the slightest suggestion. But so small was his tool He could scarce screw a spool, And a cunt was quite out of the question. % There was an old fellow named Art Who awoke with a horrible start, For down by his rump Was a generous lump Of what should have been just a fart. % There was an old fellow named Skinner Whose prick, his wife said, had grown thinner. But still, by and large, It would always discharge Once he could just get it in her. % There was an old feminine blighter Who trained a Chow dog to delight her. She would cream her own pool While she sucked off his tool -- How his cock in her cunt would excite her! % There was an old gent from Kentuck Who boasted a filigreed schmuck, But he put it away For fear that one day He might put it in and get stuck. % There was an old girl of Kilkenny Whose usual charge was a penny. For half of that sum You could finger her bum-- A source of amusement to many. % There was an old harlot from Dijon Who in her old age got religion. "When I'm dead & gone," Said she, "I'll take on The Father, the Son, and the Pigeon." % There was an old hermit named Dave Who kept a dead whore in his cave. He said "I'll admit I'm a bit of a shit, But look at the money I save." % There was an old lady of Bingly Who wailed, "I do hate to sleep singly. I thought I had got A bloke for my twat, But he seems rather queenly than kingly." % There was an old lady of Glascow, Whose party proved quite a fiasco. At nine-thirty, about, The lights all went out, Through a lapse on the part of the Gas Co. % There was an old lady of Kewry Whose cunt was a `lusus naturae': The `introitus vaginae', Was unnaturally tiny, And the thought of it filled her with fury. % There was an old lady who lay With her legs wide apart in the hay, Then, calling the ploughman, She said, "Do it now, man! Don't wait till your hair has turned gray." % There was an old maid from Cape Cod Who thought all good things came from god. But it wasn't the almighty Who lifted her nighty, It was Roger, the lodger, by god. % There was an old man from Bengal Who liked to do tricks in the hall. His favorite trick Was to stand on his dick While he rolled around on one ball. % There was an old man from Duluth Whose cock was shot off in his youth. He fucked with his nose Or his fingers and toes And he came thru a hole in his tooth. % There was an old man from Fort Drum Whose son was incredibly dumb. When he urged him ahead, He went down instead, For he thought to succeed meant succumb. % There was an old man of Alsace Who played the trombone with his ass. He put in a trap To take out the crap, But the vapors corroded the brass. % There was an old man of Brienz The length of whose cock was immense: With one swerve he could plug A boy's bottom in Zug, And a kitchen-maid's cunt in Coblenz. % There was an old man of Cajon Who never could get a good bone. With the aid of a gland It grew simply grand; Now his wife cannot leave it alone. % There was an old man of Calcutta Who spied through a chink in the shutter. But all he could see Was his wife's bare knee, And the back of the bloke who was up her. % There was an old man of Connaught Whose prick was remarkably short. When he got into bed, The old woman said, "This isn't a prick, it's a wart." % There was an old man of Duddee Who came home as drunk as could be. He wound up the clock With the end of his cock, And buggered his wife with the key. % There was an old man of Duluth Whose cock was shot off in his youth. He fucked with his nose And with fingers and toes, And he came through a hole in his tooth. % There was an old man of Hong Kong Who never did anything wrong. He would lie on his back With his head in a sack And secretly finger his dong. % There was an old man of St. Bees, Who was stung in the arm by a wasp. When asked, "Does it hurt?" He relied, "No, it doesn't. I'm so glad that it wasn't a hornet." % There was an old man of St. Bees, Who was stung in the arm by a wasp. When asked, "Does it hurt?" He relied, "No, it doesn't. I'm so glad that it wasn't a hornet." -- W.S. Gilbert % There was an old man of Tagore Whose tool was a yard long or more, So he wore the damn thing In a surgical sling To keep it from wiping the floor. % There was an Old Man of the Mountain Who frigged himself into a fountain Fifteen times had he spent, Still he wasn't content, He simply got tired of the counting. % There was an old man of the port Whose prick was remarkably short. When he got into bed, The old woman said, "That isn't a prick; it's a wart!" % There was an old man of the port Whose prick was remarkably short. When he got into bed, The old woman said, "This isn't a prick; it's a wart!" % There was an old man of the port Whose prick was remarkably short. When he got into bed, The old woman said, "That isn't a prick; it's a wart!" % There was an old man who said, "Tush! My balls always hang in the brush, And I fumble about, Half in and half out, With a pecker as limber as mush." % There was an old man with a beard Who said, "It is just what I feared! Two owls and a hen, Four larks and a wren Have all built their nests in my beard!" % There was an old person of Ware Who had an affair with a bear. He explained, "I don't mind, For it's gentle and kind, But I wish it had slightly less hair." % There was an old pirate named Bates Who was learning to rhumba on skates He fell on his cutlass Which rendered him nutless And practically useless on dates. % There was an old satyr named Mack Whose prick had a left handed tack. If the ladies he loves Don't spin when he shoves, Their cervixes frequently crack. % There was an old Scot named McTavish Who attempted an anthropoid ravish. The object of rape Was the wrong sex of ape, And the anthropoid ravished McTavish. % There was an old whore from Silesia Who'd croke: "If my box doesn't please ya, For a slight extra sum You can go up my bum But watchout or my tapeworm'll seize ya." % There was an old whore in the Azores Whose body was covered with festers & sores. Why the dogs in the street Wouldn't eat the green meat That hung in festoons from her drawers. % There was an old woman of Ghent Who swore that her cunt had no scent. She got fucked so often At last she got rotten, And didn't she stink when she spent. % There was once a mechanic named Bench Whose best tool was a sturdy gut-wrench. With this vibrant device He could reach, in a trice, The innermost parts of a wench. % There was once a sad Maitre d'hotel Who said, "They can all go to hell! What they do to my wife-- Why it ruins my life; And the worst is, they all do it well. % There were three ladies of Huxham, And whenever we meets 'em we fucks 'em, And when that game grows stale We sits on a rail, And pulls out our pricks and they sucks 'em. % There were three young ladies of Birmingham, And this is the scandal concerning 'em. They lifted the frock And tickled the cock Of the Bishop engaged in confirming 'em. Now, the Bishop was nobody's fool, He'd been to a good public school, So he took down their britches And buggered those bitches With his ten-inch episcopal tool. Then up spoke a lady from Kew, And said, as the Bishop withdrew, "The vicar is quicker And thicker and slicker, And longer and stronger than you." -- Abuses of the Clergy % There's a charming young girl in Tobruk Who refers to her quiff as a nook. It's deep and it's wide, -- You can curl up inside With a nice easy chair and a book. % There's a charming young lady named Beaulieu Who's often been screwed by yours truly, But now--it's appallin'-- My balls always fall in! I fear that I've fucked her unduly. % There's a dowager near Sweden Landing Whose manners are odd and demanding. It's one of her jests To suck off her guests -- She hates to keep gentlemen standing. % There's a lovely young lady named Shittlecock Who loves to play diddle and fiddle-cock, But her cunt's got a pucker That's best not to fuck, or When least you expect it to, it'll lock. % There's a rather odd couple in Herts Who are cousins (or so each asserts); Their sex is in doubt For they're never without Their moustaches and long, trailing skirts. -- Edward Gorey % There's a sports-minded coed named Sue, Who's been coxing the varsity crew. In the shell Sue is great, But her boyfriend's irate, When she calls out the stroke as they screw. % There's a tavern in London that's staffed, By a barmaid who's tops at her craft: In her striving to please, She serves ale on her knees, So the patrons get head with their draft. % There's a very hot babe at the Aggies Who's to men what to bulls a red rag is. The seniors go round Hanging down to the ground, And one extra-large Soph has to drag his. % There's a vicar who's classed as nefarious, Since his shocking perversions are various... He will bugger some lad With a dildo (the cad!) While exulting, "My pleasure's vicarious!" % There's a young Yiddish slut with two cunts, Whose pleasure in life is to pruntz. When one pireg is shot, There's that alternate twat, But the ausgefuckt male merely grunts. % There's an oversexed lady named Whyte Who insists on a dozen a night. A fellow named Cheddar Had the brashness to wed her- His chance of survival is slight. % There's an unbroken babe from Toronto, Exceedingly hard to get onto, But when you get there, And have parted the hair, You can fuck her as much as you want to. % They had come in the fugue to the stretto When a dark, bearded man from a ghetto Slipped forward and grabbed Her tresses and stabbed Her to death with a rusty stiletto. -- Edward Gorey % Though his plan, when he gave her a buzz, Was to do what man normally does, She declared, "I'm a Soul- Not a sexual goal!" So he shrugged and called someone who was. % Though most of the crewmen are whites, Uhura has full equal rights. Her crewmates, you see, Love De-mo-cra-cy, And the way that she fills out her tights. % Though the invalid Saint of Brac Lay all of his life on his back, His wife got her share, And the pilgrims now stare At the scene, in his shrine, on a plaque. % 'Tis a custom in Castellamare To fuck in the back of a lorry. The chassis and springs Are like woodwinds and strings In the midst of a musical soiree. % To a weepy young woman in Thrums Her betrothed remarked, "This is what comes Of allowing your tears To fall into my ears - I think they have rotted the drums." -- Edward Gorey % To bear offspring, Noah's snakes were unable. Their fertility was somewhat unstable. He constructed a bed Out of tree trunks and said, "Even adders can multiply on a log table." % To his bride a young bridegroom said, "Pish! Your cunt is as big as a dish!" She replied, "Why, you fool, With your limp little tool It's like driving a nail with a fish!" % To his bride said a numskull named Clarence : "I trust you will show some forbearance. My sexual habits I picked up from rabbits, And occasionally watching my parents." % To his bride said economist Fife : "The semen you'll launch as my wife, We will salvage and freeze To resemble goat's cheese, And slice for hors d'oeuvres with a knife." % To his bride said the keen-eyed detective, "Can it be that my eyesight's defective? Has the east tit the least bit The best of the west tit, Or is it the faulty perspective?" % To his bride, said the sharp eyed detective, "Can it be that my eyesight's defective? Is your east tit the least bit The best of your west tit, Or is it a trick of perspective?" % To his clubfooted child said Lord Stipple, As he poured his post-prandial tipple, "Your mother's behaviour Gave pain to Our Saviour, And that's why He made you a cripple." -- Edward Gorey % Two anglers were fishing off Wight And his bobber was dipping all night. Murmured she, with a laugh, "It's ready to gaff, But don't break your rod which is light." A couple was fishing near Clombe When the maid began looking quite glum, And said, "Bother the fish! I'd rather coish!" Which they did -- which was why they had come. As two consular clerks in Madras Fished, hidden in deep shore-grass, "What a marvelous pole," Said she, "but control Your sinkers -- they're banging my ass." % Two eager young men from Cawnpore Once buggared and fucked the same whore. But her partition split And the blood and the shit Rolled out in a mess on the floor. % Two roosters in one of our pens Found their pricks were no larger than wens. As they looked at their foreskins And wished they had more skins, They discovered they'd both become hens. % Under the spreading chestnut tree The village smith he sat, Amusing himself By abusing himself And catching the load in his hat. % Une joile epousetta a Tours Voulait de gig-gig tous le jours. Mais le mari disait, "Non! De trop n'est pas bon! Mon derriere exige du secours!" % Visas erat: huic geminarum Dispar modus testicularum: Minor haec nihili, Palma triplici, Jam fecerat altera clarum. % We dedicate this to the cunt, The kind the broad-minded guys hunt : All hail to the twat, Willing, thrilling, and hot, That wears peckers down, limp and blunt! % When I was a baby, my penis Was as white as the buttocks of Venus. But now 'this as red As her nipples instead-- All because of the feminie genus! % When they asked a pert baggage name Alice, Who'd been bedded and banged in the palace, "Was he modest or vain?" "Was he regal or plain?" She replied, "He's a jolly good phallus!" % When you fuck little Annie in Anza You get a great bossom bonanza: Sucking Annie's soft tits Makes her throw fifty fits, And the fuck is a sextravaganza! % While his duchess lay practically dead, The Duke of Daguerrodargue said: "Can it be this is all? How puny! How small! Have destroyed this disgrace to my bed." -- Edward Gorey % While I, with my usual enthusiasm, Was exploring in Ermintrude's busiasm, She explained, "They are flat, But think nothing of that -- You will find that my sweet sister Susiasm." % While out on a date in his Fiat, The man exclaimed "Where's my key at?" As he bent down to seek, She let out a shriek: "That's not where it's likely to be at." % While spending the winter at Pau Lady Pamela forgot to say "No." So the head-porter made her And the second-cook laid her; The waiters were all hanging low. % While Titian was mixing rose madder, His model reclined on a ladder. Her position to Titian Suggested coition, So he leapt up the ladder and had 'er. % While travelling in farthest Tibet, Lord Irongate found cause to regret The buttered-up tea, A pain in his knee, And the frivolous tourists he met. -- Edward Gorey % Winter is here with his grouch, The time when you sneeze and you slouch. You can't take your women Canoein' or swimmin', But a lot can be done on a couch. % With his penis in turgid erection, And aimed at woman's mid-section, Man looks most uncouth In that Moment of Truth, But she sheathes it with loving affection. % You Women's Lib gals won't agree, But dependent on men you must be: You'll need a him With a rod firm and trim, To puggle your water-drains free! % Young Frederick the great was a beaut. To a guard he cried, "Hey, man, you're cute. If you'll come to my palace, I'll finger your phallus, And then I shall blow on your flute." % You've heard of the bishop of Birmingham, Well, here's the new story concerning 'im : He buggers the choir As they sing "Ave Maria," And fucks all the girls whilst confirming 'em. % fortunate-3.1/datfiles/limerick.dat0000644000175000017500000000662006742522414020262 0ustar gurkangurkan00000000000000]B%\Óè9™œ3˛Ò÷ëóΩõx×®ò}p©«àd²øyÞsF1fMIê\µ–|ŸCWoŠŠ€^<þiÓ‹ÊÈw"ö&ÀKÐÄVÆ /ÊŒnwn §SÉ.*U3G’ԉµ‰Yø-ê]r@8‰í ÎnM2¡›/2{…üV­þKÚ!â÷a°Š.QL1 )!FãÖ yT s:ŒŠý yÚÁ}Þ]h –±mß( ­RLÔ qœ`ÎËå’+SúdìƒÞ'”NÙ‡Í5vJÖšŸ³çDAZÌùã€áðvzЕe Ÿ£™üØæ)±{ZW€ÀBLSo͍ëu[ü)V™G$ãbÞÌVp:ÊkýŒŽY‹û²ªsÈ.òƒ¿&Å¡°_ÝÁœhõõB·išª×›óÎ:  Ä²Žˆ€aÑi0u¯:î 6 ‘DÝЩìªXJ`!&m˜…x?1]ñ Opz*§øéÓñ$06Ìݱ¢Íi.9Fɵˆw®”1þ ®qBŒé c° 62NÍùÒ©og3’ q\‘‹hšï9˜}=)ŽÀæ\›)ø|^ó€•ù®TÇÝeÿ£†šº‘¿ÞR·ô̓ë€,À[eÚÄœE2Ä;hBP.`ˆ’Ó±ùœçÿŽxÊVØ8ß+æ>kÂ]¥…r‹€j/+ÀâqšP"ß„à’p  ‚ÇFxH!~ƒE™³ï Ь”ÌP0v`·J‡ ?Aå}c…È÷U;d—WVcž³-EÎØ WÓSØ>Ü» “jQ}‚ŸbgŽÕŒ¹åè2™+PÎ!a$ö¢Á{€„{äpþáaÐcq~ ®ßáíQ­ŸkµHê>{y 7+£•êfðÌ/(Ø*ìM¬ÚhåÑÑRUyþ7«ÞÁ!ÇåA­ô(_ð?œ#Tgë¹,Åná²(©S—Ʋw›áÍw—!¯/Œš•:2;¿ߪ R%Ûaüì6qŽ |]ÏlS[kq.ŒÃ_ÂõÅÛÑóëw˜£ Ž“ØâYºAz*&a³%wžª€ é,xŠYHK4Ä„²%ˆ¢@àJŒ`æñG‰Ke¢\ò¶w^ºÎçJ7/«û©ïɹ×õK³ø™¡ÄðaXÝ,A€6Ÿ“+¶×g@vôêäæ†ì §Z›Œ‰ÿwRÌdQãj2NùPFÎ5<»&•%ÚiŒëH­E8²xM‰µžœ=R»1…\蔍̂ŸtsF‚ØÝ:Ë+ÿ¿§3Ý£ҕg—Žl Ðu¹YTÇÝôÁ¶-Ý>ßj×Wš€ççà™ë [Kãª]ä•㪢[6ÊvYˆnÏ}oª–d $*@ÓT–7gBžÐ.žu 8ܑ³ÃGkjvÇG"¡-­¯Ô·ÍZ)"3”Gº*§”µuÂKÂ& ÷=ç/üýl°~s8Ûn4} ãNíž ‹›Êÿ7»$ pßÝڏ Ìî±4òÜR ž IRƒmÀ€áÉÒ$·Ä@Qœ%KŒ2íëJŸLÔù‡U>QiÖiº‚bA…ö’Ã;ƋEÚ=K›È÷E“«7£ŸU s<ûŠµ—8€I’UºùŸO•[êm՝3µ&fn÷_Y€€'õùµÍ‹9ò„©IÝÛy€Ã­tc/ùö¡06Œ <¡8g[`ÎþÞ)KƒÓÂ2_/Ìâ™HÉĹESٚÓ0|Ãr¬xñ§á/ìsPÊ<U21ymí§ö†¡¥üŒ†ˆÔ,.C/ +ç°Ò"Q…V)9zÅEŠSÿ]4—ñúx»ÆÞ…”í«?‡(¥ŽcaÏ!³lbÑxÙ \Ë»œªÕ3íÂÊÅ﹞ Š#ƒnÐîYþC'jމ W$ õ[lŽYDàýÝAX­·z#D–€¿9Ÿá0Õ?°Ï?òDZÍØ÷ÛûƪœùŒÒm „~”‚ßTܳ>ê='<—üH âWp1œëŸ(8Èz€L- ÄXM é(0Ï-Ÿ;&"§òÔb*¿‘b– ŠÅeU>=~|ñÒÂ¥]P¿M]C˜j? Ûõ$ÌääsÜœë³'džuõüÄÊ3|