Linux sagir-us1.hostever.us 5.14.0-570.51.1.el9_6.x86_64 #1 SMP PREEMPT_DYNAMIC Wed Oct 8 09:41:34 EDT 2025 x86_64
LiteSpeed
Server IP : 104.247.108.91 & Your IP : 216.73.216.105
Domains : 74 Domain
User : georgeto
Terminal
Auto Root
Create File
Create Folder
Localroot Suggester
Backdoor Destroyer
Readme
/
usr /
local /
apps /
lib /
imap /
lib /
Delete
Unzip
Name
Size
Permission
Date
Action
auth_ext.c
2.88
KB
-rw-r--r--
2023-01-11 06:22
auth_gss.c
14.25
KB
-rw-r--r--
2023-01-11 06:22
auth_log.c
3.42
KB
-rw-r--r--
2023-01-11 06:22
auth_md5.c
16.71
KB
-rw-r--r--
2023-01-11 06:22
auth_pla.c
4.32
KB
-rw-r--r--
2023-01-11 06:22
auths.c
88
B
-rw-r--r--
2023-01-11 06:22
big5.c
111.09
KB
-rw-r--r--
2023-01-11 06:22
ckp_1st.c
1.48
KB
-rw-r--r--
2023-01-11 06:22
ckp_2nd.c
888
B
-rw-r--r--
2023-01-11 06:22
ckp_3rd.c
816
B
-rw-r--r--
2023-01-11 06:22
ckp_a41.c
1.41
KB
-rw-r--r--
2023-01-11 06:22
ckp_afs.c
1.84
KB
-rw-r--r--
2023-01-11 06:22
ckp_bsi.c
1.38
KB
-rw-r--r--
2023-01-11 06:22
ckp_cyg.c
1.75
KB
-rw-r--r--
2023-01-11 06:22
ckp_dce.c
2.56
KB
-rw-r--r--
2023-01-11 06:22
ckp_gss.c
3.01
KB
-rw-r--r--
2023-01-11 06:22
ckp_nul.c
1.04
KB
-rw-r--r--
2023-01-11 06:22
ckp_os4.c
2.11
KB
-rw-r--r--
2023-01-11 06:22
ckp_pam.c
3.99
KB
-rw-r--r--
2023-01-11 06:22
ckp_pmb.c
3.82
KB
-rw-r--r--
2023-01-11 06:22
ckp_psx.c
3.6
KB
-rw-r--r--
2023-01-11 06:22
ckp_sce.c
1.58
KB
-rw-r--r--
2023-01-11 06:22
ckp_sec.c
1.54
KB
-rw-r--r--
2023-01-11 06:22
ckp_ssn.c
1.58
KB
-rw-r--r--
2023-01-11 06:22
ckp_std.c
1.16
KB
-rw-r--r--
2023-01-11 06:22
ckp_sv4.c
3.17
KB
-rw-r--r--
2023-01-11 06:22
ckp_svo.c
3.11
KB
-rw-r--r--
2023-01-11 06:22
ckp_ult.c
1.07
KB
-rw-r--r--
2023-01-11 06:22
cns11643.c
505.24
KB
-rw-r--r--
2023-01-11 06:22
crexcl.c
2.44
KB
-rw-r--r--
2023-01-11 06:22
crx_nfs.c
2.44
KB
-rw-r--r--
2023-01-11 06:22
crx_std.c
1.21
KB
-rw-r--r--
2023-01-11 06:22
decomtab.c
163.37
KB
-rw-r--r--
2023-01-11 06:22
dummy.c
24.66
KB
-rw-r--r--
2023-01-11 06:22
env_unix.c
61.15
KB
-rw-r--r--
2023-01-11 06:22
fdstring.c
2.76
KB
-rw-r--r--
2023-01-11 06:22
flockcyg.c
2.99
KB
-rw-r--r--
2023-01-11 06:22
flocklnx.c
2.27
KB
-rw-r--r--
2023-01-11 06:22
flocksim.c
28.21
KB
-rw-r--r--
2023-01-11 06:22
flstring.c
2.37
KB
-rw-r--r--
2023-01-11 06:22
fs_unix.c
1.84
KB
-rw-r--r--
2023-01-11 06:22
fsync.c
910
B
-rw-r--r--
2023-01-11 06:22
ftl_unix.c
1002
B
-rw-r--r--
2023-01-11 06:22
gb_12345.c
64.81
KB
-rw-r--r--
2023-01-11 06:22
gb_2312.c
179.47
KB
-rw-r--r--
2023-01-11 06:22
gethstid.c
975
B
-rw-r--r--
2023-01-11 06:22
getspnam.c
1.55
KB
-rw-r--r--
2023-01-11 06:22
gr_wait.c
1.27
KB
-rw-r--r--
2023-01-11 06:22
gr_wait4.c
1.06
KB
-rw-r--r--
2023-01-11 06:22
gr_waitp.c
1.06
KB
-rw-r--r--
2023-01-11 06:22
ibm.c
16.66
KB
-rw-r--r--
2023-01-11 06:22
imap4r1.c
193.18
KB
-rw-r--r--
2023-01-11 06:22
ip4_unix.c
5.13
KB
-rw-r--r--
2023-01-11 06:22
ip6_unix.c
8.54
KB
-rw-r--r--
2023-01-11 06:22
ip_unix.c
5.13
KB
-rw-r--r--
2023-01-11 06:22
ipo_unix.c
5.04
KB
-rw-r--r--
2023-01-11 06:22
iso_8859.c
13.88
KB
-rw-r--r--
2023-01-11 06:22
jis_0208.c
62.77
KB
-rw-r--r--
2023-01-11 06:22
jis_0212.c
55.8
KB
-rw-r--r--
2023-01-11 06:22
kerb_mit.c
3
KB
-rw-r--r--
2023-01-11 06:22
koi8_r.c
1.76
KB
-rw-r--r--
2023-01-11 06:22
koi8_u.c
1.77
KB
-rw-r--r--
2023-01-11 06:22
ksc_5601.c
178.16
KB
-rw-r--r--
2023-01-11 06:22
libc-client.a
3.91
MB
-rw-r--r--
2023-01-11 06:22
linkage.c
1.2
KB
-rw-r--r--
2023-01-11 06:22
log_bsi.c
1.54
KB
-rw-r--r--
2023-01-11 06:22
log_cyg.c
1.24
KB
-rw-r--r--
2023-01-11 06:22
log_old.c
1.01
KB
-rw-r--r--
2023-01-11 06:22
log_os4.c
1.62
KB
-rw-r--r--
2023-01-11 06:22
log_sec.c
1.14
KB
-rw-r--r--
2023-01-11 06:22
log_std.c
1.12
KB
-rw-r--r--
2023-01-11 06:22
log_sv4.c
1.1
KB
-rw-r--r--
2023-01-11 06:22
mail.c
201.99
KB
-rw-r--r--
2023-01-11 06:22
mbx.c
61.93
KB
-rw-r--r--
2023-01-11 06:22
memmove.c
993
B
-rw-r--r--
2023-01-11 06:22
memmove2.c
1.32
KB
-rw-r--r--
2023-01-11 06:22
memset.c
1010
B
-rw-r--r--
2023-01-11 06:22
mh.c
39.67
KB
-rw-r--r--
2023-01-11 06:22
misc.c
13.34
KB
-rw-r--r--
2023-01-11 06:22
mix.c
92.52
KB
-rw-r--r--
2023-01-11 06:22
mmdf.c
89.34
KB
-rw-r--r--
2023-01-11 06:22
mtx.c
45.09
KB
-rw-r--r--
2023-01-11 06:22
mx.c
39.05
KB
-rw-r--r--
2023-01-11 06:22
netmsg.c
2.88
KB
-rw-r--r--
2023-01-11 06:22
news.c
21.78
KB
-rw-r--r--
2023-01-11 06:22
newsrc.c
16.67
KB
-rw-r--r--
2023-01-11 06:22
nl_unix.c
2.56
KB
-rw-r--r--
2023-01-11 06:22
nntp.c
74.66
KB
-rw-r--r--
2023-01-11 06:22
opendir.c
1.94
KB
-rw-r--r--
2023-01-11 06:22
os_a32.c
1.44
KB
-rw-r--r--
2023-01-11 06:22
os_a41.c
1.53
KB
-rw-r--r--
2023-01-11 06:22
os_a52.c
1.57
KB
-rw-r--r--
2023-01-11 06:22
os_aix.c
1.5
KB
-rw-r--r--
2023-01-11 06:22
os_aos.c
1.5
KB
-rw-r--r--
2023-01-11 06:22
os_art.c
2.13
KB
-rw-r--r--
2023-01-11 06:22
os_asv.c
1.7
KB
-rw-r--r--
2023-01-11 06:22
os_aux.c
1.51
KB
-rw-r--r--
2023-01-11 06:22
os_bsd.c
1.5
KB
-rw-r--r--
2023-01-11 06:22
os_bsf.c
1.33
KB
-rw-r--r--
2023-01-11 06:22
os_bsi.c
1.33
KB
-rw-r--r--
2023-01-11 06:22
os_cvx.c
1.38
KB
-rw-r--r--
2023-01-11 06:22
os_cyg.c
1.61
KB
-rw-r--r--
2023-01-11 06:22
os_d-g.c
1.32
KB
-rw-r--r--
2023-01-11 06:22
os_do4.c
1.4
KB
-rw-r--r--
2023-01-11 06:22
os_drs.c
1.39
KB
-rw-r--r--
2023-01-11 06:22
os_dyn.c
1.53
KB
-rw-r--r--
2023-01-11 06:22
os_hpp.c
1.89
KB
-rw-r--r--
2023-01-11 06:22
os_isc.c
1.65
KB
-rw-r--r--
2023-01-11 06:22
os_lnx.c
1.35
KB
-rw-r--r--
2023-01-11 06:22
os_lyn.c
1.32
KB
-rw-r--r--
2023-01-11 06:22
os_mct.c
1.29
KB
-rw-r--r--
2023-01-11 06:22
os_mnt.c
1.3
KB
-rw-r--r--
2023-01-11 06:22
os_nto.c
1.84
KB
-rw-r--r--
2023-01-11 06:22
os_nxt.c
1.32
KB
-rw-r--r--
2023-01-11 06:22
os_os4.c
1.38
KB
-rw-r--r--
2023-01-11 06:22
os_osf.c
1.35
KB
-rw-r--r--
2023-01-11 06:22
os_osx.c
1.33
KB
-rw-r--r--
2023-01-11 06:22
os_ptx.c
2.88
KB
-rw-r--r--
2023-01-11 06:22
os_pyr.c
1.49
KB
-rw-r--r--
2023-01-11 06:22
os_qnx.c
1.87
KB
-rw-r--r--
2023-01-11 06:22
os_s40.c
1.58
KB
-rw-r--r--
2023-01-11 06:22
os_sc5.c
1.56
KB
-rw-r--r--
2023-01-11 06:22
os_sco.c
1.62
KB
-rw-r--r--
2023-01-11 06:22
os_sgi.c
1.38
KB
-rw-r--r--
2023-01-11 06:22
os_shp.c
1.94
KB
-rw-r--r--
2023-01-11 06:22
os_slx.c
1.43
KB
-rw-r--r--
2023-01-11 06:22
os_sol.c
1.67
KB
-rw-r--r--
2023-01-11 06:22
os_sos.c
1.39
KB
-rw-r--r--
2023-01-11 06:22
os_sua.c
1.33
KB
-rw-r--r--
2023-01-11 06:22
os_sun.c
1.58
KB
-rw-r--r--
2023-01-11 06:22
os_sv2.c
2.82
KB
-rw-r--r--
2023-01-11 06:22
os_sv4.c
1.6
KB
-rw-r--r--
2023-01-11 06:22
os_ult.c
1.27
KB
-rw-r--r--
2023-01-11 06:22
os_vu2.c
2.01
KB
-rw-r--r--
2023-01-11 06:22
osdep.c
32.49
KB
-rw-r--r--
2023-01-11 06:22
osdepbas.c
1.43
KB
-rw-r--r--
2023-01-11 06:22
osdepckp.c
3.6
KB
-rw-r--r--
2023-01-11 06:22
osdeplog.c
1.12
KB
-rw-r--r--
2023-01-11 06:22
osdepssl.c
26.33
KB
-rw-r--r--
2023-01-11 06:22
phile.c
16.28
KB
-rw-r--r--
2023-01-11 06:22
pmatch.c
2.77
KB
-rw-r--r--
2023-01-11 06:22
pop3.c
34.08
KB
-rw-r--r--
2023-01-11 06:22
pseudo.c
1.24
KB
-rw-r--r--
2023-01-11 06:22
rename.c
1.12
KB
-rw-r--r--
2023-01-11 06:22
rfc822.c
78.98
KB
-rw-r--r--
2023-01-11 06:22
scandir.c
2.61
KB
-rw-r--r--
2023-01-11 06:22
setpgrp.c
946
B
-rw-r--r--
2023-01-11 06:22
sig_bsd.c
954
B
-rw-r--r--
2023-01-11 06:22
sig_psx.c
1.3
KB
-rw-r--r--
2023-01-11 06:22
sig_sv4.c
955
B
-rw-r--r--
2023-01-11 06:22
siglocal.c
1.3
KB
-rw-r--r--
2023-01-11 06:22
smanager.c
3.54
KB
-rw-r--r--
2023-01-11 06:22
smtp.c
26.33
KB
-rw-r--r--
2023-01-11 06:22
ssl_none.c
2.57
KB
-rw-r--r--
2023-01-11 06:22
ssl_unix.c
26.33
KB
-rw-r--r--
2023-01-11 06:22
sslstdio.c
4.15
KB
-rw-r--r--
2023-01-11 06:22
strerror.c
981
B
-rw-r--r--
2023-01-11 06:22
strpbrk.c
1.1
KB
-rw-r--r--
2023-01-11 06:22
strstr.c
1.27
KB
-rw-r--r--
2023-01-11 06:22
strtok.c
2.02
KB
-rw-r--r--
2023-01-11 06:22
strtoul.c
2.33
KB
-rw-r--r--
2023-01-11 06:22
tcp_unix.c
31.52
KB
-rw-r--r--
2023-01-11 06:22
tenex.c
48.69
KB
-rw-r--r--
2023-01-11 06:22
tis_620.c
1.91
KB
-rw-r--r--
2023-01-11 06:22
tmap.c
84.45
KB
-rw-r--r--
2023-01-11 06:22
truncate.c
1.06
KB
-rw-r--r--
2023-01-11 06:22
tz_bsd.c
989
B
-rw-r--r--
2023-01-11 06:22
tz_nul.c
887
B
-rw-r--r--
2023-01-11 06:22
tz_sv4.c
1.02
KB
-rw-r--r--
2023-01-11 06:22
unix.c
92.97
KB
-rw-r--r--
2023-01-11 06:22
utf8.c
84
KB
-rw-r--r--
2023-01-11 06:22
utf8aux.c
14.12
KB
-rw-r--r--
2023-01-11 06:22
utime.c
1.22
KB
-rw-r--r--
2023-01-11 06:22
viscii.c
2.8
KB
-rw-r--r--
2023-01-11 06:22
widths.c
265.05
KB
-rw-r--r--
2023-01-11 06:22
windows.c
10.77
KB
-rw-r--r--
2023-01-11 06:22
write.c
1.74
KB
-rw-r--r--
2023-01-11 06:22
Save
Rename
/* ======================================================================== * Copyright 1988-2006 University of Washington * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * * ======================================================================== */ /* * Program: Miscellaneous utility routines * * Author: Mark Crispin * Networks and Distributed Computing * Computing & Communications * University of Washington * Administration Building, AG-44 * Seattle, WA 98195 * Internet: MRC@CAC.Washington.EDU * * Date: 5 July 1988 * Last Edited: 6 December 2006 * * This original version of this file is * Copyright 1988 Stanford University * and was developed in the Symbolic Systems Resources Group of the Knowledge * Systems Laboratory at Stanford University in 1987-88, and was funded by the * Biomedical Research Technology Program of the NationalInstitutes of Health * under grant number RR-00785. */ #include <ctype.h> #include "c-client.h" /* Convert ASCII string to all uppercase * Accepts: string pointer * Returns: string pointer * * Don't use islower/toupper since this function must be ASCII only. */ unsigned char *ucase (unsigned char *s) { unsigned char *t; /* if lowercase covert to upper */ for (t = s; *t; t++) if ((*t >= 'a') && (*t <= 'z')) *t -= ('a' - 'A'); return s; /* return string */ } /* Convert string to all lowercase * Accepts: string pointer * Returns: string pointer * * Don't use isupper/tolower since this function must be ASCII only. */ unsigned char *lcase (unsigned char *s) { unsigned char *t; /* if uppercase covert to lower */ for (t = s; *t; t++) if ((*t >= 'A') && (*t <= 'Z')) *t += ('a' - 'A'); return s; /* return string */ } /* Copy string to free storage * Accepts: source string * Returns: free storage copy of string */ char *cpystr (const char *string) { return string ? strcpy ((char *) fs_get (1 + strlen (string)),string) : NIL; } /* Copy text/size to free storage as sized text * Accepts: destination sized text * pointer to source text * size of source text * Returns: text as a char * */ char *cpytxt (SIZEDTEXT *dst,char *text,unsigned long size) { /* flush old space */ if (dst->data) fs_give ((void **) &dst->data); /* copy data in sized text */ memcpy (dst->data = (unsigned char *) fs_get ((size_t) (dst->size = size) + 1),text,(size_t) size); dst->data[size] = '\0'; /* tie off text */ return (char *) dst->data; /* convenience return */ } /* Copy sized text to free storage as sized text * Accepts: destination sized text * source sized text * Returns: text as a char * */ char *textcpy (SIZEDTEXT *dst,SIZEDTEXT *src) { /* flush old space */ if (dst->data) fs_give ((void **) &dst->data); /* copy data in sized text */ memcpy (dst->data = (unsigned char *) fs_get ((size_t) (dst->size = src->size) + 1), src->data,(size_t) src->size); dst->data[dst->size] = '\0'; /* tie off text */ return (char *) dst->data; /* convenience return */ } /* Copy stringstruct to free storage as sized text * Accepts: destination sized text * source stringstruct * Returns: text as a char * */ char *textcpystring (SIZEDTEXT *text,STRING *bs) { unsigned long i = 0; /* clear old space */ if (text->data) fs_give ((void **) &text->data); /* make free storage space in sized text */ text->data = (unsigned char *) fs_get ((size_t) (text->size = SIZE (bs)) +1); while (i < text->size) text->data[i++] = SNX (bs); text->data[i] = '\0'; /* tie off text */ return (char *) text->data; /* convenience return */ } /* Copy stringstruct from offset to free storage as sized text * Accepts: destination sized text * source stringstruct * offset into stringstruct * size of source text * Returns: text as a char * */ char *textcpyoffstring (SIZEDTEXT *text,STRING *bs,unsigned long offset, unsigned long size) { unsigned long i = 0; /* clear old space */ if (text->data) fs_give ((void **) &text->data); SETPOS (bs,offset); /* offset the string */ /* make free storage space in sized text */ text->data = (unsigned char *) fs_get ((size_t) (text->size = size) + 1); while (i < size) text->data[i++] = SNX (bs); text->data[i] = '\0'; /* tie off text */ return (char *) text->data; /* convenience return */ } /* Returns index of rightmost bit in word * Accepts: pointer to a 32 bit value * Returns: -1 if word is 0, else index of rightmost bit * * Bit is cleared in the word */ unsigned long find_rightmost_bit (unsigned long *valptr) { unsigned long value = *valptr; unsigned long bit = 0; if (!(value & 0xffffffff)) return 0xffffffff; /* binary search for rightmost bit */ if (!(value & 0xffff)) value >>= 16, bit += 16; if (!(value & 0xff)) value >>= 8, bit += 8; if (!(value & 0xf)) value >>= 4, bit += 4; if (!(value & 0x3)) value >>= 2, bit += 2; if (!(value & 0x1)) value >>= 1, bit += 1; *valptr ^= (1 << bit); /* clear specified bit */ return bit; } /* Return minimum of two integers * Accepts: integer 1 * integer 2 * Returns: minimum */ long min (long i,long j) { return ((i < j) ? i : j); } /* Return maximum of two integers * Accepts: integer 1 * integer 2 * Returns: maximum */ long max (long i,long j) { return ((i > j) ? i : j); } /* Search, case-insensitive for ASCII characters * Accepts: base string * length of base string * pattern string * length of pattern string * Returns: T if pattern exists inside base, else NIL */ long search (unsigned char *base,long basec,unsigned char *pat,long patc) { long i,j,k; int c; unsigned char mask[256]; static unsigned char alphatab[256] = { 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223, 223,223,223,223,223,223,223,223,223,223,223,255,255,255,255,255, 255,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223, 223,223,223,223,223,223,223,223,223,223,223,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255 }; /* validate arguments */ if (base && (basec > 0) && pat && (basec >= patc)) { if (patc <= 0) return T; /* empty pattern always succeeds */ memset (mask,0,256); /* initialize search validity mask */ for (i = 0; i < patc; i++) if (!mask[c = pat[i]]) { /* mark single character if non-alphabetic */ if (alphatab[c] & 0x20) mask[c] = T; /* else mark both cases */ else mask[c & 0xdf] = mask[c | 0x20] = T; } /* Boyer-Moore type search */ for (i = --patc; i < basec; i += (mask[c] ? 1 : (j + 1))) for (j = patc,c = base[k = i]; !((c ^ pat[j]) & alphatab[c]); j--,c = base[--k]) if (!j) return T; /* found a match! */ } return NIL; /* pattern not found */ } /* Boyer-Moore string search * Accepts: base string * length of base string * pattern string * length of pattern string * Returns: T if pattern exists inside base, else NIL */ long ssearch (unsigned char *base,long basec,unsigned char *pat,long patc) { long i,j,k; int c; unsigned char mask[256]; /* validate arguments */ if (base && (basec > 0) && pat && (basec >= patc)) { if (patc <= 0) return T; /* empty pattern always succeeds */ memset (mask,0,256); /* initialize search validity mask */ for (i = 0; i < patc; i++) mask[pat[i]] = T; /* Boyer-Moore type search */ for (i = --patc, c = pat[i]; i < basec; i += (mask[c] ? 1 : (j + 1))) for (j = patc,c = base[k = i]; (c == pat[j]); j--,c = base[--k]) if (!j) return T; /* found a match! */ } return NIL; /* pattern not found */ } /* Create a hash table * Accepts: size of new table (note: should be a prime) * Returns: hash table */ HASHTAB *hash_create (size_t size) { size_t i = sizeof (size_t) + size * sizeof (HASHENT *); HASHTAB *ret = (HASHTAB *) memset (fs_get (i),0,i); ret->size = size; return ret; } /* Destroy hash table * Accepts: hash table */ void hash_destroy (HASHTAB **hashtab) { if (*hashtab) { hash_reset (*hashtab); /* reset hash table */ fs_give ((void **) hashtab); } } /* Reset hash table * Accepts: hash table */ void hash_reset (HASHTAB *hashtab) { size_t i; HASHENT *ent,*nxt; /* free each hash entry */ for (i = 0; i < hashtab->size; i++) if (ent = hashtab->table[i]) for (hashtab->table[i] = NIL; ent; ent = nxt) { nxt = ent->next; /* get successor */ fs_give ((void **) &ent); /* flush this entry */ } } /* Calculate index into hash table * Accepts: hash table * entry name * Returns: index */ unsigned long hash_index (HASHTAB *hashtab,char *key) { unsigned long i,ret; /* polynomial of letters of the word */ for (ret = 0; i = (unsigned int) *key++; ret += i) ret *= HASHMULT; return ret % (unsigned long) hashtab->size; } /* Look up name in hash table * Accepts: hash table * key * Returns: associated data */ void **hash_lookup (HASHTAB *hashtab,char *key) { HASHENT *ret; for (ret = hashtab->table[hash_index (hashtab,key)]; ret; ret = ret->next) if (!strcmp (key,ret->name)) return ret->data; return NIL; } /* Add entry to hash table * Accepts: hash table * key * associated data * number of extra data slots * Returns: hash entry * Caller is responsible for ensuring that entry isn't already in table */ HASHENT *hash_add (HASHTAB *hashtab,char *key,void *data,long extra) { unsigned long i = hash_index (hashtab,key); size_t j = sizeof (HASHENT) + (extra * sizeof (void *)); HASHENT *ret = (HASHENT *) memset (fs_get (j),0,j); ret->next = hashtab->table[i];/* insert as new head in this index */ ret->name = key; /* set up hash key */ ret->data[0] = data; /* and first data */ return hashtab->table[i] = ret; } /* Look up name in hash table * Accepts: hash table * key * associated data * number of extra data slots * Returns: associated data */ void **hash_lookup_and_add (HASHTAB *hashtab,char *key,void *data,long extra) { HASHENT *ret; unsigned long i = hash_index (hashtab,key); size_t j = sizeof (HASHENT) + (extra * sizeof (void *)); for (ret = hashtab->table[i]; ret; ret = ret->next) if (!strcmp (key,ret->name)) return ret->data; ret = (HASHENT *) memset (fs_get (j),0,j); ret->next = hashtab->table[i];/* insert as new head in this index */ ret->name = key; /* set up hash key */ ret->data[0] = data; /* and first data */ return (hashtab->table[i] = ret)->data; } /* Convert two hex characters into byte * Accepts: char for high nybble * char for low nybble * Returns: byte * * Arguments must be isxdigit validated */ unsigned char hex2byte (unsigned char c1,unsigned char c2) { /* merge the two nybbles */ return ((c1 -= (isdigit (c1) ? '0' : ((c1 <= 'Z') ? 'A' : 'a') - 10)) << 4) + (c2 - (isdigit (c2) ? '0' : ((c2 <= 'Z') ? 'A' : 'a') - 10)); } /* Compare two unsigned longs * Accepts: first value * second value * Returns: -1 if l1 < l2, 0 if l1 == l2, 1 if l1 > l2 */ int compare_ulong (unsigned long l1,unsigned long l2) { if (l1 < l2) return -1; if (l1 > l2) return 1; return 0; } /* Compare two unsigned chars, case-independent * Accepts: first value * second value * Returns: -1 if c1 < c2, 0 if c1 == c2, 1 if c1 > c2 * * Don't use isupper/tolower since this function must be ASCII only. */ int compare_uchar (unsigned char c1,unsigned char c2) { return compare_ulong (((c1 >= 'A') && (c1 <= 'Z')) ? c1 + ('a' - 'A') : c1, ((c2 >= 'A') && (c2 <= 'Z')) ? c2 + ('a' - 'A') : c2); } /* Compare two case-independent ASCII strings * Accepts: first string * second string * Returns: -1 if s1 < s2, 0 if s1 == s2, 1 if s1 > s2 */ int compare_cstring (unsigned char *s1,unsigned char *s2) { int i; if (!s1) return s2 ? -1 : 0; /* empty string cases */ else if (!s2) return 1; for (; *s1 && *s2; s1++,s2++) if (i = (compare_uchar (*s1,*s2))) return i; if (*s1) return 1; /* first string is longer */ return *s2 ? -1 : 0; /* second string longer : strings identical */ } /* Compare case-independent string with sized text * Accepts: first string * sized text * Returns: -1 if s1 < s2, 0 if s1 == s2, 1 if s1 > s2 */ int compare_csizedtext (unsigned char *s1,SIZEDTEXT *s2) { int i; unsigned char *s; unsigned long j; if (!s1) return s2 ? -1 : 0; /* null string cases */ else if (!s2) return 1; for (s = (char *) s2->data,j = s2->size; *s1 && j; ++s1,++s,--j) if (i = (compare_uchar (*s1,*s))) return i; if (*s1) return 1; /* first string is longer */ return j ? -1 : 0; /* second string longer : strings identical */ }