/usr/include/hphp/util/hdf.h is in hhvm-dev 3.11.1+dfsg-1ubuntu1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 | /*
+----------------------------------------------------------------------+
| HipHop for PHP |
+----------------------------------------------------------------------+
| Copyright (c) 2010-2015 Facebook, Inc. (http://www.facebook.com) |
+----------------------------------------------------------------------+
| This source file is subject to version 3.01 of the PHP license, |
| that is bundled with this package in the file LICENSE, and is |
| available through the world-wide-web at the following url: |
| http://www.php.net/license/3_01.txt |
| If you did not receive a copy of the PHP license and are unable to |
| obtain it through the world-wide-web, please send a note to |
| license@php.net so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
*/
#ifndef incl_HPHP_CONFIG_HDF_H_
#define incl_HPHP_CONFIG_HDF_H_
#include <string>
#include <map>
#include <set>
#include <vector>
#include <boost/container/flat_set.hpp>
#include "hphp/util/exception.h"
#include "hphp/util/hash-map-typedefs.h"
#include "hphp/util/functional.h"
#include "hphp/neo/neo_hdf.h"
namespace HPHP {
///////////////////////////////////////////////////////////////////////////////
/**
* A super-fast hierarchical data structure, wrapped around ClearSilver's HDF
* data format: http://www.clearsilver.net/docs/man_hdf.hdf
*
* HDF is a serialization format that emphasizes cleanness and simplicity when
* representing hierarchical data. It's designed to be fast parsing and
* accessing. One example is,
*
* Server {
* Name = MyTestServer
* IP.1 = 192.168.100.100
* IP.2 = 192.168.100.101
* }
*/
class HdfRaw; // reference counting HDF* raw pointer, implmented in .cpp file
class Hdf {
public:
/**
* Constructors.
*/
Hdf(); // create an empty HDF tree
explicit Hdf(const char *filename); // open the specified file
explicit Hdf(const std::string &filename); // open the specified file
explicit Hdf(const Hdf *hdf, const char *name); // constructing a sub-node
Hdf(const Hdf &hdf); // make a copy by reference
explicit Hdf(HDF *hdf); // attaching a raw pointer
~Hdf();
/**
* Is this an empty Hdf?
*/
bool isEmpty() const;
/**
* Close current and make a copy of the specified.
*/
void assign(const Hdf &hdf);
/**
* Copy specified without closing current.
*/
void copy(const Hdf &hdf);
/**
* Either close current file and open a new file, or append a file's content.
*/
void open(const char *filename);
void open(const std::string &filename) { open(filename.c_str());}
void append(const char *filename);
void append(const std::string &filename) { append(filename.c_str());}
void close();
/**
* Get a list of node names that are visited or not visited. Great for lint
* purpose, finding nodes that are invalid for configurations, for example.
* Use exclusion to skip checking certain node names. For example,
*
* LintExcludePatterns {
* * = FutureConfigName
* * = *endwith
* * = startwith*
* * = *containing*
* }
*
* The pattern is NOT a full regex, but only the simple 3 as above.
*
* When visited = true, return a list of nodes that are visited.
*/
void lint(std::vector<std::string> &names,
const char *excludePatternNode = "LintExcludePatterns",
bool visited = false);
void setVisited(bool visited = true);
/**
* Read or dump this entire tree in HDF format.
*/
void fromString(const char *input);
const char *toString() const;
void write(const char *filename) const;
void write(const std::string &filename) const { write(filename.c_str());}
/**
* Get this node's value. When node is not present or node's value is not
* parsable, return default value "defValue" instead.
*
* Boolean "false" is defined as one of these values and anything else is
* "true" (except absent node will take default value):
* 1. empty string
* 2. 0 (note: string "00" or longer are not "false").
* 3. string "false", "no" or "off" case-insensitively
*
* Numbers can also be specified in hex (0x prefix) or octal (0 prefix). For
* any values that are not entirely parsable to be a number, it will return
* default value instead.
*/
bool configGetBool(bool defValue = false) const;
const char *configGet(const char *defValue = nullptr) const;
std::string configGetString(const std::string &defValue = "") const;
char configGetByte(char defValue = 0) const;
unsigned char configGetUByte (unsigned char defValue = 0) const;
int16_t configGetInt16(int16_t defValue = 0) const;
uint16_t configGetUInt16(uint16_t defValue = 0) const;
int32_t configGetInt32(int32_t defValue = 0) const;
uint32_t configGetUInt32(uint32_t defValue = 0) const;
int64_t configGetInt64(int64_t defValue = 0) const;
uint64_t configGetUInt64(uint64_t defValue = 0) const;
double configGetDouble(double defValue = 0) const;
void configGet(std::vector<std::string> &values) const;
void configGet(std::set<std::string> &values) const;
void configGet(std::set<std::string, stdltistr> &values) const;
void configGet(boost::container::flat_set<std::string> &values) const;
void configGet(std::map<std::string, std::string> &values) const;
void configGet(std::map<std::string, std::string, stdltistr> &values) const;
void configGet(hphp_string_imap<std::string> &values) const;
/**
* Helper function to convert a config string value to bool.
*/
static bool convertRawConfigToBool(const char *v);
/**
* Set this node's value.
*/
void set(const char *value);
void set(const std::string &value) { set(value.c_str());}
void set(bool value) { set(value ? "1" : "0");}
void set(char value) { set((int64_t)value);}
void set(unsigned char value) { set((uint64_t)value);}
void set(int16_t value) { set((int64_t)value);}
void set(uint16_t value) { set((uint64_t)value);}
void set(int32_t value) { set((int64_t)value);}
void set(uint32_t value) { set((uint64_t)value);}
void set(int64_t value);
void set(uint64_t value);
void set(double value);
Hdf &operator=(const char *value) { set(value); return *this;}
Hdf &operator=(const std::string &value) { set(value); return *this;}
Hdf &operator=(bool value) { set(value); return *this;}
Hdf &operator=(char value) { set(value); return *this;}
Hdf &operator=(unsigned char value) { set(value); return *this;}
Hdf &operator=(int16_t value) { set(value); return *this;}
Hdf &operator=(uint16_t value) { set(value); return *this;}
Hdf &operator=(int32_t value) { set(value); return *this;}
Hdf &operator=(uint32_t value) { set(value); return *this;}
Hdf &operator=(int64_t value) { set(value); return *this;}
Hdf &operator=(uint64_t value) { set(value); return *this;}
Hdf &operator=(double value) { set(value); return *this;}
Hdf &operator=(const Hdf &hdf);
/**
* Get this node's fully qualified path or just one-level node name.
*/
std::string getFullPath() const;
std::string getName(bool markVisited = true) const;
/**
* Get this node's parent.
*/
const Hdf parent() const;
Hdf parent();
/**
* Get a sub-node.
*/
const Hdf operator[](int name) const;
const Hdf operator[](const char *name) const;
const Hdf operator[](const std::string &name) const;
Hdf operator[](int name);
Hdf operator[](const char *name);
Hdf operator[](const std::string &name);
/**
* Note that this is different than getting a boolean value. If "name" is
* present, testing whether a subnode exists. Otherwise, testing myself is
* present or not.
*/
bool exists() const;
bool exists(int name) const;
bool exists(const char *name) const;
bool exists(const std::string &name) const;
/**
* Note that this is NOT testing existence, but reading a boolean value.
*/
bool operator!() const { return !configGetBool();}
/**
* Removes a sub-node from parent.
*/
void remove(int name) const;
void remove(const char *name) const;
void remove(const std::string &name) const;
/**
* Iterations. For example,
*
* for (Hdf hdf = parent.firstChild(); hdf.exists(); hdf = hdf.next()) {
* }
*
* Please use "hdf.exists()" for testing than casting it to boolean.
*/
Hdf firstChild(bool markVisited = true) const;
Hdf next(bool markVisited = true) const;
/**
* Comparisons
*/
int compare(const char *v) const;
int compare(const std::string &v) const;
int compare(char v) const;
int compare(unsigned char v) const;
int compare(int16_t v) const;
int compare(uint16_t v) const;
int compare(int32_t v) const;
int compare(uint32_t v) const;
int compare(int64_t v) const;
int compare(uint64_t v) const;
int compare(double v) const;
bool operator==(const char *v) const { return compare(v) == 0;}
bool operator!=(const char *v) const { return compare(v) != 0;}
bool operator>=(const char *v) const { return compare(v) >= 0;}
bool operator<=(const char *v) const { return compare(v) <= 0;}
bool operator> (const char *v) const { return compare(v) > 0;}
bool operator< (const char *v) const { return compare(v) < 0;}
bool operator==(const std::string &v) const { return compare(v) == 0;}
bool operator!=(const std::string &v) const { return compare(v) != 0;}
bool operator>=(const std::string &v) const { return compare(v) >= 0;}
bool operator<=(const std::string &v) const { return compare(v) <= 0;}
bool operator> (const std::string &v) const { return compare(v) > 0;}
bool operator< (const std::string &v) const { return compare(v) < 0;}
bool operator==(char v) const { return compare(v) == 0;}
bool operator!=(char v) const { return compare(v) != 0;}
bool operator>=(char v) const { return compare(v) >= 0;}
bool operator<=(char v) const { return compare(v) <= 0;}
bool operator> (char v) const { return compare(v) > 0;}
bool operator< (char v) const { return compare(v) < 0;}
bool operator==(unsigned char v) const { return compare(v) == 0;}
bool operator!=(unsigned char v) const { return compare(v) != 0;}
bool operator>=(unsigned char v) const { return compare(v) >= 0;}
bool operator<=(unsigned char v) const { return compare(v) <= 0;}
bool operator> (unsigned char v) const { return compare(v) > 0;}
bool operator< (unsigned char v) const { return compare(v) < 0;}
bool operator==(int16_t v) const { return compare(v) == 0;}
bool operator!=(int16_t v) const { return compare(v) != 0;}
bool operator>=(int16_t v) const { return compare(v) >= 0;}
bool operator<=(int16_t v) const { return compare(v) <= 0;}
bool operator> (int16_t v) const { return compare(v) > 0;}
bool operator< (int16_t v) const { return compare(v) < 0;}
bool operator==(uint16_t v) const { return compare(v) == 0;}
bool operator!=(uint16_t v) const { return compare(v) != 0;}
bool operator>=(uint16_t v) const { return compare(v) >= 0;}
bool operator<=(uint16_t v) const { return compare(v) <= 0;}
bool operator> (uint16_t v) const { return compare(v) > 0;}
bool operator< (uint16_t v) const { return compare(v) < 0;}
bool operator==(int32_t v) const { return compare(v) == 0;}
bool operator!=(int32_t v) const { return compare(v) != 0;}
bool operator>=(int32_t v) const { return compare(v) >= 0;}
bool operator<=(int32_t v) const { return compare(v) <= 0;}
bool operator> (int32_t v) const { return compare(v) > 0;}
bool operator< (int32_t v) const { return compare(v) < 0;}
bool operator==(uint32_t v) const { return compare(v) == 0;}
bool operator!=(uint32_t v) const { return compare(v) != 0;}
bool operator>=(uint32_t v) const { return compare(v) >= 0;}
bool operator<=(uint32_t v) const { return compare(v) <= 0;}
bool operator> (uint32_t v) const { return compare(v) > 0;}
bool operator< (uint32_t v) const { return compare(v) < 0;}
bool operator==(int64_t v) const { return compare(v) == 0;}
bool operator!=(int64_t v) const { return compare(v) != 0;}
bool operator>=(int64_t v) const { return compare(v) >= 0;}
bool operator<=(int64_t v) const { return compare(v) <= 0;}
bool operator> (int64_t v) const { return compare(v) > 0;}
bool operator< (int64_t v) const { return compare(v) < 0;}
bool operator==(uint64_t v) const { return compare(v) == 0;}
bool operator!=(uint64_t v) const { return compare(v) != 0;}
bool operator>=(uint64_t v) const { return compare(v) >= 0;}
bool operator<=(uint64_t v) const { return compare(v) <= 0;}
bool operator> (uint64_t v) const { return compare(v) > 0;}
bool operator< (uint64_t v) const { return compare(v) < 0;}
bool operator==(double v) const { return compare(v) == 0;}
bool operator!=(double v) const { return compare(v) != 0;}
bool operator>=(double v) const { return compare(v) >= 0;}
bool operator<=(double v) const { return compare(v) <= 0;}
bool operator> (double v) const { return compare(v) > 0;}
bool operator< (double v) const { return compare(v) < 0;}
/**
* Throw if there is an error from ClearSilver library.
*/
static void CheckNeoError(NEOERR *err);
private:
mutable HDF *m_hdf ; // cached HDF pointer
HdfRaw *m_rawp; // raw pointer
std::string m_path; // parent path
std::string m_name; // my name
mutable char *m_dump; // entire tree dump in HDF format
/**
* There are only two different "modes" of an Hdf object: hdf_ being null or
* non-null. First case is when we proactively constructed an Hdf object by
* either opening a file or starting from scratch by calling Hdf(). Second
* case is when we attach a raw HDF*, almost exclusively used by iterations.
*/
HDF *getRaw() const;
/**
* Parse value as a signed integer and check to make sure it's within
* [-maxValue-1, maxValue]. If not, throw an HdfDataTypeException
* with specified type string. If node is absent, return default value.
*/
int64_t getInt(int64_t defValue, const char *type, int64_t maxValue) const;
/**
* Parse value as a unsigned integer and check against mask to make sure
* it's in the specified range. If not, throw an HdfDataTypeException
* with specified type string. If node is absent, return default value.
*/
uint64_t getUInt(uint64_t defValue, const char *type, uint64_t mask) const;
/**
* Implementation of parent() calls.
*/
Hdf parentImpl() const;
bool lintImpl(std::vector<std::string> &names,
const std::vector<std::string> &excludes, bool visited);
};
/**
* Base class of all exceptions Hdf class might throw.
*/
class HdfException : public Exception {
public:
HdfException(ATTRIBUTE_PRINTF_STRING const char *fmt, ...)
ATTRIBUTE_PRINTF(2,3);
EXCEPTION_COMMON_IMPL(HdfException);
};
/**
* Trying to get a node's value, but it's not in the specified type.
*/
class HdfDataTypeException : public HdfException {
public:
HdfDataTypeException(const Hdf *hdf, const char *type, const char *value)
: HdfException("HDF node [%s]'s value \"%s\" is not %s",
hdf->getFullPath().c_str(), value, type) {
}
EXCEPTION_COMMON_IMPL(HdfDataTypeException);
};
/**
* A node's value is not expected.
*/
class HdfDataValueException : public HdfException {
public:
explicit HdfDataValueException(const Hdf *hdf, const char *expected = "")
: HdfException("HDF node [%s]'s value \"%s\" is not expected %s",
hdf->getFullPath().c_str(), hdf->configGet(""), expected) {
}
EXCEPTION_COMMON_IMPL(HdfDataValueException);
};
/**
* Calling a function in wrong context.
*/
class HdfInvalidOperation : public HdfException {
public:
explicit HdfInvalidOperation(const char *operation)
: HdfException("Invalid operation: %s", operation) {
}
EXCEPTION_COMMON_IMPL(HdfInvalidOperation);
};
///////////////////////////////////////////////////////////////////////////////
}
#endif // incl_HPHP_CONFIG_HDF_H_
|