Adding pre-fill. Editorial
[rrq/lsp-utils.git] / lsp-misc / misc.lsp
index f60d0d3ea86fa7fe8ae2c5820bb426a89f958986..ff76d5a294b8dfd6b3e1da5e3e3669d4ae8d1429 100644 (file)
@@ -1,3 +1,5 @@
+;; This module provides some global utility functions.
+
 (define (prog1 X) X)
 (global 'prog1)
 
@@ -6,11 +8,41 @@
   (and N (exit N)))
 (global 'die)
 
+;; Prepend with C onto S so as to fill width W, if it's a number.
+(define (pre-fill C S W)
+  (if (and (number? W) (> (setf W (- W (length S))))) (string (dup C W) S) S))
+(global 'pre-fill)
+
+;; Make a hex string from a data block pad with "0" to W if non-nil
+(define (char2hex STR W)
+  (pre-fill "0" (join (map (curry format "%2x") (map char (explode STR)))) W))
+(global 'char2hex)
+
 ;; Print binary byte as octal or as ASCII character [32-126]
 (define (octal-byte x)
   (if (and (> x 31) (< x 127)) (char x) (format "\\%o" x)))
+(global 'octal-byte)
 
 ;; Print string as binary octals
 (define (octals-string S)
   (join (map octal-byte (unpack (dup "b" (length S)) S))))
-(global 'octals-string 'octal-byte)
+(global 'octals-string)
+
+;; Return byte code as printable or as decimal number.
+(define (human-byte B)
+  (if (and (> B 32) (< B 127)) (char B) B))
+(global 'human-byte)
+
+;; Return a packed encoding of a list of bytes, joining its string elements
+(define (human-bytes BL)
+  (let ((OUT '()) (X nil))
+    (dolist (B (map human-byte BL))
+      (if (string? B) (if X (extend X B) (setf X B))
+        (begin (when (string? X) (push X OUT -1))
+             (push B OUT -1)
+             (setf X nil))))
+    (when (string? X) (push X OUT -1))
+    OUT))
+(global 'human-bytes)
+
+"misc.lsp"