Subversion Repositories Kolibri OS

Rev

Rev 616 | Rev 790 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
616 bw 1
{cp866}
2
unit System;
3
 
4
{$i _defines.inc}
5
{$define HAS_CMDLINE}
6
 
7
interface
8
 
9
{$i systemh.inc}
10
{$i kos_def.inc}
11
{$i kosh.inc}
12
 
13
const
14
  LineEnding = #13#10;
15
  LFNSupport = True;
16
  DirectorySeparator = '/';
17
  DriveSeparator = '/';
18
  PathSeparator = ';';
19
  MaxExitCode = 65535;
20
  MaxPathLen = 512;
21
 
22
  UnusedHandle   : THandle = -1;
23
  StdInputHandle : THandle = 0;
24
  StdOutputHandle: THandle = 0;
25
  StdErrorHandle : THandle = 0;
26
  FileNameCaseSensitive: Boolean = True;
27
  CtrlZMarksEOF: Boolean = True;
28
  sLineBreak = LineEnding;
29
  DefaultTextLineBreakStyle: TTextLineBreakStyle = tlbsCRLF;
30
 
31
var
32
  Argc: Longint = 0;
33
  Argv: PPChar = nil;
34
 
35
  Konsole: TKonsole;
36
 
37
 
38
implementation
39
 
40
var
41
  SysInstance: Longint; public name '_FPC_SysInstance';
42
 
43
{$i system.inc}
44
 
45
 
46
procedure SetupCmdLine;
47
var
48
  Ptrs: array of PChar;
49
  Args: PChar;
50
  InQuotes: Boolean;
51
  I, L: Longint;
52
begin
53
  Argc := 1;
54
  Args := PKosHeader(0)^.args;
55
  if Assigned(Args) then
56
  begin
57
    while Args^ <> #0 do
58
    begin
59
      {Пропустить лидирующие пробелы}
60
      while Args^ in [#1..#32] do Inc(Args);
61
      if Args^ = #0 then Break;
62
 
63
      {Запомнить указатель на параметр}
64
      SetLength(Ptrs, Argc);
65
      Ptrs[Argc - 1] := Args;
66
      Inc(Argc);
67
 
68
      {Пропустить текущий параметр}
69
      InQuotes := False;
70
      while (Args^ <> #0) and (not (Args^ in [#1..#32]) or InQuotes) do
71
      begin
72
        if Args^ = '"' then InQuotes := not InQuotes;
73
        Inc(Args);
74
      end;
75
 
76
      {Установить окончание параметра}
77
      if Args^ in [#1..#32] then
78
      begin
79
        Args^ := #0;
80
        Inc(Args);
81
      end;
82
    end;
83
  end;
84
  Argv := GetMem(Argc * SizeOf(PChar));  {XXX: память не освобождается}
85
  Argv[0] :=  PKosHeader(0)^.path;
86
  for I := 1 to Argc - 1 do
87
  begin
88
    Argv[I] := Ptrs[I - 1];
89
    {Исключить кавычки из строки}
90
    Args := Argv[I];
91
    L := 0;
92
    while Args^ <> #0 do begin Inc(Args); Inc(L); end;
93
    Args := Argv[I];
94
    while Args^ <> #0 do
95
    begin
96
      if Args^ = '"' then
97
      begin
98
        Move(PChar(Args + 1)^, Args^, L);
99
        Dec(L);
100
      end;
101
      Inc(Args);
102
      Dec(L);
103
    end;
104
  end;
105
end;
106
 
107
function ParamCount: Longint;
108
begin
109
  Result := Argc - 1;
110
end;
111
 
112
function ParamStr(L: Longint): String;
113
begin
114
  if (L >= 0) and (L < Argc) then
115
    Result := StrPas(Argv[L]) else
116
    Result := '';
117
end;
118
 
119
procedure Randomize;
120
begin
121
  randseed := 0; {GetTickCount()}
122
end;
123
 
124
const
125
  ProcessID: SizeUInt = 0;
126
 
127
function GetProcessID: SizeUInt;
128
begin
129
  GetProcessID := ProcessID;
130
end;
131
 
132
function CheckInitialStkLen(stklen: SizeUInt): SizeUInt;
133
begin
134
  {TODO}
135
  Result := stklen;
136
end;
137
 
138
{$i kos_stdio.inc}
666 bw 139
{-$i kos_term.inc}
616 bw 140
 
141
procedure SysInitStdIO;
142
begin
143
  if IsConsole then
144
  begin
145
    AssignStdin(Input);
146
    AssignStdout(Output);
147
    AssignStdout(ErrOutput);
148
    AssignStdout(StdOut);
149
    AssignStdout(StdErr);
150
  end;
151
end;
152
 
153
procedure System_Exit; [public, alias: 'SystemExit'];
154
var
155
  event, count: DWord;
156
begin
157
  if IsConsole then
158
  begin
159
    if ExitCode <> 0 then
160
    begin
161
      {XXX: обязательное условие на однопоточный Konsole}
162
      Write(StdErr, '[Error #', ExitCode,', press any key]');
163
      {ожидать нажатия клавиши}
164
      Konsole.KeyPressed;
165
      while Konsole.KeyPressed = 0 do kos_delay(2);
166
      {TODO: исправить косяк при перерисовке Konsole}
167
      {это невозможно, так как куча освобождается еще до вызова этой процедуры}
168
      {можно написать свой диспетчер памяти, но это сложно}
169
      {а если в Konsole использовать выделение памяти напрямую через KosAPI?!}
170
    end;
171
    Close(StdErr);
172
    Close(StdOut);
173
    Close(ErrOutput);
174
    Close(Input);
175
    Close(Output);
176
    Konsole.Done();
177
  end;
178
  asm
179
    movl $-1, %eax
180
    int $0x40
181
  end;
182
end;
183
 
184
{$i kos.inc}
185
 
186
begin
187
  SysResetFPU;
188
  StackLength := CheckInitialStkLen(InitialStkLen);
189
  StackBottom := Pointer(StackTop - StackLength);
666 bw 190
  kos_initheap();
616 bw 191
  InitHeap;
192
  SysInitExceptions;
193
  FPC_CpuCodeInit();
194
  InOutRes := 0;
195
  InitSystemThreads;
666 bw 196
  if IsConsole then
197
    Konsole.Init();
616 bw 198
  SysInitStdIO;
199
  SetupCmdLine;
200
  InitVariantManager;
201
  {InitWideStringManager;}
202
  DispCallByIDProc := @DoDispCallByIDError;
203
end.