]> git.plutz.net Git - cgilite/blobdiff - storage.sh
dual use string functions (argument and pipe), make scripts of sed based functions...
[cgilite] / storage.sh
index 1d8764be745b1c0168a7b56302fc42340be272de..fd7582057e112f2ec582e6ede8d7dd1995ce2a66 100755 (executable)
@@ -21,6 +21,7 @@
 include_storage="$0"
 
 LOCK(){
 include_storage="$0"
 
 LOCK(){
+  local lock timeout block
   lock="${1}.lock"
   timeout="${2-20}"
   if [ \! -w "${lock%/*}" ] || [ -e "$lock" -a \! -d "$lock" ]; then
   lock="${1}.lock"
   timeout="${2-20}"
   if [ \! -w "${lock%/*}" ] || [ -e "$lock" -a \! -d "$lock" ]; then
@@ -28,7 +29,7 @@ LOCK(){
     return 1
   fi
 
     return 1
   fi
 
-  while ! mkdir "$lock"; do
+  while ! mkdir "$lock" 2>&-; do
     block="$(cat "$lock/pid" || printf 1)"
     if ! { ps -eo pid |grep -qwF "$block"; }; then
       printf 'Overriding stale lock: %s\n' "$lock" >&2
     block="$(cat "$lock/pid" || printf 1)"
     if ! { ps -eo pid |grep -qwF "$block"; }; then
       printf 'Overriding stale lock: %s\n' "$lock" >&2
@@ -42,10 +43,11 @@ LOCK(){
     sleep 1
   done
   printf '%i\n' $$ >"${lock}/pid"
     sleep 1
   done
   printf '%i\n' $$ >"${lock}/pid"
-  return 1
+  return 0
 }
 
 RELEASE(){
 }
 
 RELEASE(){
+  local lock
   lock="${1}.lock"
   if [ "$(cat "$lock/pid")" = "$$" ]; then
     rm "$lock/pid"
   lock="${1}.lock"
   if [ "$(cat "$lock/pid")" = "$$" ]; then
     rm "$lock/pid"
@@ -54,29 +56,38 @@ RELEASE(){
       printf '%i\n' $$ >"${lock}/pid"
       return 1
     fi
       printf '%i\n' $$ >"${lock}/pid"
       return 1
     fi
+    return 0
   else
     printf 'Refusing to release foreign lock: %s\n' "$lock" >&2
     return 1
   fi
 }
 
   else
     printf 'Refusing to release foreign lock: %s\n' "$lock" >&2
     return 1
   fi
 }
 
+STRING='
+  s;\\;\\\\;g;
+  s;\n;\\n;g;
+  s;\t;\\t;g;
+  s;\r;\\r;g;
+  s;\+;\\+;g;
+  s; ;+;g;
+'
+
 STRING(){
 STRING(){
-  printf %s "$*" |sed -r '
-    :X; $!{N;bX;}
-    s;\\;\\\\;g;
-    s;\n;\\n;g;
-    s;\t;\\t;g;
-    s;\r;\\r;g;
-  '
+  { [ $# -eq 0 ] && cat || printf %s "$*"; } \
+  | printf %s "$*" |sed -r ':X; $!{N;bX;}'"$STRING"
 }
 
 }
 
+UNSTRING='
+  :UNSTRING_X
+  s;((^|[^\\])(\\\\)*)\\n;\1\n;g;
+  s;((^|[^\\])(\\\\)*)\\t;\1\t;g;
+  s;((^|[^\\])(\\\\)*)\\r;\1\r;g;
+  s;((^|[^\\])(\\\\)*)\+;\1 ;g;
+  tUNSTRING_X;
+  s;((^|[^\\])(\\\\)*)\\\+;\1+;g;
+  s;\\\\;\\;g;
+'
 UNSTRING(){
 UNSTRING(){
-  printf %s "$*" |sed -r '
-    :X
-    s;((^|[^\\])(\\\\)*)\\n;\1\n;g;
-    s;((^|[^\\])(\\\\)*)\\t;\1\t;g;
-    s;((^|[^\\])(\\\\)*)\\r;\1\r;g;
-    tX;
-    s;\\\\;\\;g;
-  '
+  { [ $# -eq 0 ] && cat || printf %s "$*"; } \
+  | sed -r "$UNSTRING"
 }
 }