blob: 9e59bd378f7048b2e5dd041a36e44a660d104ac4 [file] [log] [blame]
Constantin Kaplinskya2adc8d2006-05-25 05:01:55 +00001/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved.
2 *
3 * This is free software; you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License as published by
5 * the Free Software Foundation; either version 2 of the License, or
6 * (at your option) any later version.
7 *
8 * This software is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this software; if not, write to the Free Software
15 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
16 * USA.
17 */
18
19//
20// util.h - miscellaneous useful bits
21//
22
23#ifndef __RFB_UTIL_H__
24#define __RFB_UTIL_H__
25
Adam Tkac8aee1a82009-09-04 12:08:56 +000026#ifdef HAVE_CONFIG_H
27#include <config.h>
Adam Tkacad1cbd92008-10-06 14:08:00 +000028#endif
29
Constantin Kaplinskya2adc8d2006-05-25 05:01:55 +000030#include <limits.h>
31#include <string.h>
32
Pierre Ossman5bc20a62011-11-08 12:42:41 +000033struct timeval;
34
Pierre Ossmanba6fbfe2015-03-03 16:41:29 +010035#ifdef __GNUC__
36# define __printf_attr(a, b) __attribute__((__format__ (__printf__, a, b)))
37#else
38# define __printf_attr(a, b)
39#endif // __GNUC__
40
Steve Kondik0c81bbb2017-07-10 08:56:00 -070041#ifndef __unused_attr
42# define __unused_attr __attribute((__unused__))
43#endif
44
Constantin Kaplinskya2adc8d2006-05-25 05:01:55 +000045namespace rfb {
46
47 // -=- Class to handle cleanup of arrays of characters
48 class CharArray {
49 public:
50 CharArray() : buf(0) {}
51 CharArray(char* str) : buf(str) {} // note: assumes ownership
52 CharArray(int len) {
Jan Grulicha752d8f2018-10-01 10:17:20 +020053 buf = new char[len]();
Constantin Kaplinskya2adc8d2006-05-25 05:01:55 +000054 }
55 ~CharArray() {
56 delete [] buf;
57 }
Pierre Ossmanba6fbfe2015-03-03 16:41:29 +010058 void format(const char *fmt, ...) __printf_attr(2, 3);
Constantin Kaplinskya2adc8d2006-05-25 05:01:55 +000059 // Get the buffer pointer & clear it (i.e. caller takes ownership)
60 char* takeBuf() {char* tmp = buf; buf = 0; return tmp;}
61 void replaceBuf(char* b) {delete [] buf; buf = b;}
62 char* buf;
63 private:
64 CharArray(const CharArray&);
65 CharArray& operator=(const CharArray&);
66 };
67
Adam Tkacd36b6262009-09-04 10:57:20 +000068 char* strDup(const char* s);
69 void strFree(char* s);
70
Constantin Kaplinskya2adc8d2006-05-25 05:01:55 +000071 // Returns true if split successful. Returns false otherwise.
72 // ALWAYS *copies* first part of string to out1 buffer.
73 // If limiter not found, leaves out2 alone (null) and just copies to out1.
74 // If out1 or out2 non-zero, calls strFree and zeroes them.
75 // If fromEnd is true, splits at end of string rather than beginning.
76 // Either out1 or out2 may be null, in which case the split will not return
77 // that part of the string. Obviously, setting both to 0 is not useful...
78 bool strSplit(const char* src, const char limiter, char** out1, char** out2, bool fromEnd=false);
79
80 // Returns true if src contains c
81 bool strContains(const char* src, char c);
82
83 // Copies src to dest, up to specified length-1, and guarantees termination
84 void strCopy(char* dest, const char* src, int destlen);
85
86
87 // HELPER functions for timeout handling
88
89 // soonestTimeout() is a function to help work out the soonest of several
90 // timeouts.
91 inline void soonestTimeout(int* timeout, int newTimeout) {
92 if (newTimeout && (!*timeout || newTimeout < *timeout))
93 *timeout = newTimeout;
94 }
95
96 // secsToMillis() turns seconds into milliseconds, capping the value so it
97 // can't wrap round and become -ve
98 inline int secsToMillis(int secs) {
99 return (secs < 0 || secs > (INT_MAX/1000) ? INT_MAX : secs * 1000);
100 }
Pierre Ossman5bc20a62011-11-08 12:42:41 +0000101
Pierre Ossmana99d14d2015-12-13 15:43:46 +0100102 // Returns time elapsed between two moments in milliseconds.
103 unsigned msBetween(const struct timeval *first,
104 const struct timeval *second);
105
Pierre Ossman5bc20a62011-11-08 12:42:41 +0000106 // Returns time elapsed since given moment in milliseconds.
107 unsigned msSince(const struct timeval *then);
Pierre Ossman64624342015-03-03 16:30:13 +0100108
Pierre Ossmana99d14d2015-12-13 15:43:46 +0100109 // Returns true if first happened before seconds
110 bool isBefore(const struct timeval *first,
111 const struct timeval *second);
112
Pierre Ossman64624342015-03-03 16:30:13 +0100113 size_t siPrefix(long long value, const char *unit,
Pierre Ossman921f6c82017-02-24 12:33:09 +0100114 char *buffer, size_t maxlen, int precision=6);
Pierre Ossman64624342015-03-03 16:30:13 +0100115 size_t iecPrefix(long long value, const char *unit,
Pierre Ossman921f6c82017-02-24 12:33:09 +0100116 char *buffer, size_t maxlen, int precision=6);
Constantin Kaplinskya2adc8d2006-05-25 05:01:55 +0000117}
118
119// Some platforms (e.g. Windows) include max() and min() macros in their
120// standard headers, but they are also standard C++ template functions, so some
121// C++ headers will undefine them. So we steer clear of the names min and max
122// and define __rfbmin and __rfbmax instead.
123
124#ifndef __rfbmax
125#define __rfbmax(a,b) (((a) > (b)) ? (a) : (b))
126#endif
127#ifndef __rfbmin
128#define __rfbmin(a,b) (((a) < (b)) ? (a) : (b))
129#endif
130
Constantin Kaplinskya2adc8d2006-05-25 05:01:55 +0000131#endif