This file is indexed.

/usr/include/wvstreams/wvtclstring.h is in libwvstreams-dev 4.6.1-7.

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
/* -*- Mode: C++ -*-
 * Worldvisions Weaver Software:
 *   Copyright (C) 1997-2002 Net Integration Technologies, Inc.
 * 
 * FIXME:
 *   It would be possible to represent arbitrary binary blobs using this
 *   technique, but we'd have to avoid using null-terminated strings in a few
 *   places, particularly in the input to wvtcl_escape().
 * 
 *   We could even make encoded binary blobs printable (although that's not
 *   _strictly_ necessary in all cases) by encoding non-printable characters
 *   using \x## notation, if wvtcl_escape() or wvtcl_unescape() supported it.
 */
/** \file
 * Functions to handle "tcl-style" strings and lists.
 * 
 * Using wvtcl_encode(), you can encode _any_ list of strings into a single
 * string, then reliably split the single string back into the list using
 * wvtcl_decode().
 * 
 * You can create recursive lists of lists by simply running wvtcl_encode()
 * on a list of strings returned from wvtcl_encode().
 * 
 * Example list encodings (all of the following lists have exactly 3 elements):
 *     foo blah weasels
 *     e1 elem2 {element 3}
 *     x1 {} "element 3"
 *     w x y\ z
 * 
 * Example list of lists:
 *     foo\ blah\ weasels {e1 elem2 {element 3}} {w x y\ z}
 */

#ifndef __WVTCLSTRING_H
#define __WVTCLSTRING_H

#include "wvbuf.h"
class WvStringMask;

// the default set of "nasties", ie. characters that need to be escaped if
// they occur somewhere in a string.
#define WVTCL_NASTY_SPACES_STR    " \t\n\r"
extern const WvStringMask WVTCL_NASTY_SPACES;

// Another default set of nasties, but only splitting on newlines
#define WVTCL_NASTY_NEWLINES_STR  "\n\r"
extern const WvStringMask WVTCL_NASTY_NEWLINES;

// {, }, \, and " are always considered "nasty."
#define WVTCL_ALWAYS_NASTY_CASE '{': case '}': case '\\': case '"'


// the default set of split characters, ie. characters that separate elements
// in a list.  If these characters appear unescaped and not between {} or ""
// in a list, they signify the end of the current element.
#define WVTCL_SPLITCHARS_STR " \t\n\r"
extern const WvStringMask WVTCL_SPLITCHARS;


/**
 * tcl-escape a string.  There are three ways to do this:
 *   1) Strings that need no escaping are unchanged.
 *   2) Strings containing characters in 'nasties' are usually encoded just
 *         by enclosing the unmodified string in braces.
 *         (For example, "foo blah" becomes "{foo blah}")
 *   3) Strings containing nasties _and_ unmatched braces are encoded using
 *         backslash notation.  (For example, " foo} " becomes "\ foo\}\ "
 */
WvString wvtcl_escape(WvStringParm s,
		      const WvStringMask &nasties = WVTCL_NASTY_SPACES);


/**
 * tcl-unescape a string.  This is generally the reverse of wvtcl_escape,
 * except we can reverse any backslashified or embraced string, even if it
 * doesn't follow the "simplest encoding" rules used by wvtcl_escape.  We
 * can also handle strings in double-quotes, ie. '"foo"' becomes 'foo'.
 */
WvString wvtcl_unescape(WvStringParm s);


/**
 * encode a tcl-style list.  This is easily done by tcl-escaping each
 * string in 'l', then appending the escaped strings together, separated by
 * the first char in splitchars.
 */
WvString wvtcl_encode(WvList<WvString> &l,
		      const WvStringMask &nasties = WVTCL_NASTY_SPACES,
		      const WvStringMask &splitchars = WVTCL_SPLITCHARS);

/**
 * Get a single tcl word from an input buffer, and return the rest of the
 * buffer untouched.  If no word can be created from the buffer, return
 * a null string and leave the buffer unmodified.
 */
WvString wvtcl_getword(WvBuf &buf,
		       const WvStringMask &splitchars = WVTCL_SPLITCHARS,
		       bool do_unescape = true);

/**
 * split a tcl-style list.  There are some special "convenience" features
 * here, which allow users to create lists more flexibly than wvtcl_encode
 * would do.
 * 
 * Elements of the list are separated by any number of any characters from
 * the 'splitchars' list.
 * 
 * Quotes are allowed around elements: '"foo"' becomes 'foo'.  These work
 * mostly like braces, except the string is assumed to be backslashified.
 * That is, '"\ "' becomes ' ', whereas '{\ }' becomes '\ ' (ie. the backslash
 * wouldn't be removed).
 * 
 * Zero-length elements must be represented by {}
 * 
 */
void wvtcl_decode(WvList<WvString> &l, WvStringParm _s,
		  const WvStringMask &splitchars = WVTCL_SPLITCHARS,
		  bool do_unescape = true);

#endif // __WVTCLSTRING_H