source: trunk/BFCodeTools.pas

Last change on this file was 145, checked in by chronos, 11 months ago
  • Modified: Remove U prefix from unit names.
  • Modified: Updated Common package.
File size: 2.6 KB
Line 
1unit BFCodeTools;
2
3interface
4
5uses
6 Classes, SysUtils, StrUtils, Math;
7
8function GenerateNumber(Number: Integer): string;
9function GenerateNumberSimple(Number: Integer): string;
10function GenerateText(Text: string): string;
11function FormatCode(Text: string): string;
12function ShrinkCode(Text: string): string;
13
14
15implementation
16
17function GenerateNumber(Number: Integer): string;
18var
19 Base: Integer;
20 Multiplier: Integer;
21 Remainder: Integer;
22const
23 Overhead = 7;
24begin
25 Result := '';
26 Base := Trunc(Sqrt(Number));
27 Remainder := Number;
28 if Base > 1 then begin
29 Multiplier := Trunc(Remainder / Base);
30 Result := Result + '>' + GenerateNumberSimple(Base) + '[<' +
31 GenerateNumberSimple(Multiplier) + '>-]<';
32 Remainder := Remainder - Base * Multiplier;
33 end;
34 Result := Result + GenerateNumberSimple(Remainder);
35 if Length(Result) > Number then
36 Result := GenerateNumberSimple(Number);
37end;
38
39function GenerateNumberSimple(Number: Integer): string;
40begin
41 Result := DupeString('+', Number);
42end;
43
44function GenerateText(Text: string): string;
45var
46 I: Integer;
47 MinValue: Integer;
48begin
49 Result := '';
50
51 if Length(Text) > 1 then begin
52 MinValue := MaxInt;
53 for I := 1 to Length(Text) do
54 MinValue := Min(MinValue, Ord(Text[I]));
55
56 if MinValue > 1 then
57 Result := DupeString('>', Length(Text)) + GenerateNumber(MinValue) +
58 '[' + DupeString('<+', Length(Text)) + DupeString('>', Length(Text)) + '-]';
59 Result := Result + DupeString('<', Length(Text));
60 end;
61
62 for I := 1 to Length(Text) do begin
63 Result := Result + GenerateNumberSimple(Ord(Text[I]) - MinValue) + '>';
64 end;
65end;
66
67function FormatCode(Text: string): string;
68var
69 IndentLevel: Integer;
70 I: Integer;
71const
72 IndentText = ' ';
73begin
74 Result := '';
75 IndentLevel := 0;
76 for I := 1 to Length(Text) do begin
77 if Text[I] = '[' then begin
78 Result := Result + LineEnding + DupeString(IndentText, IndentLevel) +
79 Text[I] + LineEnding ;
80 Inc(IndentLevel);
81 Result := Result + DupeString(IndentText, IndentLevel);
82 end
83 else if Text[I] = ']' then begin
84 Dec(IndentLevel);
85 Result := Result + LineEnding + DupeString(IndentText, IndentLevel) +
86 Text[I] + LineEnding + DupeString(IndentText, IndentLevel);
87 end
88 else if Text[I] > ' ' then
89 Result := Result + Text[I];
90 end;
91end;
92
93// Remove all non-printable characters
94function ShrinkCode(Text: string): string;
95var
96 Pos: Integer;
97 I: Integer;
98begin
99 Pos := 1;
100 for I := 1 to Length(Text) do begin
101 if Text[I] > ' ' then begin
102 Text[Pos] := Text[I];
103 Inc(Pos);
104 end;
105 end;
106 SetLength(Text, Pos - 1);
107 Result := Text;
108end;
109
110end.
111
Note: See TracBrowser for help on using the repository browser.