summaryrefslogtreecommitdiff
path: root/src/nvUtilities.pas
blob: 7b57cfa3d2e9aa90675cca9effb8d69785b92e69 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
unit nvUtilities;

{$mode objfpc}{$H+}

// disable to remove debugging output
{.$Define DEBUG}

interface

uses
  Classes, SysUtils, fpg_base;

const
 { TODO -oGraeme : Should this change to LineEnding (platfrom dependant) }
  EndLine= chr(13)+chr(10);
  TwoEndLines= chr(13)+chr(10)+chr(13)+chr(10);
  Quote = '''';
  DoubleQuote = '"';


// Removes and returns the first value in a separated
// value list (removes quotes if found)
Function ExtractNextValue(
          var S: string;
          const Separator: string ): string;

Function ExtractNextValueNoTrim(
           var S: string;
           const Separator: string ): string;

// Alias method which is the same as Move() but with less confusing name
procedure MemCopy(const src; var dest; size: SizeInt);
// Allows for debug output and quite disable of output
procedure ProfileEvent(const AString: string);
// Return AFilename's size in bytes
function GetFileSize(const AFilename: string): integer;

function IsDigit(const AChar: TfpgChar): boolean;
function IsAlpha(const AChar: TfpgChar): boolean;
function Between( const Value: longint; const Limit1: longint; const Limit2: longint ): boolean;


Operator = (ARect: TRect; BRect: TRect): boolean;


implementation

uses
  fpg_utils
  ;
//  character // from utf8tools package (pulls in LCL requirement which we MUST change)
//  ;


Function ExtractNextValue( var S: string;
                           const Separator: string ): string;
begin
  Result := ExtractNextValueNoTrim( S, Separator );
  Result := trim( Result );

  // Remove quotes if present
  if Result <> '' then
    if Result[ 1 ] = DoubleQuote then
      Delete( Result, 1, 1 );

  if Result <> '' then
    if Result[ length( Result ) ] = DoubleQuote then
      Delete( Result, length( Result ), 1 );
end;

Function ExtractNextValueNoTrim( var S: string;
                                 const Separator: string ): string;
Var
  SeparatorPos: integer;
Begin
  SeparatorPos := Pos( Separator, S );
  if SeparatorPos > 0 then
  begin
    Result := Copy( S, 1, SeparatorPos-1 );
    Delete( S, 1, SeparatorPos + length( Separator ) - 1 );
  end
  else
  begin
    Result := S;
    S := '';
  end;
end;

procedure MemCopy(const src; var dest; size: SizeInt);
begin
  Move(src, dest, size);
end;

procedure ProfileEvent(const AString: string);
begin
  {$IFDEF DEBUG}
  writeln('DEBUG:  ', AString);
  {$ENDIF}
end;

function GetFileSize(const AFilename: string): integer;
var
  f: File;
begin
  Result := 0;
  {$i-}
  FileMode := 0; // read-only
  Assign(f, fpgToOSEncoding(AFileName));
  Reset(f);
  {$i+}
  Result := FileSize(f);
  CloseFile(f);
end;

function IsDigit(const AChar: TfpgChar): boolean;
begin
  { TODO -oGraeme -cunicode : Not utf-8 compliant. }
  Result := ( AChar>='0' ) and ( AChar<='9' );
  //Result := TCharacter.IsDigit(AChar);
end;

function IsAlpha(const AChar: TfpgChar): boolean;
var
  UppercaseC: TfpgChar;
Begin
  { TODO -oGraeme -cunicode : Not utf-8 compliant. }
  UppercaseC := UpperCase( AChar );
  Result := ( UppercaseC >= 'A' ) and ( UppercaseC <= 'Z' );
  //Result := TCharacter.IsLetter(AChar);
end;

function Between( const Value: longint; const Limit1: longint; const Limit2: longint ): boolean;
begin
  if Limit1 < Limit2 then
    Result:= ( Value >= Limit1 ) and ( Value <= Limit2 )
  else
    Result:= ( Value >= Limit2 ) and ( Value <= Limit1 )
end;

operator = (ARect: TRect; BRect: TRect): boolean;
begin
  result :=  (ARect.Top   = BRect.Top) and
             (ARect.Left  = BRect.Left) and
             (ARect.Bottom = BRect.Bottom) and
             (ARect.Right = BRect.Right);
end;

end.