- `(let ((status [nil nil nil nil nil nil nil nil nil]))
- (aset status 0 nil) ; r0: pc
- (aset status 1 0) ; r1: state
- (aset status 2 ,lex-scan-unibyte-ptr-var) ; r2: ptr
- (aset status 3 ,lex-scan-unibyte-ptr-var) ; r3: start
- (aset status 4 ,lex-scan-unibyte-end-var) ; r4: end
- (aset status 5 nil) ; r5: mch
- (aset status 6 0) ; r6: act
- (aset status 7 nil) ; r7
- (aset status 8 nil) ; ic
- (ccl-execute-on-string
- (eval-when-compile
- (ccl-compile
- ',(lex-gen-ccl-unibyte-automata-program states cs)))
- status
- ,lex-scan-unibyte-str-var)
- (setq ,lex-scan-unibyte-ptr-var (aref status 2))
- (when (< 0 (aref status 6))
- (setq ,lex-act-var (aref status 6)
- ,lex-scan-unibyte-mch-var (aref status 5)))))
+ (let ((name (make-symbol "ccl-prog-name"))
+ (frag-vector (make-vector 1 nil))
+ )
+ `(let ((frag ,frag-vector)
+ (status [nil nil nil nil nil nil nil nil nil])
+ (prog (eval-when-compile
+ (ccl-compile
+ ',(lex-gen-ccl-unibyte-automata-program states cs)))))
+ (unless (aref frag 0)
+ (register-ccl-program
+ ',name prog)
+ (aset frag 0 t))
+ (aset status 0 nil) ; r0: pc
+ (aset status 1 0) ; r1: state
+ (aset status 2 ,lex-scan-unibyte-ptr-var) ; r2: ptr
+ (aset status 3 ,lex-scan-unibyte-ptr-var) ; r3: start
+ (aset status 4 ,lex-scan-unibyte-end-var) ; r4: end
+ (aset status 5 nil) ; r5: mch
+ (aset status 6 0) ; r6: act
+ (aset status 7 nil) ; r7
+ (aset status 8 nil) ; ic
+ ,(if (eval-when-compile (eq lex-ccl-execute 'ccl-execute-on-string))
+ `(ccl-execute-on-string
+ ,(if (eval-when-compile lex-ccl-use-name) `',name `prog)
+ status
+ ,lex-scan-unibyte-str-var)
+ `(ccl-execute-on-substring
+ ,(if (eval-when-compile lex-ccl-use-name) `',name `prog)
+ status
+ ,lex-scan-unibyte-str-var
+ ,lex-scan-unibyte-ptr-var
+ ,lex-scan-unibyte-end-var))
+ (setq ,lex-scan-unibyte-ptr-var (aref status 2))
+ (when (< 0 (aref status 6))
+ (setq ,lex-act-var (aref status 6)
+ ,lex-scan-unibyte-mch-var (aref status 5))))))