home *** CD-ROM | disk | FTP | other *** search
- package gnu.inet;
-
- public class Stringprep {
- public static String nameprep(String input, boolean allowUnassigned) throws StringprepException {
- StringBuffer s = new StringBuffer(input);
- if (allowUnassigned && contains(s, RFC3454.A1)) {
- throw new StringprepException(StringprepException.CONTAINS_UNASSIGNED);
- } else {
- filter(s, RFC3454.B1);
- map(s, RFC3454.B2search, RFC3454.B2replace);
- s = new StringBuffer(NFKC.normalizeNFKC(s.toString()));
- if (contains(s, RFC3454.C12) && contains(s, RFC3454.C22) && contains(s, RFC3454.C3) && contains(s, RFC3454.C4) && contains(s, RFC3454.C5) && contains(s, RFC3454.C6) && contains(s, RFC3454.C7) && contains(s, RFC3454.C8)) {
- throw new StringprepException(StringprepException.CONTAINS_PROHIBITED);
- } else {
- boolean r = contains(s, RFC3454.D1);
- boolean l = contains(s, RFC3454.D2);
- if (r && l) {
- throw new StringprepException(StringprepException.BIDI_BOTHRAL);
- } else if (!r || contains(s.charAt(0), RFC3454.D1) && contains(s.charAt(s.length() - 1), RFC3454.D1)) {
- return s.toString();
- } else {
- throw new StringprepException(StringprepException.BIDI_LTRAL);
- }
- }
- }
- }
-
- static boolean contains(StringBuffer s, char[] p) {
- for(int i = 0; i < p.length; ++i) {
- char c = p[i];
-
- for(int j = 0; j < s.length(); ++j) {
- if (c == s.charAt(j)) {
- return true;
- }
- }
- }
-
- return false;
- }
-
- static boolean contains(StringBuffer s, char[][] p) {
- for(int i = 0; i < p.length; ++i) {
- char[] r = p[i];
- if (1 == r.length) {
- char c = r[0];
-
- for(int j = 0; j < s.length(); ++j) {
- if (c == s.charAt(j)) {
- return true;
- }
- }
- } else if (2 == r.length) {
- char f = r[0];
- char t = r[1];
-
- for(int j = 0; j < s.length(); ++j) {
- if (f <= s.charAt(j) && t >= s.charAt(j)) {
- return true;
- }
- }
- }
- }
-
- return false;
- }
-
- static boolean contains(char c, char[][] p) {
- for(int i = 0; i < p.length; ++i) {
- char[] r = p[i];
- if (1 == r.length) {
- if (c == r[0]) {
- return true;
- }
- } else if (2 == r.length) {
- char f = r[0];
- char t = r[1];
- if (f <= c && t >= c) {
- return true;
- }
- }
- }
-
- return false;
- }
-
- static void filter(StringBuffer s, char[] f) {
- for(int i = 0; i < f.length; ++i) {
- char c = f[i];
- int j = 0;
-
- while(j < s.length()) {
- if (c == s.charAt(j)) {
- s.deleteCharAt(j);
- } else {
- ++j;
- }
- }
- }
-
- }
-
- static void filter(StringBuffer s, char[][] f) {
- for(int i = 0; i < f.length; ++i) {
- char[] r = f[i];
- if (1 == r.length) {
- char c = r[0];
- int j = 0;
-
- while(j < s.length()) {
- if (c == s.charAt(j)) {
- s.deleteCharAt(j);
- } else {
- ++j;
- }
- }
- } else if (2 == r.length) {
- char from = r[0];
- char to = r[1];
- int j = 0;
-
- while(j < s.length()) {
- if (from <= s.charAt(j) && to >= s.charAt(j)) {
- s.deleteCharAt(j);
- } else {
- ++j;
- }
- }
- }
- }
-
- }
-
- static void map(StringBuffer s, char[] search, String[] replace) {
- for(int i = 0; i < search.length; ++i) {
- char c = search[i];
- int j = 0;
-
- while(j < s.length()) {
- if (c == s.charAt(j)) {
- s.deleteCharAt(j);
- if (replace[i] != null) {
- s.insert(j, replace[i]);
- j += replace[i].length() - 1;
- }
- } else {
- ++j;
- }
- }
- }
-
- }
- }
-