+(defun nndoc-oe-dbx-type-p ()
+ (looking-at (mm-string-to-multibyte "\317\255\022\376")))
+
+(defun nndoc-read-little-endian ()
+ (+ (prog1 (char-after) (forward-char 1))
+ (lsh (prog1 (char-after) (forward-char 1)) 8)
+ (lsh (prog1 (char-after) (forward-char 1)) 16)
+ (lsh (prog1 (char-after) (forward-char 1)) 24)))
+
+(defun nndoc-oe-dbx-decode-block ()
+ (list
+ (nndoc-read-little-endian) ;; this address
+ (nndoc-read-little-endian) ;; next address offset
+ (nndoc-read-little-endian) ;; blocksize
+ (nndoc-read-little-endian))) ;; next address
+
+(defun nndoc-oe-dbx-dissection ()
+ (let ((i 0) blk p tp)
+ (goto-char 60117) ;; 0x0000EAD4+1
+ (setq p (point))
+ (unless (eobp)
+ (setq blk (nndoc-oe-dbx-decode-block)))
+ (while (and blk (> (car blk) 0) (or (zerop (nth 3 blk))
+ (> (nth 3 blk) p)))
+ (push (list (incf i) p nil nil nil 0) nndoc-dissection-alist)
+ (while (and (> (car blk) 0) (> (nth 3 blk) p))
+ (goto-char (1+ (nth 3 blk)))
+ (setq blk (nndoc-oe-dbx-decode-block)))
+ (if (or (<= (car blk) p)
+ (<= (nth 1 blk) 0)
+ (not (zerop (nth 3 blk))))
+ (setq blk nil)
+ (setq tp (+ (car blk) (nth 1 blk) 17))
+ (if (or (<= tp p) (>= tp (point-max)))
+ (setq blk nil)
+ (goto-char tp)
+ (setq p tp
+ blk (nndoc-oe-dbx-decode-block)))))))
+
+(defun nndoc-oe-dbx-generate-article (article &optional head)
+ (let ((entry (cdr (assq article nndoc-dissection-alist)))
+ (cur (current-buffer))
+ (begin (point))
+ blk p)
+ (with-current-buffer nndoc-current-buffer
+ (setq p (car entry))
+ (while (> p (point-min))
+ (goto-char p)
+ (setq blk (nndoc-oe-dbx-decode-block))
+ (setq p (point))
+ (with-current-buffer cur
+ (insert-buffer-substring nndoc-current-buffer p (+ p (nth 2 blk))))
+ (setq p (1+ (nth 3 blk)))))
+ (goto-char begin)
+ (while (re-search-forward "\r$" nil t)
+ (delete-char -1))
+ (when head
+ (goto-char begin)
+ (when (search-forward "\n\n" nil t)
+ (setcar (cddddr entry) (count-lines (point) (point-max)))
+ (delete-region (1- (point)) (point-max))))
+ t))
+
+(defun nndoc-oe-dbx-generate-head (article)
+ (nndoc-oe-dbx-generate-article article 'head))
+
+(defun nndoc-mail-in-mail-type-p ()
+ (let (found)
+ (save-excursion
+ (catch 'done
+ (while (re-search-forward "\n\n[-A-Za-z0-9]+:" nil t)
+ (setq found 0)
+ (forward-line)
+ (while (looking-at "[ \t]\\|[-A-Za-z0-9]+:")
+ (if (looking-at "[-A-Za-z0-9]+:")
+ (setq found (1+ found)))
+ (forward-line))
+ (if (and (> found 0) (looking-at "\n"))
+ (throw 'done 9999)))
+ nil))))
+
+(defun nndoc-mail-in-mail-article-begin ()
+ (let (point found)
+ (if (catch 'done
+ (while (re-search-forward "\n\n\\([-A-Za-z0-9]+:\\)" nil t)
+ (setq found 0)
+ (setq point (match-beginning 1))
+ (forward-line)
+ (while (looking-at "[ \t]\\|[-A-Za-z0-9]+:")
+ (if (looking-at "[-A-Za-z0-9]+:")
+ (setq found (1+ found)))
+ (forward-line))
+ (if (and (> found 0) (looking-at "\n"))
+ (throw 'done t)))
+ nil)
+ (goto-char point))))
+