00001
00002
00003
00004
00005
00006
00007
00008
00009 #include "rcs_defs.hh"
00010 #include "autokey.h"
00011 #include "_timer.h"
00012 #ifndef NO_STDIO_SUPPORT
00013 #include "rcs_prnt.hh"
00014 #endif
00015
00016
00017 #define AUTOKEY_WRITE_OK (1)
00018
00019 int
00020 autokey_entry_compare (struct AUTOKEY_TABLE_ENTRY *entry, const char *name,
00021 int chksum)
00022 {
00023 int i;
00024 if (0 == entry || 0 == name)
00025 {
00026 return -1;
00027 }
00028 if (chksum != entry->chksum)
00029 {
00030 return (chksum > entry->chksum ? 1 : -1);
00031 }
00032 for (i = 0; i < AUTOKEY_NAMELENGTH; i++)
00033 {
00034 if (name[i] != entry->name[i])
00035 {
00036 return (name[i] > entry->name[i] ? 1 : -1);
00037 }
00038 if (0 == name[i])
00039 {
00040 break;
00041 }
00042 }
00043 return (0);
00044 }
00045
00046 int
00047 autokey_entry_write (struct AUTOKEY_TABLE_ENTRY *entry, const char *name,
00048 int chksum)
00049 {
00050 int i;
00051 int name_end_hit = 0;
00052 if (0 == entry || 0 == name)
00053 {
00054 return -1;
00055 }
00056 for (i = 0; i < AUTOKEY_NAMELENGTH; i++)
00057 {
00058 if (!name_end_hit)
00059 {
00060 entry->name[i] = name[i];
00061 }
00062 else
00063 {
00064 entry->name[i] = 0;
00065 }
00066 if (0 == name[i])
00067 {
00068 name_end_hit = 1;
00069 }
00070 }
00071 entry->chksum = chksum;
00072 }
00073
00074 int
00075 autokey_entry_check (struct AUTOKEY_TABLE_ENTRY *entry)
00076 {
00077 unsigned int chksum = 0;
00078 int i;
00079 if (0 == entry)
00080 {
00081 return 0;
00082 }
00083 if (!entry->name[0])
00084 {
00085 return 0;
00086 }
00087 for (i = 0; i < AUTOKEY_NAMELENGTH && entry->name[i] != 0; i++)
00088 {
00089 chksum += (unsigned int) entry->name[i];
00090 }
00091 return (chksum == entry->chksum);
00092 }
00093
00094 int
00095 autokey_getkey (void *table, int max, const char *name)
00096 {
00097 int index;
00098 struct AUTOKEY_TABLE_ENTRY *ktable = (struct AUTOKEY_TABLE_ENTRY *) table;
00099 unsigned int chksum = 0;
00100 int i;
00101 int tries;
00102 int table_full;
00103 if (0 == table || max < 1 || 0 == name)
00104 {
00105 #ifndef NO_STDIO_SUPPORT
00106 rcs_print_error ("Bad parameters to autokey_getkey(%p,%d,%p)\n",
00107 table, max, name);
00108 #endif
00109 return -1;
00110 }
00111
00112 if (name[0] == 0)
00113 {
00114 #ifndef NO_STDIO_SUPPORT
00115 rcs_print_error ("Bad name for autokey_getkey()\n");
00116 #endif
00117 return -1;
00118 }
00119
00120 for (i = 0; i < AUTOKEY_NAMELENGTH && name[i] != 0; i++)
00121 {
00122 chksum += (unsigned int) name[i];
00123 }
00124
00125
00126
00127
00128 for (index = 0; index < max; index++)
00129 {
00130 if (!autokey_entry_compare (&(ktable[index]), name, chksum))
00131 {
00132 rcs_print ("autkey found %d for %s already in table\n", index,
00133 name);
00134 return index;
00135 }
00136 }
00137
00138 tries = 0;
00139
00140 do
00141 {
00142
00143 table_full = 1;
00144 for (index = 0; index < max; index++)
00145 {
00146 if (!autokey_entry_check (&(ktable[index])))
00147 {
00148
00149 autokey_entry_write (&(ktable[index]), name, chksum);
00150 table_full = 0;
00151 break;
00152 }
00153 }
00154 if (table_full)
00155 {
00156 rcs_print_error
00157 ("autokey table is full no room for %s in table of size %d\n",
00158 name, max);
00159 return -1;
00160 }
00161
00162
00163
00164 esleep (0.01);
00165
00166 if (!autokey_entry_compare (&(ktable[index]), name, chksum))
00167 {
00168 rcs_print ("autkey adding %d for %s\n", index, name);
00169 return index;
00170 }
00171 }
00172 while (tries < 100);
00173 #ifndef NO_STDIO_SUPPORT
00174 rcs_print_error ("autokey_getkey: timed out\n");
00175 #endif
00176 return -1;
00177 }
00178
00179
00180 int
00181 autokey_releasekey (void *table, int max, const char *name, int key)
00182 {
00183 int chksum = 0;
00184 int i;
00185 struct AUTOKEY_TABLE_ENTRY *ktable = (struct AUTOKEY_TABLE_ENTRY *) table;
00186
00187 if (0 == table || max < 1 || 0 == name || key >= max)
00188 {
00189 #ifndef NO_STDIO_SUPPORT
00190 rcs_print_error ("Bad parameters to autokey_releasekey(%p,%d,%p,%d)\n",
00191 table, max, name, key);
00192 #endif
00193 return -1;
00194 }
00195
00196 if (name[0] == 0)
00197 {
00198 #ifndef NO_STDIO_SUPPORT
00199 rcs_print_error ("Bad name for autokey_releasekey()\n");
00200 #endif
00201 return -1;
00202 }
00203
00204 chksum = 0;
00205
00206 for (i = 0; i < AUTOKEY_NAMELENGTH && name[i] != 0; i++)
00207 {
00208 chksum += (unsigned int) name[i];
00209 }
00210 if (autokey_entry_compare (&(ktable[key]), name, chksum))
00211 {
00212 #ifndef NO_STDIO_SUPPORT
00213 rcs_print_error
00214 ("autokey_releasekey entry in table for %s no longer matches key so it will not be released.\n",
00215 name);
00216 #endif
00217 return (-1);
00218 }
00219
00220 for (i = 0; i < AUTOKEY_NAMELENGTH && name[i] != 0; i++)
00221 {
00222 ktable[key].name[i] = 0;
00223 }
00224 ktable[key].chksum = 0;
00225 }