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.
 |