Add collection of code snippets lingering around on several disks.
authorWerner Koch <wk@gnupg.org>
Sat, 11 Aug 2012 12:20:43 +0000 (14:20 +0200)
committerWerner Koch <wk@gnupg.org>
Sat, 11 Aug 2012 12:22:28 +0000 (14:22 +0200)
b64dec.c [new file with mode: 0644]
backup-audio [new file with mode: 0755]
check-ustid [new file with mode: 0755]
epoch2iso.c [new file with mode: 0644]
findperm.c [new file with mode: 0644]
pp-donation [new file with mode: 0755]
pp-donation.awk [new file with mode: 0644]
reverse-changeLog [new file with mode: 0755]

diff --git a/b64dec.c b/b64dec.c
new file mode 100644 (file)
index 0000000..765356f
--- /dev/null
+++ b/b64dec.c
@@ -0,0 +1,83 @@
+/* undump - Hex undump tool
+ *     Copyright (C) 2000 Werner Koch (dd9jn)
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#define digitp(p)   ((p) >= '0' && (p) <= '9')
+#define hexdigitp(a) (digitp (a)                     \
+                      || ((a) >= 'A' && (a) <= 'F')  \
+                      || ((a) >= 'a' && (a) <= 'f'))
+#define ascii_isspace(a) ((a)==' ' || (a)=='\n' || (a)=='\r' || (a)=='\t')
+#define xtoi_1(p)   ((p) <= '9'? ((p)- '0'): \
+                     (p) <= 'F'? ((p)-'A'+10):((p)-'a'+10))
+
+
+
+
+int
+main (int argc, char **argv )
+{
+  int c1, c2;
+  unsigned int value;
+
+  if ( argc > 1 ) 
+    {
+      fprintf (stderr, "usage: undump < input\n");
+      return 1;
+    }
+    
+
+  while ( (c1=getchar ()) != EOF )
+    {
+      if (ascii_isspace (c1))
+        continue;
+      if (!hexdigitp (c1))
+        {
+          fprintf (stderr, "undump: non hex-digit encountered\n");
+          return 1;
+        }
+      if ( (c2=getchar ()) == EOF )
+        {
+          fprintf (stderr, "undump: error reading second nibble\n");
+          return 1;
+        }
+      if (!hexdigitp (c2))
+        {
+          fprintf (stderr, "undump: second nibble is not a hex-digit\n");
+          return 1;
+        }
+      value = xtoi_1 (c1) * 16 + xtoi_1 (c2);
+      putchar (value);
+    }
+  if (ferror (stdin))
+    {
+      fprintf (stderr, "undump: read error\n");
+      return 1;
+    }
+
+  return 0;
+}
+
+/*
+Local Variables:
+compile-command: "cc -Wall -o undump undump.c"
+End:
+*/
+
+
diff --git a/backup-audio b/backup-audio
new file mode 100755 (executable)
index 0000000..d356d53
--- /dev/null
@@ -0,0 +1,108 @@
+#!/bin/sh
+# Backup a collection of Ogg audiofiles to a set of DVDs.     -*- sh -*-
+# Copyright (C) 2008 Werner Koch
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License as
+# published by the Free Software Foundation; either version 2.1 of
+# the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+
+# Default values
+PGM="backup-audio"
+PGM_VERSION="0.1"
+LC_ALL=C
+dryrun=no
+
+# Helper constants
+tick='`'
+
+# Parse the options
+prev=
+while [ $# -gt 0 ]; do
+  arg="$1"
+  case $arg in
+      -*=*) optarg=$(echo "X$arg" | sed -e '1s/^X//' -e 's/[-_a-zA-Z0-9]*=//')
+            ;;
+         *) optarg=
+            ;;
+  esac
+  if [ -n "$prev" ]; then
+    eval "$prev=\$arg"
+    prev=
+    shift
+    continue
+  fi
+  case $arg in
+      --version)
+          echo "$PGM $PGM_VERSION"
+          exit 0
+          ;;
+
+      --help|-h)
+          cat <<EOF
+Usage: $PGM [options] [arguments]
+Backup a collection of audio files to a set of DVDs
+
+Options:
+  -n, --dry-run          Do not create any output
+
+
+Example:
+
+  $PGM /var/home/foo/audio-collection
+
+EOF
+          exit 0
+          ;;
+    
+      --dry-run|-n)
+          dryrun=yes
+          ;;
+
+      -*)
+          echo "$PGM: invalid option $tick$arg'" >&2
+          exit 1
+          ;;
+
+      *)
+          break
+          ;;
+  esac
+  shift
+done
+if [ -n "$prev" ]; then
+  echo "$PGM: argument missing for option $tick$prev'" >&2
+  exit 1
+fi
+
+if [ $# != 1 ]; then
+    echo "usage: $PGM <directory>" >&2
+    exit 1
+fi
+sourcedir="$1"
+
+find $sourcedir -mindepth 2 -maxdepth 2 -type d -print0 | xargs -0 du -ms \
+  | awk '
+
+{ sum += $1
+  print $0
+  if (sum > 4300) {
+    print "-----"
+    print sum, "   total" 
+    sum = 0
+    dvdcount++;
+  }
+ }
+END { print "number of DVD required: " dvdcount }
+'
+
diff --git a/check-ustid b/check-ustid
new file mode 100755 (executable)
index 0000000..7367964
--- /dev/null
@@ -0,0 +1,25 @@
+#!/bin/sh
+
+ourid="DE215605608"
+otherid="$1"
+# Altes Verfahren
+#host="wddx.bff-online.de"
+#
+#url="/ustid.php?eigene_id=${ourid}&abfrage_id=$otherid"
+#
+#printf "GET $url HTTP/1.0\r\nHost: $host\r\n\r\n" | nc $host 80 \
+#     | sed 's/<var/\n<var/g'
+#echo
+
+
+host="evatr.bff-online.de"
+
+url="http://evatr.bff-online.de/evatrRPC?"
+url="${url}UstId_1=${ourid}&UstId_2=${otherid}"
+url="${url}&Firmenname=&Ort=&PLZ=&Strasse=&Druck="
+
+wget -O - "$url" 2>/dev/null| awk -F'>' '
+/<value><string>ErrorCode</  { found=1; next}
+found && /^<value><string>/  { print $3 }
+found = 0
+'
diff --git a/epoch2iso.c b/epoch2iso.c
new file mode 100644 (file)
index 0000000..1c5955e
--- /dev/null
@@ -0,0 +1,41 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <time.h>
+
+#define PGM "epoch2iso"
+
+
+int
+main (int argc, char **argv)
+{
+  long value;
+  struct tm *tp;
+  time_t atime;
+
+  if (argc != 2)
+    {
+      fprintf (stderr, "usage: " PGM " seconds_since_Epoch\n");
+      return 1;
+    }
+
+  value = strtol (argv[1], NULL, 0);
+  if (value < 0)
+    {
+      fprintf (stderr, PGM ": invalid time given\n");
+      return 1;
+    }
+
+  atime = value;
+  tp = gmtime (&atime);
+
+  printf("%04d-%02d-%02d %02d:%02d:%02d\n",
+         1900+tp->tm_year, tp->tm_mon+1, tp->tm_mday,
+         tp->tm_hour, tp->tm_min, tp->tm_sec);
+  return 0;
+}
+
+/*
+Local Variables:
+compile-command: "cc -Wall -o epoch2iso epoch2iso.c"
+End:
+*/
diff --git a/findperm.c b/findperm.c
new file mode 100644 (file)
index 0000000..bcccfbb
--- /dev/null
@@ -0,0 +1,62 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+
+void *
+xmalloc (size_t n)
+{
+  void *p = malloc (n);
+  if (!p)
+    abort();
+  return p;
+}
+
+char *
+strlwr (char *s)
+{
+    char *p;
+    for(p=s; *p; p++ )
+       *p = tolower(*(unsigned char *)p);
+    return s;
+}
+
+
+int
+main (int argc, char**argv)
+{
+  const unsigned char *s;
+  char line [1024];
+  char *target;
+  char *flags1, *flags2;
+  size_t targetlen;
+
+  if (argc != 2)
+    return 1;
+
+  targetlen = strlen (argv[1]);
+  target = xmalloc (targetlen+1);
+  strcpy (target, argv[1]);
+  strlwr (target);
+  flags1 = xmalloc (256);
+  flags2 = xmalloc (256);
+  memset (flags1, 0, 256);
+  for (s=target; *s; s++)
+    flags1[*s]++;
+
+  while ( fgets (line, sizeof line , stdin) )
+    {
+      if (!*line || strlen (line) != targetlen + 1)
+        continue;
+      line [targetlen] = 0;
+      strlwr (line);
+      memset (flags2, 0, 256);
+      for (s=line; *s; s++)
+        flags2[*s]++;
+      if (!memcmp (flags1, flags2, 256))
+          printf ("%s\n", line);
+
+    }
+
+  return 0;
+}
diff --git a/pp-donation b/pp-donation
new file mode 100755 (executable)
index 0000000..f5b049f
--- /dev/null
@@ -0,0 +1,14 @@
+#!/bin/sh
+# Extract donation details from a Paypal notification mail
+#
+# Due to the problem of passing more than one argument in a shebang
+# script, we use this wrapper script to call gawk.  gawk is required
+# for gensub.
+
+script=$0.awk
+
+# We better resort to the C locale to avoid a bug in the -b option
+LC_ALL=C
+export LC_ALL
+
+exec gawk -b -f "$script" "$@"
diff --git a/pp-donation.awk b/pp-donation.awk
new file mode 100644 (file)
index 0000000..7d794df
--- /dev/null
@@ -0,0 +1,60 @@
+# pp-donation.awk                                           -*- awk -*-
+#
+# Extract donation details from a Paypal notification mail.  This is
+# called from a shell script because we need to use gawk's -b option.
+
+BEGIN {
+    FS = ":"
+}
+
+FNR==1 && NR > 1 { result() }
+
+/^Donation Details/ { in_details = 1; next }
+
+!in_details && /^[Dd][Aa][Tt][Ee]:/ {
+    date=trim($2 ":" $3 ":" $4)
+    if (match(date, /^[a-zA-Z0-9,-: \t]+$/))
+    {
+        cmd = "date -d '" date "' +'%F'"
+        cmd | getline date
+        close(cmd)
+    }
+    else
+    {
+        date = "INVALID DATE"
+    }
+}
+
+!in_details && /^This email confirms.*from/ {
+    email = gensub(/.*\(([^)]+)\)\..*/, "\\1", 1)
+}
+
+!in_details  { next }
+
+/^[ \t]*Total amount:/  {split($2, a, " "); sub(/,/, ".", a[1]); amount = a[1]}
+
+/^The following.*Publish my sponsor name\?/ {
+    publish = substr(trim($3), 1, 1)
+}
+
+/^Contributor:/  { name = trim($2) }
+
+END {
+    result()
+}
+
+function result() {
+    printf "| %s | %s | %s | %s | %s |\n", date, amount, publish, name, email
+    date=""
+    amount=""
+    publish=""
+    name=""
+    email=""
+    in_details=0
+}
+
+function trim(s) {
+    sub (/[ \t]+$/, "", s)
+    sub (/^[ \t]+/, "", s)
+    return s
+}
diff --git a/reverse-changeLog b/reverse-changeLog
new file mode 100755 (executable)
index 0000000..5e3e33e
--- /dev/null
@@ -0,0 +1,20 @@
+#!/bin/sh
+#                                                    -*- sh -*-
+# Sometimes we find changelogs in chronological order and not
+# in the desired reverse chronological order.  This script fixes that.
+#
+#  Usage:
+#     reverse-changelog <ChangeLog >ChangedLog.fixed
+
+awk '
+/^[MTWTFS12][a-z0-9]+/   { flush(); i = 0 }
+                         { i++; arr[i] = $0 }
+END                      { flush() }
+
+
+function flush ()
+{
+   for (; i > 0; i--)
+      print arr[i];
+}
+' | tac