94 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			ObjectPascal
		
	
	
	
	
	
			
		
		
	
	
			94 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			ObjectPascal
		
	
	
	
	
	
program main;
 | 
						|
 | 
						|
{$mode objfpc}{$H+}
 | 
						|
 | 
						|
uses Hak, SysUtils, GetOpts;
 | 
						|
 | 
						|
var
 | 
						|
 | 
						|
	(*c: System.AnsiChar;*)
 | 
						|
	c: Char;
 | 
						|
	optind: System.LongInt;
 | 
						|
	opts: array[0..2] of GetOpts.TOption;
 | 
						|
 | 
						|
	source_file: string;
 | 
						|
	x: Hak.Interp = nil;
 | 
						|
 | 
						|
	procedure print_usage_and_halt();
 | 
						|
	begin
 | 
						|
		writeln(System.Stderr, SysUtils.Format('Usage: %s <filename>', [SysUtils.ExtractFileName(System.ParamStr(0))]));
 | 
						|
		System.Halt(-1);
 | 
						|
	end;
 | 
						|
 | 
						|
begin
 | 
						|
	(* System.ParamCount() returns only the number of argumetns except System.ParamStr(0). It is the upper bound to System.ParamStr(). *)
 | 
						|
 | 
						|
	opts[0].name := 'heapsize';
 | 
						|
	opts[0].has_arg := 1;
 | 
						|
	opts[0].value := #0;
 | 
						|
	opts[0].flag := nil;
 | 
						|
	opts[1].name := 'modlibdirs';
 | 
						|
	opts[1].has_arg := 1;
 | 
						|
	opts[1].value := #0;
 | 
						|
	opts[1].flag := nil;
 | 
						|
	opts[2].name := ''; (* marker for the last item *)
 | 
						|
	opts[2].has_arg := 0;
 | 
						|
	opts[2].value := #0;
 | 
						|
	opts[2].flag := nil;
 | 
						|
 | 
						|
(* TODO: proper command-line options handling *)
 | 
						|
	c := #0;
 | 
						|
	GetOpts.OptErr := false;
 | 
						|
	repeat
 | 
						|
		c := GetOpts.GetLongOpts(':', @opts[0], optind);
 | 
						|
		case c of
 | 
						|
		#0:
 | 
						|
			begin
 | 
						|
				(*TODO: process options.. *)
 | 
						|
				(*opts[optind].name*)
 | 
						|
				(*GetOpts.OptArg is the value *)
 | 
						|
			end;
 | 
						|
 | 
						|
		'?', ':':
 | 
						|
			print_usage_and_halt;
 | 
						|
		end;
 | 
						|
	until c = GetOpts.EndOfOptions;
 | 
						|
 | 
						|
	if GetOpts.OptInd <> System.ParamCount() then begin
 | 
						|
		print_usage_and_halt;
 | 
						|
	end;
 | 
						|
 | 
						|
	source_file := System.ParamStr(GetOpts.OptInd);
 | 
						|
	try
 | 
						|
		x := Hak.Interp.Create(100);
 | 
						|
		x.Ignite(0);
 | 
						|
 | 
						|
		x.AddBuiltinPrims();
 | 
						|
		//x.AttachCCIO();
 | 
						|
		//x.AttachUDIO();
 | 
						|
 | 
						|
		(*
 | 
						|
		x.CompileText(pwidechar('(printf "hello 동키콩\n")'));
 | 
						|
		x.CompileText('(printf "hello 동키콩월드\n") ');
 | 
						|
		x.CompileText('(동가리오 := 20)');
 | 
						|
		x.CompileText('(printf "%d %d\n" 동가리오 (+ 동가리오 동가리오))');
 | 
						|
 | 
						|
		x.Compile(pwidechar('(printf "%d %d\n" 동가리오 (동가리오 * 동가리오))'#10'printf "hello, world\n";;;'#10));
 | 
						|
		*)
 | 
						|
 | 
						|
		x.CompileFile(pansichar(ansistring(source_file)));
 | 
						|
		x.Execute(); // check if exception...
 | 
						|
	except
 | 
						|
		on e: Hak.ErrorException do begin
 | 
						|
			if e.FileName <> '' then source_file := e.FileName;
 | 
						|
			writeln('ERROR: ', SysUtils.Format('%s[%u,%u] %s', [source_file, e.Line, e.Column, e.Message]));
 | 
						|
		end;
 | 
						|
		on e: Exception do
 | 
						|
			writeln('ERROR: ', e.Message);
 | 
						|
		else
 | 
						|
			writeln('ERROR: unknonw exception');
 | 
						|
	end;
 | 
						|
 | 
						|
	if x <> nil then x.Destroy();
 | 
						|
end.
 |