X-Git-Url: http://dolda2000.com/gitweb/?p=jsvc.git;a=blobdiff_plain;f=src%2Fdolda%2Fjsvc%2Futil%2FMisc.java;h=34e36f7212e0921ea54dc4cfcb54a3a1f7fccc99;hp=e92b3240270fc4674be6481dc77e04585a64300a;hb=5e8bab52e7ad1f8faffe4296b738fd1053a62900;hpb=7779099a6c15508f2dd214a7555c66a27f8343ed diff --git a/src/dolda/jsvc/util/Misc.java b/src/dolda/jsvc/util/Misc.java index e92b324..34e36f7 100644 --- a/src/dolda/jsvc/util/Misc.java +++ b/src/dolda/jsvc/util/Misc.java @@ -5,6 +5,7 @@ import java.util.*; import java.io.*; public class Misc { + public static final java.nio.charset.Charset utf8 = java.nio.charset.Charset.forName("UTF-8"); private static Map stext = new HashMap(); static { @@ -36,6 +37,25 @@ public class Misc { return(p); } + static byte[] readall(InputStream in) throws IOException { + byte[] buf = new byte[4096]; + int off = 0; + while(true) { + if(off == buf.length) { + byte[] n = new byte[buf.length * 2]; + System.arraycopy(buf, 0, n, 0, buf.length); + buf = n; + } + int ret = in.read(buf, off, buf.length - off); + if(ret < 0) { + byte[] n = new byte[off]; + System.arraycopy(buf, 0, n, 0, off); + return(n); + } + off += ret; + } + } + public static void cpstream(InputStream in, OutputStream out) throws IOException { byte[] buf = new byte[4096]; while(true) { @@ -52,4 +72,73 @@ public class Misc { ret = new ErrorHandler(ret); return(ret); } + + public static int hex2int(char digit) { + if((digit >= '0') && (digit <= '9')) + return(digit - '0'); + if((digit >= 'a') && (digit <= 'f')) + return(digit - 'a' + 10); + if((digit >= 'A') && (digit <= 'F')) + return(digit - 'A' + 10); + throw(new NumberFormatException("Invalid hex digit " + digit)); + } + + public static char int2hex(int nibble, boolean upper) { + if((nibble >= 0) && (nibble <= 9)) + return((char)('0' + nibble)); + if((nibble >= 10) && (nibble <= 15)) + return((char)((upper?'A':'a') + nibble - 10)); + throw(new NumberFormatException("Invalid hex nibble " + nibble)); + } + + public static String htmlq(String in) { + StringBuilder buf = new StringBuilder(); + for(int i = 0; i < in.length(); i++) { + char c = in.charAt(i); + if(c == '&') + buf.append("&"); + else if(c == '<') + buf.append("<"); + else if(c == '>') + buf.append(">"); + else + buf.append(c); + } + return(buf.toString()); + } + + public static String urlq(String in) { + byte[] bytes = in.getBytes(utf8); + StringBuilder buf = new StringBuilder(); + for(int i = 0; i < bytes.length; i++) { + byte b = bytes[i]; + if((b < 32) || (b == ' ') || (b == '&') || (b == '?') || (b == '/') || (b == '=') || (b == '#') || (b == '%') || (b == '+') || (b >= 128)) { + buf.append('%'); + buf.append(int2hex((b & 0xf0) >> 4, true)); + buf.append(int2hex(b & 0x0f, true)); + } else { + buf.append((char)b); + } + } + return(buf.toString()); + } + + public static boolean boolval(String val) { + val = val.trim().toLowerCase(); + if(val.equals("1") || val.equals("on") || val.equals("true") || val.equals("yes") || val.equals("\u22a4")) + return(true); + if(val.equals("0") || val.equals("off") || val.equals("false") || val.equals("no") || val.equals("\u22a5")) + return(false); + throw(new IllegalArgumentException("value not recognized as boolean: " + val)); + } + + public static void eatws(PushbackReader in) throws IOException { + int c; + do { + c = in.read(); + if(c < 0) + return; + } while(Character.isWhitespace(c)); + in.unread(c); + } }