6 SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
7 Forms, Dialogs, StdCtrls, Menus, ExtCtrls, Spin, Clipbrd;
11 ElementArraySize = 2000;
15 TNameGenerator = class(TForm)
16 ForenameOpenDialog: TOpenDialog;
17 SurnameOpenDialog: TOpenDialog;
20 ForenameButton: TButton;
21 SurnameButton: TButton;
22 GenerateButton: TButton;
36 ForenameOnly: TRadioButton;
37 ForenameAndSurname: TRadioButton;
38 SaveDialog: TSaveDialog;
40 ListFileButton: TButton;
42 MassGenNumber: TSpinEdit;
43 MassGenButton: TButton;
46 Massgenerate1: TMenuItem;
47 EnhancedNADJ: TCheckBox;
48 EnhancedNounCreation1: TMenuItem;
50 procedure FormCreate(Sender: TObject);
51 procedure FormDestroy(Sender: TObject);
52 procedure ForenameButtonClick(Sender: TObject);
53 procedure CloseClick(Sender: TObject);
54 procedure Exit1Click(Sender: TObject);
55 procedure Forename1Click(Sender: TObject);
56 procedure SurnameButtonClick(Sender: TObject);
57 procedure Surname1Click(Sender: TObject);
58 procedure ListFileButtonClick(Sender: TObject);
59 procedure ListTo1Click(Sender: TObject);
60 procedure ForenameAndSurnameClick(Sender: TObject);
61 procedure SaveButtonClick(Sender: TObject);
62 procedure Save1Click(Sender: TObject);
63 procedure GenerateButtonClick(Sender: TObject);
64 procedure CopyButtonClick(Sender: TObject);
65 procedure Generate1Click(Sender: TObject);
66 procedure Copy1Click(Sender: TObject);
67 procedure MassGenButtonClick(Sender: TObject);
68 procedure Massgenerate1Click(Sender: TObject);
69 procedure LoadForenameFile;
70 procedure LoadSurnameFile;
71 procedure MakeListFile;
72 procedure SaveSelection;
73 procedure GenerateNames;
74 procedure CopySelection;
75 procedure MassGenerate;
76 procedure ForenameOnlyClick(Sender: TObject);
77 procedure EnhancedNounCreation1Click(Sender: TObject);
78 procedure EnhancedNADJClick(Sender: TObject);
80 { Private declarations }
82 { Public declarations }
85 TElement = string[ElementSize];
86 TElementArray = array [1..ElementArraySize] of TElement;
87 PElementArray = ^TElementArray;
89 function MyReadLn(FileHandle : integer; var ThisElement : string) : boolean;
90 function MakeName : string;
91 function MakeNameString(NPre, NAMid, ASuf : PElementArray; NPreNo, NAMidNO, ASufNo : integer; IsNADJ : boolean) : string;
92 function Capitalise(Item : string) : string;
93 function Plural(Item : string) : string;
94 function Number(Item : string) : string;
95 function NNName(Part1, Part2 : string) : string;
96 function NAName(Noun, Adj : string) : string;
99 NameGenerator : TNameGenerator;
101 ForenameLoaded, SurnameLoaded, ListLoaded,
102 ForenameNADJ, SurnameNADJ : boolean;
104 ForenameNPre, ForenameNAMid, ForenameASuf,
105 SurnameNPre, SurnameNAMid, SurnameASuf : PElementArray;
107 ForenameNPreNo, ForenameNAMidNo, ForenameASufNo,
108 SurnameNPreNo, SurnameNAMidNo, SurnameASufNo : integer;
115 procedure TNameGenerator.FormCreate(Sender: TObject);
117 ForenameLoaded := FALSE;
118 SurnameLoaded := FALSE;
119 ForenameNPre := AllocMem(SizeOf(TElementArray));
120 ForenameNAMid := AllocMem(SizeOf(TElementArray));
121 ForenameASuf := AllocMem(SizeOf(TElementArray));
122 SurnameNPre := AllocMem(SizeOf(TElementArray));
123 SurnameNAMid := AllocMem(SizeOf(TElementArray));
124 SurnameASuf := AllocMem(SizeOf(TElementArray));
126 ForenameNAMidNo := 0;
133 procedure TNameGenerator.FormDestroy(Sender: TObject);
135 FreeMem(ForenameNPre, SizeOf(TElementArray));
136 FreeMem(ForenameNAMid, SizeOf(TElementArray));
137 FreeMem(ForenameASuf, SizeOf(TElementArray));
138 FreeMem(SurnameNPre, SizeOf(TElementArray));
139 FreeMem(SurnameNAMid, SizeOf(TElementArray));
140 FreeMem(SurnameASuf, SizeOf(TElementArray));
143 procedure TNameGenerator.ForenameButtonClick(Sender: TObject);
148 procedure TNameGenerator.Forename1Click(Sender: TObject);
153 procedure TNameGenerator.SurnameButtonClick(Sender: TObject);
158 procedure TNameGenerator.Surname1Click(Sender: TObject);
163 procedure TNameGenerator.ListFileButtonClick(Sender: TObject);
168 procedure TNameGenerator.ListTo1Click(Sender: TObject);
173 procedure TNameGenerator.SaveButtonClick(Sender: TObject);
178 procedure TNameGenerator.Save1Click(Sender: TObject);
183 procedure TNameGenerator.GenerateButtonClick(Sender: TObject);
188 procedure TNameGenerator.Generate1Click(Sender: TObject);
193 procedure TNameGenerator.CopyButtonClick(Sender: TObject);
198 procedure TNameGenerator.Copy1Click(Sender: TObject);
203 procedure TNameGenerator.MassGenButtonClick(Sender: TObject);
208 procedure TNameGenerator.Massgenerate1Click(Sender: TObject);
213 procedure TNameGenerator.CloseClick(Sender: TObject);
218 procedure TNameGenerator.Exit1Click(Sender: TObject);
223 procedure TNameGenerator.ForenameOnlyClick(Sender: TObject);
225 if ForenameLoaded then
227 GenerateButton.Enabled := TRUE;
228 Generate1.Enabled := TRUE;
229 CopyButton.Enabled := TRUE;
230 Copy1.Enabled := TRUE;
233 MassGenButton.Enabled := TRUE;
234 Massgenerate1.Enabled := TRUE;
239 procedure TNameGenerator.ForenameAndSurnameClick(Sender: TObject);
241 if not SurnameLoaded then
243 GenerateButton.Enabled := FALSE;
244 Generate1.Enabled := FALSE;
245 CopyButton.Enabled := FALSE;
246 Copy1.Enabled := FALSE;
247 MassGenButton.Enabled := FALSE;
248 Massgenerate1.Enabled := FALSE;
252 procedure TNameGenerator.LoadForenameFile;
255 TSection = (None, NPre, NAMid, ASuf);
258 ForenameFileH : integer;
261 FileLoadError, FileTypeSet, Finished : boolean;
264 ForenameOpenDialog.Execute;
265 FileLoadError := TRUE;
266 if FileExists(ForenameOpenDialog.FileName) then
269 ForenameNAMidNo := 0;
271 ForenameFileH := FileOpen(ForenameOpenDialog.FileName, fmOpenRead or fmShareDenyWrite);
272 FileLoadError := FALSE;
273 FileTypeSet := FALSE;
276 while (not Finished) and MyReadLn(ForenameFileH, Element) do {!!! SIDE EFFECT !!!}
278 if (Length(Element) > 1) and (Element[1] = '#') then
282 if (Element = '#PRE') and (not ForenameNADJ) then
284 else if (Element = '#MID') and (not ForenameNADJ) then
286 else if (Element = '#SUF') and (not ForenameNADJ) then
288 else if (Element = '#NOUN') and ForenameNADJ then
290 else if (Element = '#NADJ') and ForenameNADJ then
292 else if (Element = '#ADJ') and ForenameNADJ then
294 else if Element = '#END' then
299 FileLoadError := TRUE;
301 end {if filetype set}
304 if Element = '#PRE' then
308 ForenameNADJ := FALSE;
310 else if Element = '#MID' then
314 ForenameNADJ := FALSE;
316 else if Element = '#SUF' then
320 ForenameNADJ := FALSE;
322 else if Element = '#NOUN' then
326 ForenameNADJ := TRUE;
328 else if Element = '#NADJ' then
332 ForenameNADJ := TRUE;
334 else if Element = '#ADJ' then
338 ForenameNADJ := TRUE;
340 else if Element = '#END' then
345 FileLoadError := TRUE;
347 end; {else filetype not set}
348 end {if Control code}
349 else if FileTypeSet then
355 ForenameNPre^[ForenameNPreNo] := Element;
359 inc(ForenameNAMidNo);
360 ForenameNAMid^[ForenameNAMidNo] := Element;
365 ForenameASuf^[ForenameASufNo] := Element;
370 if FileLoadError then
372 Application.MessageBox('Error in file', 'Namegen', MB_OK + MB_ICONEXCLAMATION);
373 ForenameLoaded := FALSE;
374 Forename.Caption := '';
375 GenerateButton.Enabled := FALSE;
376 Generate1.Enabled := FALSE;
377 CopyButton.Enabled := FALSE;
378 Copy1.Enabled := FALSE;
381 SaveButton.Enabled := TRUE;
382 Save1.Enabled := TRUE;
383 MassGenButton.Enabled := FALSE;
384 Massgenerate1.Enabled := FALSE;
389 ForenameLoaded := TRUE;
390 Forename.Caption := LowerCase(ExtractFileName(ForenameOpenDialog.Filename));
391 if ForenameOnly.Checked or
392 (ForenameAndSurname.Checked and SurnameLoaded) then
394 GenerateButton.Enabled := TRUE;
395 Generate1.Enabled := TRUE;
396 CopyButton.Enabled := TRUE;
397 Copy1.Enabled := TRUE;
400 SaveButton.Enabled := TRUE;
401 Save1.Enabled := TRUE;
402 MassGenButton.Enabled := TRUE;
403 Massgenerate1.Enabled := TRUE;
407 FileClose(ForenameFileH);
410 Application.MessageBox('File does not exist', 'Namegen', MB_OK + MB_ICONEXCLAMATION);
413 procedure TNameGenerator.LoadSurnameFile;
416 TSection = (None, NPre, NAMid, ASuf);
419 SurnameFileH : integer;
422 FileLoadError, FileTypeSet, Finished : boolean;
425 SurnameOpenDialog.Execute;
426 FileLoadError := TRUE;
427 if FileExists(SurnameOpenDialog.FileName) then
432 SurnameFileH := FileOpen(SurnameOpenDialog.FileName, fmOpenRead or fmShareDenyWrite);
433 FileLoadError := FALSE;
434 FileTypeSet := FALSE;
437 while (not Finished) and MyReadLn(SurnameFileH, Element) do {!!! SIDE EFFECT !!!}
439 if (Length(Element) > 1) and (Element[1] = '#') then
443 if (Element = '#PRE') and (not SurnameNADJ) then
445 else if (Element = '#MID') and (not SurnameNADJ) then
447 else if (Element = '#SUF') and (not SurnameNADJ) then
449 else if (Element = '#NOUN') and SurnameNADJ then
451 else if (Element = '#NADJ') and SurnameNADJ then
453 else if (Element = '#ADJ') and SurnameNADJ then
455 else if Element = '#END' then
460 FileLoadError := TRUE;
462 end {if filetype set}
465 if Element = '#PRE' then
469 SurnameNADJ := FALSE;
471 else if Element = '#MID' then
475 SurnameNADJ := FALSE;
477 else if Element = '#SUF' then
481 SurnameNADJ := FALSE;
483 else if Element = '#NOUN' then
489 else if Element = '#NADJ' then
495 else if Element = '#ADJ' then
501 else if Element = '#END' then
506 FileLoadError := TRUE;
508 end {else filetype not set}
509 end {if Control code}
510 else if FileTypeSet then
516 SurnameNPre^[SurnameNPreNo] := Element;
521 SurnameNAMid^[SurnameNAMidNo] := Element;
526 SurnameASuf^[SurnameASufNo] := Element;
531 if FileLoadError then
533 Application.MessageBox('Error in file', 'Namegen', MB_OK + MB_ICONEXCLAMATION);
534 SurnameLoaded := FALSE;
535 Surname.Caption := '';
536 ForenameAndSurname.Enabled := FALSE;
537 if ForenameAndSurname.Checked then
539 GenerateButton.Enabled := FALSE;
540 Generate1.Enabled := FALSE;
541 CopyButton.Enabled := FALSE;
542 Copy1.Enabled := TRUE;
545 SaveButton.Enabled := TRUE;
546 Save1.Enabled := TRUE;
547 MassGenButton.Enabled := FALSE;
548 Massgenerate1.Enabled := FALSE;
554 SurnameLoaded := TRUE;
555 Surname.Caption := LowerCase(ExtractFileName(SurnameOpenDialog.Filename));
556 ForenameAndSurname.Enabled := TRUE;
557 ForenameAndSurname.Checked := TRUE;
558 if ForenameLoaded then
560 GenerateButton.Enabled := TRUE;
561 Generate1.Enabled := TRUE;
562 CopyButton.Enabled := TRUE;
563 Copy1.Enabled := TRUE;
566 SaveButton.Enabled := TRUE;
567 Save1.Enabled := TRUE;
568 MassGenButton.Enabled := TRUE;
569 Massgenerate1.Enabled := TRUE;
573 FileClose(SurnameFileH);
576 Application.MessageBox('File does not exist', 'Namegen', MB_OK + MB_ICONEXCLAMATION);
580 procedure TNameGenerator.MakeListFile;
583 ListFile.Caption := Lowercase(ExtractFileName(SaveDialog.FileName));
584 if GenerateButton.Enabled then
586 SaveButton.Enabled := TRUE;
587 Save1.Enabled := TRUE;
588 MassGenButton.Enabled := TRUE;
589 Massgenerate1.Enabled := TRUE;
594 procedure TNameGenerator.GenerateNames;
602 for i := 1 to ListLines do
604 NameList.Items.Add(MakeName);
609 procedure TNameGenerator.CopySelection;
613 ItemString, TempString : PChar;
616 if NameList.ItemIndex <> 0 then
620 ItemString := StrAlloc(258 * ListLines);
621 StrPCopy(ItemString, '');
622 TempString := StrAlloc(258);
623 for i := 0 to ListLines - 1 do
625 if NameList.Selected[i] then
627 StrPCopy(TempString,(NameList.Items[i] + #13 + #10));
628 StrCat(ItemString, TempString);
631 Clipboard.SetTextBuf(ItemString);
632 StrDispose(TempString);
633 StrDispose(ItemString);
639 procedure TNameGenerator.SaveSelection;
642 OutputFile : TextFile;
646 AssignFile(OutputFile, ExtractFileName(SaveDialog.FileName));
647 if FileExists(ExtractFileName(SaveDialog.FileName)) then
651 for i := 0 to ListLines - 1 do
653 if NameList.Selected[i] then
655 WriteLn(OutputFile, NameList.Items[i]);
658 CloseFile(OutputFile);
662 procedure TNameGenerator.MassGenerate;
665 OutputFile : TextFile;
670 AssignFile(OutputFile, ExtractFileName(SaveDialog.FileName));
671 if FileExists(ExtractFileName(SaveDialog.FileName)) then
675 for i := 1 to MassGenNumber.Value do
677 WriteLn(OutputFile, MakeName);
679 CloseFile(OutputFile);
683 function MyReadLn(FileHandle : integer; var ThisElement : string) : boolean;
687 ReadResult : longint;
692 ReadResult := FileRead(FileHandle, Eric, 1);
694 while (ReadResult = 1) and (Ord(Eric) <> 10) and (i <= High(ThisElement)) do
696 if (Ord(Eric) <> 10) and (Ord(Eric) <> 13) then
698 ThisElement := ThisElement + Eric;
701 ReadResult := FileRead(FileHandle, Eric, 1);
703 if ReadResult = 1 then
710 function MakeName : string;
716 TempString := MakeNameString(ForenameNPre, ForenameNAMid, ForenameASuf,
717 ForenameNPreNo, ForenameNAMidNo, ForenameASufNo, ForenameNADJ);
718 if NameGenerator.ForenameAndSurname.Checked and SurnameLoaded then
719 TempString := TempString + ' ' + MakeNameString(SurnameNPre, SurnameNAMid, SurnameASuf,
720 SurnameNPreNo, SurnameNAMidNo, SurnameASufNo, SurnameNADJ);
721 MakeName := TempString;
725 function MakeNameString(NPre, NAMid, ASuf : PElementArray; NPreNo, NAMidNo, ASufNo : integer; IsNADJ : boolean) : string;
728 Part1, Part2, Part3, Combined : string;
729 NounSelectionArray : array[1..5] of char;
735 { Application.MessageBox('NADJ generation not yet implemented', 'Name generator', 0);}
740 NounSelectionArray[NSANo] := 'N'; {noun noun}
745 NounSelectionArray[NSANo] := 'X'; {nadj nadj}
747 if (NPreNo > 0) and (ASufNo > 0) then
750 NounSelectionArray[NSANo] := 'A'; {noun adj}
752 if (NPreNo > 0) and (NAMidNo > 0) then
755 NounSelectionArray[NSANo] := 'Y'; {noun nadj}
757 if (NAMidNo > 0) and (ASufNo > 0) then
760 NounSelectionArray[NSANo] := 'Z'; {nadj adj}
762 case NounSelectionArray[Random(NSANo) + 1] of
764 Part1 := NPre^[Random(NPreNo) + 1];
765 Part2 := NPre^[Random(NPreNo) + 1];
766 Combined := NNName(Part1, Part2);
769 Part1 := NAMid^[Random(NAMidNo) + 1];
770 Part2 := NAMid^[Random(NAMidNo) + 1];
771 Combined := NNName(Part1, Part2);
774 Part1 := NPre^[Random(NPreNo) + 1];
775 Part2 := ASuf^[Random(ASufNo) + 1];
776 Combined := NAName(Part1, Part2);
779 Part1 := NPre^[Random(NPreNo) + 1];
780 if Random(2) = 0 then
781 Part2 := NAMid^[Random(NAMidNo) + 1]
783 Part2 := ASuf^[Random(ASufNo) + 1];
784 Combined := NAName(Part1, Part2);
787 if Random(2) = 0 then
788 Part1 := NAMid^[Random(NAMidNo) + 1]
790 Part1 := NPre^[Random(NPreNo) + 1];
791 Part2 := ASuf^[Random(ASufNo) + 1];
792 Combined := NAName(Part1, Part2);
799 Part1 := NPre^[Random(NPreNo) + 1]
803 Part2 := NAMid^[Random(NAMidNo)+1]
807 Part3 := ASuf^[Random(ASufNo)+1]
810 { Combined := Part1 + Part2 + Part3;
812 Combined := Capitalise(Part1); }
813 Combined := Capitalise(Part1 + Part2 + Part3);
815 MakeNameString := Combined;
819 function Capitalise(Item :string) : string;
822 if (Item[1] >= 'a') and (Item[1] <= 'z') then
823 Item[1] := Chr(Ord(Item[1]) + Ord('A') - Ord('a'))
824 else if (Item[1] >= 'à') and (Item[1] <= 'þ') then
825 Item[1] := Chr(Ord(Item[1]) + Ord('Þ') - Ord('þ'));
830 function Plural(Item : string) : string;
837 'a', 'e', 'i', 'o', 'u' :
838 Plural := Item + 's';
841 'a', 'e', 'i', 'o', 'u' :
842 Plural := Item + 's';
844 Plural := Copy(Item, 1, i-1) + 'ies';
847 if Item[i-1] = 's' then
848 Plural := Item + 'es'
853 't', 's', 'c', 'r', 'z' :
854 Plural := Item + 'es';
856 Plural := Item + 's';
859 if Copy(Item, i-3, 3) = 'aff' then
860 Plural := Copy(Item, 1, i-3) + 'aves'
861 else if Copy(Item, i-3, 3) = 'arf' then
862 Plural := Copy(Item, 1, i-3) + 'arves'
863 else if Copy(Item, i-3, 3) = 'elf' then
864 Plural := Copy(Item, 1, i-3) + 'elves'
866 Plural := Item + 's';
867 'c', 'j', 'x', 'v', 'z' :
870 Plural := Item + 's';
875 function Number(Item : string) : string;
878 0 : Number := 'No ' + Plural(Item);
879 1 : Number := 'One ' + Item;
880 2 : Number := 'Two ' + Plural(Item);
881 3 : Number := 'Three ' + Plural(Item);
882 4 : Number := 'Four ' + Plural(Item);
883 5 : Number := 'Five ' + Plural(Item);
884 6 : Number := 'Six ' + Plural(Item);
885 7 : Number := 'Seven ' + Plural(Item);
886 8 : Number := 'Eight ' + Plural(Item);
887 9 : Number := 'Nine ' + Plural(Item);
888 10 : Number := 'Ten ' + Plural(Item);
889 11 : Number := 'Eleven ' + Plural(Item);
890 12 : Number := 'Twelve ' + Plural(Item);
892 13 : Number := 'Hundred ' + Plural(Item);
893 14 : Number := 'Lone ' + Item;
894 15 : Number := 'Many ' + Plural(Item);
895 16 : Number := 'Few ' + Plural(Item);
900 function NNName(Part1, Part2 : string) : string;
906 if NameGenerator.EnhancedNADJ.Checked then
911 { 0 : NNName := Capitalise(Part1 + Part2);}
912 0 : NNName := Capitalise(Part1 + 's' + Part2);
914 if Random(2) = 0 then
915 NNName := Capitalise(Plural(Part1)) + ' of ' + Capitalise(Part2)
917 NNName := Capitalise(Part1) + ' of ' + Capitalise(Plural(Part2));
921 0 : NNName := Capitalise(Plural(Part1)) + ' of the ' + Capitalise(Part2);
922 1 : NNName := Capitalise(Part1) + ' of the ' + Capitalise(Plural(Part2));
923 2 : NNName := Capitalise(Plural(Part1)) + ' of the ' + Capitalise(Plural(Part2));
926 3 : NNName := Number(Capitalise(Part1));
931 function NAName(Noun, Adj : string) : string;
938 if NameGenerator.EnhancedNADJ.Checked then
943 0 : NAName := Capitalise(Adj + Noun);
944 1 : NAName := Capitalise(Adj) + ' ' + Capitalise(Noun);
946 Temp := Capitalise(Adj) + ' ' + Capitalise(Noun);
947 NAName := Number(Temp);
952 procedure TNameGenerator.EnhancedNounCreation1Click(Sender: TObject);
954 if EnhancedNounCreation1.Checked then
956 EnhancedNounCreation1.Checked := FALSE;
957 EnhancedNADJ.Checked := FALSE;
961 EnhancedNounCreation1.Checked := TRUE;
962 EnhancedNADJ.Checked := TRUE;
966 procedure TNameGenerator.EnhancedNADJClick(Sender: TObject);
968 if EnhancedNADJ.Checked then
970 EnhancedNounCreation1.Checked := TRUE;
974 EnhancedNounCreation1.Checked := FALSE;