Subversion Repositories Kolibri OS

Rev

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

  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}
  139. {-$i kos_term.inc}
  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);
  190.   kos_initheap();
  191.   InitHeap;
  192.   SysInitExceptions;
  193.   FPC_CpuCodeInit();
  194.   InOutRes := 0;
  195.   InitSystemThreads;
  196.   if IsConsole then
  197.     Konsole.Init();
  198.   SysInitStdIO;
  199.   SetupCmdLine;
  200.   InitVariantManager;
  201.   {InitWideStringManager;}
  202.   DispCallByIDProc := @DoDispCallByIDError;
  203. end.
  204.