X-Git-Url: http://git.kpe.io/?p=kmrcl.git;a=blobdiff_plain;f=strings.lisp;h=9c031164a11b1adede58e4811314baf0d46addc0;hp=48a29107a419dc110a0e71176b4d690a20672c32;hb=a377884abb0f3f36a67d335214bf2936b7c32070;hpb=67e9cc5c98d4c206f81aa07dc977451c13cb46cd diff --git a/strings.lisp b/strings.lisp index 48a2910..9c03116 100644 --- a/strings.lisp +++ b/strings.lisp @@ -7,7 +7,7 @@ ;;;; Programmer: Kevin M. Rosenberg ;;;; Date Started: Apr 2000 ;;;; -;;;; $Id: strings.lisp,v 1.44 2003/06/17 13:56:38 kevin Exp $ +;;;; $Id: strings.lisp,v 1.46 2003/07/08 00:12:51 kevin Exp $ ;;;; ;;;; This file, part of KMRCL, is Copyright (c) 2002 by Kevin M. Rosenberg ;;;; @@ -403,6 +403,18 @@ for characters in a string" (declare (type (integer 0 15) n)) (schar +hex-chars+ n)) +(defconstant +char-code-0+ (char-code #\0)) +(defconstant +char-code-upper-a+ (char-code #\A)) +(declaim (type fixnum +char-code-0+ +char-code-upper-a+)) + +(defun charhex (ch) + "convert hex character to decimal" + (let ((code (char-code (char-upcase ch)))) + (declare (fixnum ch)) + (if (>= code +char-code-upper-a+) + (+ 10 (- code +char-code-upper-a+)) + (- code +char-code-0+)))) + (defun escape-uri-field (query) "Escape non-alphanumeric characters for URI fields" (declare (simple-string query) @@ -426,15 +438,40 @@ for characters in a string" (setf (schar str dpos) (hexchar (logand c 15)))) (setf (schar str dpos) ch))))) +(defun unescape-uri-field (query) + "Unescape non-alphanumeric characters for URI fields" + (declare (simple-string query) + (optimize (speed 3) (safety 0) (space 0))) + (do* ((count (count-string-char query #\%)) + (len (length query)) + (new-len (- len (* 2 count))) + (str (make-string new-len)) + (spos 0 (1+ spos)) + (dpos 0 (1+ dpos))) + ((= spos len) str) + (declare (fixnum count len new-len spos dpos) + (simple-string str)) + (let ((ch (schar query spos))) + (if (char= #\% ch) + (let ((c1 (charhex (schar query (1+ spos)))) + (c2 (charhex (schar query (+ spos 2))))) + (declare (fixnum c1 c2)) + (setf (schar str dpos) + (code-char (logior c2 (ash c1 4)))) + (incf spos 2)) + (setf (schar str dpos) ch))))) + + (defconstant +char-code-a+ (char-code #\a)) (defun random-string (&optional (len 10)) "Returns a random lower-case string." (declare (optimize (speed 3))) (let ((s (make-string len))) - (declare (simple-string s) - (dotimes (i len s) - (setf (schar s i) (code-char (+ +code-char-a+ (random 26)))))))) + (declare (simple-string s)) + (dotimes (i len s) + (setf (schar s i) + (code-char (+ +char-code-a+ (random 26))))))) (defun first-char (s) @@ -448,3 +485,21 @@ for characters in a string" (let ((len (length s))) (when (plusp len)) (schar s (1- len))))) + +(defun ensure-string (v) + (typecase v + (string v) + (character (string v)) + (symbol (symbol-name v)) + (otherwise (write-to-string v)))) + +(defun string-left-trim-one-char (char str) + (declare (simple-string str)) + (let* ((len (length str)) + (last (1- len))) + (declare (fixnum len last)) + (if (char= char (schar str last)) + (subseq str 0 last) + str))) + +