source: trunk/libtransmission/quark.c

Last change on this file was 14718, checked in by mikedld, 5 years ago

Explicitly compare result of str(n)cmp/memcmp to signify that it's not boolean

  • Property svn:keywords set to Date Rev Author Id
File size: 12.6 KB
Line 
1/*
2 * This file Copyright (C) 2013-2014 Mnemosyne LLC
3 *
4 * It may be used under the GNU GPL versions 2 or 3
5 * or any future license endorsed by Mnemosyne LLC.
6 *
7 * $Id: quark.c 14718 2016-03-13 22:11:01Z mikedld $
8 */
9
10#include <assert.h>
11#include <stdlib.h> /* bsearch() */
12#include <string.h> /* memcmp() */
13
14#include "transmission.h"
15#include "ptrarray.h"
16#include "quark.h"
17#include "utils.h" /* tr_memdup(), tr_strndup() */
18
19struct tr_key_struct
20{
21  const char * str;
22  size_t len;
23};
24
25static const struct tr_key_struct my_static[] =
26{
27  { "", 0 },
28  { "activeTorrentCount", 18 },
29  { "activity-date", 13 },
30  { "activityDate", 12 },
31  { "added", 5 },
32  { "added-date", 10 },
33  { "added.f", 7 },
34  { "added6", 6 },
35  { "added6.f", 8 },
36  { "addedDate", 9 },
37  { "address", 7 },
38  { "alt-speed-down", 14 },
39  { "alt-speed-enabled", 17 },
40  { "alt-speed-time-begin", 20 },
41  { "alt-speed-time-day", 18 },
42  { "alt-speed-time-enabled", 22 },
43  { "alt-speed-time-end", 18 },
44  { "alt-speed-up", 12 },
45  { "announce", 8 },
46  { "announce-list", 13 },
47  { "announceState", 13 },
48  { "arguments", 9 },
49  { "bandwidth-priority", 18 },
50  { "bandwidthPriority", 17 },
51  { "bind-address-ipv4", 17 },
52  { "bind-address-ipv6", 17 },
53  { "bitfield",  8 },
54  { "blocklist-date", 14 },
55  { "blocklist-enabled", 17 },
56  { "blocklist-size", 14 },
57  { "blocklist-updates-enabled", 25 },
58  { "blocklist-url", 13 },
59  { "blocks", 6 },
60  { "bytesCompleted", 14 },
61  { "cache-size-mb", 13 },
62  { "clientIsChoked", 14 },
63  { "clientIsInterested", 18 },
64  { "clientName", 10 },
65  { "comment", 7 },
66  { "comment_utf_8", 13 },
67  { "compact-view", 12 },
68  { "complete", 8 },
69  { "config-dir", 10 },
70  { "cookies", 7 },
71  { "corrupt", 7 },
72  { "corruptEver", 11 },
73  { "created by", 10 },
74  { "created by.utf-8", 16 },
75  { "creation date", 13 },
76  { "creator", 7 },
77  { "cumulative-stats", 16 },
78  { "current-stats", 13 },
79  { "date", 4 },
80  { "dateCreated", 11 },
81  { "delete-local-data", 17 },
82  { "desiredAvailable", 16 },
83  { "destination", 11 },
84  { "dht-enabled", 11 },
85  { "display-name", 12 },
86  { "dnd", 3 },
87  { "done-date", 9 },
88  { "doneDate", 8 },
89  { "download-dir", 12 },
90  { "download-dir-free-space", 23 },
91  { "download-queue-enabled", 22 },
92  { "download-queue-size", 19 },
93  { "downloadCount", 13 },
94  { "downloadDir", 11 },
95  { "downloadLimit", 13 },
96  { "downloadLimited", 15 },
97  { "downloadSpeed", 13 },
98  { "downloaded", 10 },
99  { "downloaded-bytes", 16 },
100  { "downloadedBytes", 15 },
101  { "downloadedEver", 14 },
102  { "downloaders", 11 },
103  { "downloading-time-seconds", 24 },
104  { "dropped", 7 },
105  { "dropped6", 8 },
106  { "e", 1 },
107  { "encoding", 8 },
108  { "encryption", 10 },
109  { "error", 5 },
110  { "errorString", 11 },
111  { "eta", 3 },
112  { "etaIdle", 7 },
113  { "failure reason", 14 },
114  { "fields", 6 },
115  { "fileStats", 9 },
116  { "filename", 8 },
117  { "files", 5 },
118  { "files-added", 11 },
119  { "files-unwanted", 14 },
120  { "files-wanted", 12 },
121  { "filesAdded", 10 },
122  { "filter-mode", 11 },
123  { "filter-text", 11 },
124  { "filter-trackers", 15 },
125  { "flagStr", 7 },
126  { "flags", 5 },
127  { "fromCache", 9 },
128  { "fromDht", 7 },
129  { "fromIncoming", 12 },
130  { "fromLpd", 7 },
131  { "fromLtep", 8 },
132  { "fromPex", 7 },
133  { "fromTracker", 11 },
134  { "hasAnnounced", 12 },
135  { "hasScraped", 10 },
136  { "hashString", 10 },
137  { "have", 4 },
138  { "haveUnchecked", 13 },
139  { "haveValid", 9 },
140  { "honorsSessionLimits", 19 },
141  { "host", 4 },
142  { "id", 2 },
143  { "idle-limit", 10 },
144  { "idle-mode", 9 },
145  { "idle-seeding-limit", 18 },
146  { "idle-seeding-limit-enabled", 26 },
147  { "ids", 3 },
148  { "incomplete", 10 },
149  { "incomplete-dir", 14 },
150  { "incomplete-dir-enabled", 22 },
151  { "info", 4 },
152  { "info_hash", 9 },
153  { "inhibit-desktop-hibernation", 27 },
154  { "interval", 8 },
155  { "ip", 2 },
156  { "ipv4", 4 },
157  { "ipv6", 4 },
158  { "isBackup", 8 },
159  { "isDownloadingFrom", 17 },
160  { "isEncrypted", 11 },
161  { "isFinished", 10 },
162  { "isIncoming", 10 },
163  { "isPrivate", 9 },
164  { "isStalled", 9 },
165  { "isUTP", 5 },
166  { "isUploadingTo", 13 },
167  { "lastAnnouncePeerCount", 21 },
168  { "lastAnnounceResult", 18 },
169  { "lastAnnounceStartTime", 21 },
170  { "lastAnnounceSucceeded", 21 },
171  { "lastAnnounceTime", 16 },
172  { "lastAnnounceTimedOut", 20 },
173  { "lastScrapeResult", 16 },
174  { "lastScrapeStartTime", 19 },
175  { "lastScrapeSucceeded", 19 },
176  { "lastScrapeTime", 14 },
177  { "lastScrapeTimedOut", 18 },
178  { "leecherCount", 12 },
179  { "leftUntilDone", 13 },
180  { "length", 6 },
181  { "location", 8 },
182  { "lpd-enabled", 11 },
183  { "m", 1 },
184  { "magnet-info", 11 },
185  { "magnetLink", 10 },
186  { "main-window-height", 18 },
187  { "main-window-is-maximized", 24 },
188  { "main-window-layout-order", 24 },
189  { "main-window-width", 17 },
190  { "main-window-x", 13 },
191  { "main-window-y", 13 },
192  { "manualAnnounceTime", 18 },
193  { "max-peers", 9 },
194  { "maxConnectedPeers", 17 },
195  { "memory-bytes", 12 },
196  { "memory-units", 12 },
197  { "message-level", 13 },
198  { "metadataPercentComplete", 23 },
199  { "metadata_size", 13 },
200  { "metainfo", 8 },
201  { "method", 6 },
202  { "min interval", 12 },
203  { "min_request_interval", 20 },
204  { "move", 4 },
205  { "msg_type", 8 },
206  { "mtimes", 6 },
207  { "name", 4 },
208  { "name.utf-8", 10 },
209  { "nextAnnounceTime", 16 },
210  { "nextScrapeTime", 14 },
211  { "nodes", 5 },
212  { "nodes6", 6 },
213  { "open-dialog-dir", 15 },
214  { "p", 1 },
215  { "path", 4 },
216  { "path.utf-8", 10 },
217  { "paused", 6 },
218  { "pausedTorrentCount", 18 },
219  { "peer-congestion-algorithm", 25 },
220  { "peer-id-ttl-hours", 17 },
221  { "peer-limit", 10 },
222  { "peer-limit-global", 17 },
223  { "peer-limit-per-torrent", 22 },
224  { "peer-port", 9 },
225  { "peer-port-random-high", 21 },
226  { "peer-port-random-low", 20 },
227  { "peer-port-random-on-start", 25 },
228  { "peer-socket-tos", 15 },
229  { "peerIsChoked", 12 },
230  { "peerIsInterested", 16 },
231  { "peers", 5 },
232  { "peers2", 6 },
233  { "peers2-6", 8 },
234  { "peers6", 6 },
235  { "peersConnected", 14 },
236  { "peersFrom", 9 },
237  { "peersGettingFromUs", 18 },
238  { "peersSendingToUs", 16 },
239  { "percentDone", 11 },
240  { "pex-enabled", 11 },
241  { "piece", 5 },
242  { "piece length", 12 },
243  { "pieceCount", 10 },
244  { "pieceSize", 9 },
245  { "pieces", 6 },
246  { "play-download-complete-sound", 28 },
247  { "port", 4 },
248  { "port-forwarding-enabled", 23 },
249  { "port-is-open", 12 },
250  { "preallocation", 13 },
251  { "prefetch-enabled", 16 },
252  { "priorities", 10 },
253  { "priority", 8 },
254  { "priority-high", 13 },
255  { "priority-low", 12 },
256  { "priority-normal", 15 },
257  { "private", 7 },
258  { "progress", 8 },
259  { "prompt-before-exit", 18 },
260  { "queue-move-bottom", 17 },
261  { "queue-move-down", 15 },
262  { "queue-move-top", 14 },
263  { "queue-move-up", 13 },
264  { "queue-stalled-enabled", 21 },
265  { "queue-stalled-minutes", 21 },
266  { "queuePosition", 13 },
267  { "rateDownload", 12 },
268  { "rateToClient", 12 },
269  { "rateToPeer", 10 },
270  { "rateUpload", 10 },
271  { "ratio-limit", 11 },
272  { "ratio-limit-enabled", 19 },
273  { "ratio-mode", 10 },
274  { "recent-download-dir-1", 21 },
275  { "recent-download-dir-2", 21 },
276  { "recent-download-dir-3", 21 },
277  { "recent-download-dir-4", 21 },
278  { "recheckProgress", 15 },
279  { "remote-session-enabled", 22 },
280  { "remote-session-host", 19 },
281  { "remote-session-password", 23 },
282  { "remote-session-port", 19 },
283  { "remote-session-requres-authentication", 37 },
284  { "remote-session-username", 23 },
285  { "removed", 7 },
286  { "rename-partial-files", 20 },
287  { "reqq", 4 },
288  { "result", 6 },
289  { "rpc-authentication-required", 27 },
290  { "rpc-bind-address", 16 },
291  { "rpc-enabled", 11 },
292  { "rpc-password", 12 },
293  { "rpc-port", 8 },
294  { "rpc-url", 7 },
295  { "rpc-username", 12 },
296  { "rpc-version", 11 },
297  { "rpc-version-minimum", 19 },
298  { "rpc-whitelist", 13 },
299  { "rpc-whitelist-enabled", 21 },
300  { "scrape", 6 },
301  { "scrape-paused-torrents-enabled", 30 },
302  { "scrapeState", 11 },
303  { "script-torrent-done-enabled", 27 },
304  { "script-torrent-done-filename", 28 },
305  { "seconds-active", 14 },
306  { "secondsActive", 13 },
307  { "secondsDownloading", 18 },
308  { "secondsSeeding", 14 },
309  { "seed-queue-enabled", 18 },
310  { "seed-queue-size", 15 },
311  { "seedIdleLimit", 13 },
312  { "seedIdleMode", 12 },
313  { "seedRatioLimit", 14 },
314  { "seedRatioLimited", 16 },
315  { "seedRatioMode", 13 },
316  { "seederCount", 11 },
317  { "seeding-time-seconds", 20 },
318  { "session-count", 13 },
319  { "sessionCount", 12 },
320  { "show-backup-trackers", 20 },
321  { "show-extra-peer-details", 23 },
322  { "show-filterbar", 14 },
323  { "show-notification-area-icon", 27 },
324  { "show-options-window", 19 },
325  { "show-statusbar", 14 },
326  { "show-toolbar", 12 },
327  { "show-tracker-scrapes", 20 },
328  { "size-bytes", 10 },
329  { "size-units", 10 },
330  { "sizeWhenDone", 12 },
331  { "sort-mode", 9 },
332  { "sort-reversed", 13 },
333  { "speed", 5 },
334  { "speed-Bps", 9 },
335  { "speed-bytes", 11 },
336  { "speed-limit-down", 16 },
337  { "speed-limit-down-enabled", 24 },
338  { "speed-limit-up", 14 },
339  { "speed-limit-up-enabled", 22 },
340  { "speed-units", 11 },
341  { "start-added-torrents", 20 },
342  { "start-minimized", 15 },
343  { "startDate", 9 },
344  { "status", 6 },
345  { "statusbar-stats", 15 },
346  { "tag", 3 },
347  { "tier", 4 },
348  { "time-checked", 12 },
349  { "torrent-added", 13 },
350  { "torrent-added-notification-command", 34 },
351  { "torrent-added-notification-enabled", 34 },
352  { "torrent-complete-notification-command", 37 },
353  { "torrent-complete-notification-enabled", 37 },
354  { "torrent-complete-sound-command", 30 },
355  { "torrent-complete-sound-enabled", 30 },
356  { "torrent-duplicate", 17 },
357  { "torrent-get", 11 },
358  { "torrent-set", 11 },
359  { "torrent-set-location", 20 },
360  { "torrentCount", 12 },
361  { "torrentFile", 11 },
362  { "torrents", 8 },
363  { "totalSize", 9 },
364  { "total_size", 10 },
365  { "tracker id", 10 },
366  { "trackerAdd", 10 },
367  { "trackerRemove", 13 },
368  { "trackerReplace", 14 },
369  { "trackerStats", 12 },
370  { "trackers", 8 },
371  { "trash-can-enabled", 17 },
372  { "trash-original-torrent-files", 28 },
373  { "umask", 5 },
374  { "units", 5 },
375  { "upload-slots-per-torrent", 24 },
376  { "uploadLimit", 11 },
377  { "uploadLimited", 13 },
378  { "uploadRatio", 11 },
379  { "uploadSpeed", 11 },
380  { "upload_only", 11 },
381  { "uploaded", 8 },
382  { "uploaded-bytes", 14 },
383  { "uploadedBytes", 13 },
384  { "uploadedEver", 12 },
385  { "url-list", 8 },
386  { "use-global-speed-limit", 22 },
387  { "use-speed-limit", 15 },
388  { "user-has-given-informed-consent", 31 },
389  { "ut_comment", 10 },
390  { "ut_holepunch", 12 },
391  { "ut_metadata", 11 },
392  { "ut_pex", 6 },
393  { "ut_recommend", 12 },
394  { "utp-enabled", 11 },
395  { "v", 1 },
396  { "version", 7 },
397  { "wanted", 6 },
398  { "warning message", 15 },
399  { "watch-dir", 9 },
400  { "watch-dir-enabled", 17 },
401  { "webseeds", 8 },
402  { "webseedsSendingToUs", 19 }
403};
404
405static int
406compareKeys (const void * va, const void * vb)
407{
408  int ret;
409  const struct tr_key_struct * a = va;
410  const struct tr_key_struct * b = vb;
411
412  ret = memcmp (a->str, b->str, MIN (a->len, b->len));
413
414  if (ret == 0 && a->len != b->len)
415    ret = a->len < b->len ? -1 : 1;
416
417  return ret;
418}
419
420static tr_ptrArray my_runtime = TR_PTR_ARRAY_INIT_STATIC;
421
422bool
423tr_quark_lookup (const void * str, size_t len, tr_quark * setme)
424{
425  struct tr_key_struct tmp;
426  struct tr_key_struct * match;
427  static const size_t n_static = sizeof(my_static) / sizeof(struct tr_key_struct);
428  bool success = false;
429
430  assert (n_static == TR_N_KEYS);
431
432  tmp.str = str;
433  tmp.len = len;
434
435  /* is it in our static array? */
436  match = bsearch (&tmp, my_static, n_static, sizeof(struct tr_key_struct), compareKeys);
437  if (match != NULL)
438    {
439      *setme = match - my_static;
440      success = true;
441    }
442
443  /* was it added during runtime? */
444  if (!success && !tr_ptrArrayEmpty(&my_runtime))
445    {
446      size_t i;
447      struct tr_key_struct ** runtime = (struct tr_key_struct **) tr_ptrArrayBase (&my_runtime);
448      const size_t n_runtime = tr_ptrArraySize (&my_runtime);
449      for (i=0; i<n_runtime; ++i)
450        {
451          if (compareKeys (&tmp, runtime[i]) == 0)
452            {
453              *setme = TR_N_KEYS + i;
454              success = true;
455              break;
456            }
457        }
458    }
459
460  return success;
461}
462
463static tr_quark
464append_new_quark (const void * str, size_t len)
465{
466  tr_quark ret;
467  struct tr_key_struct * tmp;
468  tmp = tr_new (struct tr_key_struct, 1);
469  tmp->str = tr_strndup (str, len);
470  tmp->len = len;
471  ret = TR_N_KEYS + tr_ptrArraySize (&my_runtime);
472  tr_ptrArrayAppend (&my_runtime, tmp);
473  return ret;
474}
475
476tr_quark
477tr_quark_new (const void * str, size_t len)
478{
479  tr_quark ret = TR_KEY_NONE;
480
481  if (str == NULL)
482    len = 0;
483  else if (len == TR_BAD_SIZE)
484    len = strlen (str);
485
486  if (!tr_quark_lookup (str, len, &ret))
487    ret = append_new_quark (str, len);
488
489  return ret;
490}
491
492const char *
493tr_quark_get_string (tr_quark q, size_t * len)
494{
495  const struct tr_key_struct * tmp;
496
497  if (q < TR_N_KEYS)
498    tmp = &my_static[q];
499  else
500    tmp = tr_ptrArrayNth (&my_runtime, q-TR_N_KEYS);
501
502  if (len != NULL)
503    *len = tmp->len;
504
505  return tmp->str;
506}
Note: See TracBrowser for help on using the repository browser.