| 
									
										
										
										
											2023-10-27 18:20:02 +09:00
										 |  |  | package main | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							| 
									
										
										
										
											2024-09-07 12:34:17 +09:00
										 |  |  | 	"flag" | 
					
						
							| 
									
										
										
										
											2023-10-27 18:20:02 +09:00
										 |  |  | 	"fmt" | 
					
						
							|  |  |  | 	"os" | 
					
						
							| 
									
										
										
										
											2024-09-07 12:34:17 +09:00
										 |  |  | 	//"strings" | 
					
						
							| 
									
										
										
										
											2025-09-02 23:58:15 +09:00
										 |  |  | 	"code.miflux.com/hyung-hwan/hak/go" | 
					
						
							| 
									
										
										
										
											2023-10-27 18:20:02 +09:00
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* | 
					
						
							|  |  |  | 		var src []uint16 = utf16.Encode(([]rune)( | 
					
						
							|  |  |  | 			`(printf ">>>>>>>>> [%d]\n" (+ 30 455)) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | (printf ">>>>>>>>> [%d]\n" (+ 11 455)) | 
					
						
							| 
									
										
										
										
											2025-09-02 23:58:15 +09:00
										 |  |  | #include "a.hak" | 
					
						
							| 
									
										
										
										
											2023-10-27 18:20:02 +09:00
										 |  |  | (printf ">>>>>>>>> [%d]\n" (+ 20 455)) | 
					
						
							|  |  |  | `)) | 
					
						
							|  |  |  | */ | 
					
						
							| 
									
										
										
										
											2023-11-03 18:04:46 +09:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-22 01:27:39 +09:00
										 |  |  | /* to be set in build time */ | 
					
						
							|  |  |  | var BINDIR = "." | 
					
						
							|  |  |  | var SBINDIR = "." | 
					
						
							|  |  |  | var LIBDIR = "." | 
					
						
							|  |  |  | var SYSCONFDIR = "." | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-11-03 18:04:46 +09:00
										 |  |  | type Param struct { | 
					
						
							| 
									
										
										
										
											2023-11-05 23:33:22 +09:00
										 |  |  | 	log_file   string | 
					
						
							| 
									
										
										
										
											2023-11-03 18:04:46 +09:00
										 |  |  | 	input_file string | 
					
						
							| 
									
										
										
										
											2024-09-07 12:34:17 +09:00
										 |  |  | 	heapsize   uint | 
					
						
							|  |  |  | 	modlibdirs string | 
					
						
							|  |  |  | 	fs_usage   func() | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func empty_usage() { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-11-03 18:04:46 +09:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func handle_arguments(param *Param) error { | 
					
						
							| 
									
										
										
										
											2024-09-07 12:34:17 +09:00
										 |  |  | 	/* | 
					
						
							| 
									
										
										
										
											2023-11-03 18:04:46 +09:00
										 |  |  | 	var nargs int = len(os.Args) | 
					
						
							|  |  |  | 	var i int | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	for i = 1; i < nargs; i++ { | 
					
						
							| 
									
										
										
										
											2023-11-05 23:33:22 +09:00
										 |  |  | 		if strings.HasPrefix(os.Args[i], "--log=") { | 
					
						
							| 
									
										
										
										
											2023-11-03 18:04:46 +09:00
										 |  |  | 			param.log_file = os.Args[i][6:] | 
					
						
							| 
									
										
										
										
											2023-11-05 23:33:22 +09:00
										 |  |  | 		} else if os.Args[i] == "--log" { | 
					
						
							| 
									
										
										
										
											2023-11-03 18:04:46 +09:00
										 |  |  | 			i++ | 
					
						
							|  |  |  | 			param.log_file = os.Args[i] | 
					
						
							|  |  |  | 		} else if strings.HasPrefix(os.Args[i], "--") || strings.HasPrefix(os.Args[i], "-") { | 
					
						
							|  |  |  | 			return fmt.Errorf("unknown option - %s", os.Args[i]) | 
					
						
							|  |  |  | 		} else { | 
					
						
							|  |  |  | 			break | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if i >= nargs { | 
					
						
							|  |  |  | 		return fmt.Errorf("no input file specified") | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	param.input_file = os.Args[i] | 
					
						
							|  |  |  | 	return nil | 
					
						
							| 
									
										
										
										
											2024-09-07 12:34:17 +09:00
										 |  |  | 	*/ | 
					
						
							|  |  |  | 	var fs *flag.FlagSet | 
					
						
							|  |  |  | 	var heapsize *uint | 
					
						
							|  |  |  | 	var modlibdirs *string | 
					
						
							|  |  |  | 	var log *string | 
					
						
							|  |  |  | 	var err error | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	fs = flag.NewFlagSet(os.Args[0], flag.ContinueOnError) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	heapsize = fs.Uint("heapsize", 0, "specify heap size") | 
					
						
							|  |  |  | 	modlibdirs = fs.String("modlibdirs", "", "specify module library directories") | 
					
						
							|  |  |  | 	log = fs.String("log", "", "specify log file") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	param.fs_usage = fs.Usage | 
					
						
							|  |  |  | 	fs.Usage = empty_usage // i don't want fs.Parse() print the usage | 
					
						
							|  |  |  | 	err = fs.Parse(os.Args[1:]) | 
					
						
							|  |  |  | 	fs.Usage = param.fs_usage // restore it | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return fmt.Errorf("command line error - %s", err.Error()) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-09-07 12:54:16 +09:00
										 |  |  | 	if fs.NArg() < 1 { | 
					
						
							|  |  |  | 		return fmt.Errorf("no input file specified") | 
					
						
							|  |  |  | 	} else if fs.NArg() > 1 { | 
					
						
							|  |  |  | 		return fmt.Errorf("too many input files specified") | 
					
						
							| 
									
										
										
										
											2024-09-07 12:34:17 +09:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	param.input_file = fs.Arg(0); | 
					
						
							|  |  |  | 	param.log_file = *log // TODO: parse the option part  (e.g. --log /dev/stderr,debug+) | 
					
						
							| 
									
										
										
										
											2025-09-02 23:58:15 +09:00
										 |  |  | 	param.heapsize = *heapsize // TODO: set this to hak | 
					
						
							|  |  |  | 	param.modlibdirs = *modlibdirs // TODO: set this to hak | 
					
						
							| 
									
										
										
										
											2024-09-07 12:34:17 +09:00
										 |  |  | 	return nil; | 
					
						
							| 
									
										
										
										
											2023-11-03 18:04:46 +09:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-10-27 18:20:02 +09:00
										 |  |  | func main() { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-10-08 23:38:24 +09:00
										 |  |  | 	var x *hak.Hak = nil | 
					
						
							| 
									
										
										
										
											2023-10-29 21:40:05 +09:00
										 |  |  | 	var err error = nil | 
					
						
							| 
									
										
										
										
											2023-11-03 18:04:46 +09:00
										 |  |  | 	var param Param | 
					
						
							| 
									
										
										
										
											2023-10-27 18:20:02 +09:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-09-02 23:58:15 +09:00
										 |  |  | 	var rfh hak.CciFileHandler | 
					
						
							|  |  |  | 	var sfh hak.UdiFileHandler | 
					
						
							|  |  |  | 	var pfh hak.UdoFileHandler | 
					
						
							| 
									
										
										
										
											2023-10-27 18:20:02 +09:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-11-05 23:33:22 +09:00
										 |  |  | 	err = handle_arguments(¶m) | 
					
						
							| 
									
										
										
										
											2023-11-03 18:04:46 +09:00
										 |  |  | 	if err != nil { | 
					
						
							| 
									
										
										
										
											2024-09-10 12:30:26 +09:00
										 |  |  | 		fmt.Printf("ERROR: %s\n", err.Error()) | 
					
						
							| 
									
										
										
										
											2024-09-07 12:34:17 +09:00
										 |  |  | 		param.fs_usage() | 
					
						
							| 
									
										
										
										
											2023-11-03 18:04:46 +09:00
										 |  |  | 		os.Exit(1) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-09-02 23:58:15 +09:00
										 |  |  | 	x, err = hak.New() | 
					
						
							| 
									
										
										
										
											2023-10-27 18:20:02 +09:00
										 |  |  | 	if err != nil { | 
					
						
							| 
									
										
										
										
											2025-09-02 23:58:15 +09:00
										 |  |  | 		fmt.Printf("ERROR: failed to instantiate hak - %s\n", err.Error()) | 
					
						
							| 
									
										
										
										
											2023-10-27 18:20:02 +09:00
										 |  |  | 		os.Exit(1) | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2023-11-01 16:06:28 +09:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-11-03 18:04:46 +09:00
										 |  |  | 	if param.log_file != "" { | 
					
						
							| 
									
										
										
										
											2025-09-02 23:58:15 +09:00
										 |  |  | 		x.SetLogMask(^hak.BitMask(0)) | 
					
						
							| 
									
										
										
										
											2023-11-05 23:33:22 +09:00
										 |  |  | 		x.SetLogTarget("/dev/stderr") | 
					
						
							| 
									
										
										
										
											2023-11-03 18:04:46 +09:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2023-11-01 16:06:28 +09:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-09-02 23:58:15 +09:00
										 |  |  | 	x.SetTrait(x.GetTrait() | hak.TRAIT_LANG_ENABLE_EOL) | 
					
						
							| 
									
										
										
										
											2024-01-22 01:38:13 +09:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-10-29 21:40:05 +09:00
										 |  |  | 	err = x.Ignite(1000000) | 
					
						
							| 
									
										
										
										
											2023-10-27 18:20:02 +09:00
										 |  |  | 	if err != nil { | 
					
						
							| 
									
										
										
										
											2024-09-10 12:30:26 +09:00
										 |  |  | 		fmt.Printf("ERROR: failed to ignite - %s\n", err.Error()) | 
					
						
							| 
									
										
										
										
											2023-10-29 21:40:05 +09:00
										 |  |  | 		goto oops | 
					
						
							| 
									
										
										
										
											2023-10-27 18:20:02 +09:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2023-10-29 21:40:05 +09:00
										 |  |  | 	err = x.AddBuiltinPrims() | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							| 
									
										
										
										
											2024-09-10 12:30:26 +09:00
										 |  |  | 		fmt.Printf("ERROR: failed to add builtin primitives - %s\n", err.Error()) | 
					
						
							| 
									
										
										
										
											2023-10-29 21:40:05 +09:00
										 |  |  | 		goto oops | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-11-05 23:33:22 +09:00
										 |  |  | 	err = x.AttachCCIO(&rfh, param.input_file) | 
					
						
							| 
									
										
										
										
											2023-11-05 16:58:45 +09:00
										 |  |  | 	if err != nil { | 
					
						
							| 
									
										
										
										
											2024-09-10 12:30:26 +09:00
										 |  |  | 		fmt.Printf("ERROR: failed to attach input file handler - %s\n", err.Error()) | 
					
						
							| 
									
										
										
										
											2023-11-05 16:58:45 +09:00
										 |  |  | 		goto oops | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	err = x.AttachUDIO(&sfh, &pfh) | 
					
						
							| 
									
										
										
										
											2023-10-31 21:17:08 +09:00
										 |  |  | 	if err != nil { | 
					
						
							| 
									
										
										
										
											2024-09-10 12:30:26 +09:00
										 |  |  | 		fmt.Printf("ERROR: failed to attach the user I/O handler - %s\n", err.Error()) | 
					
						
							| 
									
										
										
										
											2023-11-01 16:06:28 +09:00
										 |  |  | 		goto oops | 
					
						
							| 
									
										
										
										
											2023-10-31 21:17:08 +09:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2023-11-01 16:06:28 +09:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-11-05 23:33:22 +09:00
										 |  |  | 	err = x.BeginFeed() | 
					
						
							| 
									
										
										
										
											2023-11-03 18:04:46 +09:00
										 |  |  | 	if err != nil { | 
					
						
							| 
									
										
										
										
											2024-09-10 12:30:26 +09:00
										 |  |  | 		fmt.Printf("ERROR: %s\n", err.Error()) | 
					
						
							| 
									
										
										
										
											2023-11-03 18:04:46 +09:00
										 |  |  | 		goto oops | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	err = x.FeedFromFile(param.input_file) | 
					
						
							|  |  |  | 	//err = x.FeedString(`(printf ">>>>>>>>> [%d]\n" (+ 30 455)) | 
					
						
							|  |  |  | 	//   (printf ">>>>>>>>> [%d]\n" (+ 11 455)) | 
					
						
							| 
									
										
										
										
											2025-09-02 23:58:15 +09:00
										 |  |  | 	//   #include "a.hak" | 
					
						
							| 
									
										
										
										
											2023-11-03 18:04:46 +09:00
										 |  |  | 	//   (printf ">>>>>>>>> [%d]\n" (+ 20 455))`) | 
					
						
							| 
									
										
										
										
											2023-11-01 16:06:28 +09:00
										 |  |  | 	if err != nil { | 
					
						
							| 
									
										
										
										
											2024-09-10 12:30:26 +09:00
										 |  |  | 		fmt.Printf("ERROR: %s\n", err.Error()) | 
					
						
							| 
									
										
										
										
											2023-11-01 16:06:28 +09:00
										 |  |  | 		goto oops | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	err = x.EndFeed() | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							| 
									
										
										
										
											2024-09-10 12:30:26 +09:00
										 |  |  | 		fmt.Printf("ERROR: %s\n", err.Error()) | 
					
						
							| 
									
										
										
										
											2023-11-01 16:06:28 +09:00
										 |  |  | 		goto oops | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	x.Decode() | 
					
						
							| 
									
										
										
										
											2023-11-05 23:33:22 +09:00
										 |  |  | 	x.SetLogMask(0) | 
					
						
							| 
									
										
										
										
											2023-10-29 21:40:05 +09:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-11-01 16:06:28 +09:00
										 |  |  | 	err = x.Execute() | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							| 
									
										
										
										
											2024-09-10 12:30:26 +09:00
										 |  |  | 		//fmt.Printf("ERROR: %s[%d:%d] - %s\n", herr.File, herr.Line, herr.Colm, herr.Msg) | 
					
						
							|  |  |  | 		fmt.Printf("ERROR: %s\n", err.Error()) | 
					
						
							| 
									
										
										
										
											2023-11-01 16:06:28 +09:00
										 |  |  | 		goto oops | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2023-10-29 21:40:05 +09:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-10-27 18:20:02 +09:00
										 |  |  | 	x.Close() | 
					
						
							| 
									
										
										
										
											2023-10-29 21:40:05 +09:00
										 |  |  | 	os.Exit(0) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | oops: | 
					
						
							|  |  |  | 	if x != nil { | 
					
						
							|  |  |  | 		x.Close() | 
					
						
							|  |  |  | 		x = nil | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	os.Exit(1) | 
					
						
							| 
									
										
										
										
											2023-10-27 18:20:02 +09:00
										 |  |  | } |