了解下fas是怎么加载的
本帖最后由 nzl1116 于 2022-8-4 12:55 编辑(defun _al-load-file (UnVar0 UnVar1 / UnVar2 UnVar3 UNVar4 UNVar5)
(setq UnVar2 nil)
(setq UnVar3 nil)
(if (setq UNVar2 (string-equal UNVar1 ".FAS"))
(if (setq UNVar3 (make-encryptedfile-input-stream UNVar0))
(al-fas-load UNVar3)
)
(if (setq UNVar3 (make-protectedfile-input-stream UNVar0))
(al-load-stream UNVar3)
(progn
(setq UNVar4 (open UNVar0 :INPUT))
(setq UNVar5 UNVar4)
(defun -unwind-cleanup- ()
(if (streamp UNVar4)
(if (open-streamp UNVar4)
(close UNVar4)
)
)
)
(defun -unwind-protect- (/ sUNVar0)
(setq sUNVar0 _%sys-error-hook%)
(defun UnFun (Arg0)
(setq _%sys-error-hook% sUNVar0)
(and (input-streamp UNVar5) (close UNVar5))
(if sUNVar0 (sUNVar0 Arg0))
)
(setq _%sys-error-hook% UnFun)
(if UnVar2
(al-fas-load UNVar5)
(al-load-stream UNVar5)
)
)
(_unwinded-apply '-unwind-cleanup- '-unwind-protect- nil)
)
)
)
) ;;;总结下就如下这样了,返回的是模块的表
(defun AYL-Load-Fas (fasFile / file Var0 Int0 Int1 mod0 mod1 mLst)
(setq mLst nil)
(setq file (open fasFile "r"))
(while (not (= (setq Var0 (as:read file nil file)) file))
(if (and
(= Var0 'FAS4-FILE)
(numberp (setq Int0 (as:read file nil nil)))
)
(progn
(setq mod0 (_rntm-module file nil Int0))
(if (numberp (setq Int1 (as:read file nil nil)))
(progn
(setq mod1 (_rntm-module file nil Int1))
;;make-xsubr函数执行完,并没填充模块数据,但模块码有了
;;执行完-tm-函数,才填充模块
((make-xsubr mod1 0 '-tm-) mod0)
;;(module-lit-vector mod1)
(setq mLst (cons (list mod0 mod1) mLst))
)
)
)
)
)
(close file)
(reverse mLst)
) (defun al-fas-load (UnVar0 / UnVar1 UnVar2 UnVar3)
(setq UnVar1 nil)
(setq UnVar2 nil)
(setq UnVar3 nil)
(setq UNVar1 0)
(while (not (= (setq UNVar3 (as:read UNVar0 nil UNVar0)) UNVar0))
(cond
((= UNVar3 (find-symbol "FAS4-FILE" :AUTOLISP)) (setq UnVar2 (func-00004A8A UnVar0)))
((= UNVar3 (find-symbol "FAS2-FILE" :AUTOLISP)) (setq UnVar2 (func-00004A47 UnVar0)))
((= UNVar3 (find-symbol "FAS-FILE" :AUTOLISP))(setq UnVar2 (func-000049F2 UnVar0)))
((= UNVar3 (find-symbol "FAS3-FILE" :AUTOLISP)) (setq UnVar2 (func-00004BAA UnVar0)))
(T (func-00004892 UnVar0)) ;文件错误信息
)
(setq UnVar1 (1+ UnVar1))
)
(and *load-verbose* (load-verbose-print UNVar0 UnVar1))
UnVar2
) (defun func-00004A8A (UnVar0 / UnVar1 UnVar2)
(setq UnVar1 nil)
(setq UnVar2 nil)
(setq UnVar2 (func-000049B7 UnVar0))
(setq UnVar1 (func-000049B7 UnVar0))
(setq UnVar1 ((make-xsubr UnVar1 0 '-tm-) UnVar2))
(and *load-print* (print UnVar1))
UnVar1
)
(defun func-000049B7 (UnVar0 / UnVar1)
(setq UnVar1 (as:read UnVar0 nil nil))
(if (fixnump UnVar1)
(if (>= UnVar1 0)
nil
(func-00004892 UnVar0) ;文件错误信息
)
(func-00004892 UnVar0) ;文件错误信息
)
(_rntm-module UnVar0 nil UnVar1)
) 感谢分享,学习了 晨语大侠把压箱底的东西都拿出来了,大家鼓掌👏 太高级了,看不懂,那些不变色的函数是隐藏函数吗 好东西。收藏了 太高深了,有没有讲解一下 有没有办法,在不生成本地文件的情况下,加载fas文件。
或者说有没有办法知道al-fas-load对应的arx函数是什么