staticinlineint no_dos_char(unsignedchar c)
{ /* Characters that are allowed in HPFS but not in DOS */ return c=='+' || c==',' || c==';' || c=='=' || c=='[' || c==']';
}
staticinlineunsignedchar upcase(unsignedchar *dir, unsignedchar a)
{ if (a<128 || a==255) return a>='a' && a<='z' ? a - 0x20 : a; if (!dir) return a; return dir[a-128];
}
unsignedchar hpfs_upcase(unsignedchar *dir, unsignedchar a)
{ return upcase(dir, a);
}
staticinlineunsignedchar locase(unsignedchar *dir, unsignedchar a)
{ if (a<128 || a==255) return a>='A' && a<='Z' ? a + 0x20 : a; if (!dir) return a; return dir[a];
}
int hpfs_chk_name(constunsignedchar *name, unsigned *len)
{ int i; if (*len > 254) return -ENAMETOOLONG;
hpfs_adjust_length(name, len); if (!*len) return -EINVAL; for (i = 0; i < *len; i++) if (not_allowed_char(name[i])) return -EINVAL; if (*len == 1) if (name[0] == '.') return -EINVAL; if (*len == 2) if (name[0] == '.' && name[1] == '.') return -EINVAL; return 0;
}
unsignedchar *hpfs_translate_name(struct super_block *s, unsignedchar *from, unsigned len, int lc, int lng)
{ unsignedchar *to; int i; if (hpfs_sb(s)->sb_chk >= 2) if (hpfs_is_name_long(from, len) != lng) {
pr_err("Long name flag mismatch - name "); for (i = 0; i < len; i++)
pr_cont("%c", from[i]);
pr_cont(" misidentified as %s.\n", lng ? "short" : "long");
pr_err("It's nothing serious. It could happen because of bug in OS/2.\nSet checks=normal to disable this message.\n");
} if (!lc) return from; if (!(to = kmalloc(len, GFP_KERNEL))) {
pr_err("can't allocate memory for name conversion buffer\n"); return from;
} for (i = 0; i < len; i++) to[i] = locase(hpfs_sb(s)->sb_cp_table,from[i]); return to;
}
int hpfs_compare_names(struct super_block *s, constunsignedchar *n1, unsigned l1, constunsignedchar *n2, unsigned l2, int last)
{ unsigned l = l1 < l2 ? l1 : l2; unsigned i; if (last) return -1; for (i = 0; i < l; i++) { unsignedchar c1 = upcase(hpfs_sb(s)->sb_cp_table,n1[i]); unsignedchar c2 = upcase(hpfs_sb(s)->sb_cp_table,n2[i]); if (c1 < c2) return -1; if (c1 > c2) return 1;
} if (l1 < l2) return -1; if (l1 > l2) return 1; return 0;
}
int hpfs_is_name_long(constunsignedchar *name, unsigned len)
{ int i,j; for (i = 0; i < len && name[i] != '.'; i++) if (no_dos_char(name[i])) return 1; if (!i || i > 8) return 1; if (i == len) return 0; for (j = i + 1; j < len; j++) if (name[j] == '.' || no_dos_char(name[i])) return 1; return j - i > 4;
}
/* OS/2 clears dots and spaces at the end of file name, so we have to */
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.