This file is indexed.

/usr/include/d/std/cstream.d is in libphobos2-ldc-dev 1:0.17.1-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
// Written in the D programming language.

/**
 * $(RED Warning: This module is considered out-dated and not up to Phobos'
 *       current standards. It will remain until we have a suitable replacement,
 *       but be aware that it will not remain long term.)
 *
 * The std.cstream module bridges core.stdc.stdio (or std.stdio) and std.stream.
 * Both core.stdc.stdio and std.stream are publicly imported by std.cstream.
 *
 * Macros:
 *      WIKI=Phobos/StdCstream
 *
 * Copyright: Copyright Ben Hinkle 2007 - 2009.
 * License:   $(WEB www.boost.org/LICENSE_1_0.txt, Boost License 1.0).
 * Authors:   Ben Hinkle
 * Source:    $(PHOBOSSRC std/_cstream.d)
 */
/*          Copyright Ben Hinkle 2007 - 2009.
 * Distributed under the Boost Software License, Version 1.0.
 *    (See accompanying file LICENSE_1_0.txt or copy at
 *          http://www.boost.org/LICENSE_1_0.txt)
 */
module std.cstream;

public import core.stdc.stdio;
public import std.stream;
version(unittest) import std.stdio;

import std.algorithm;

/**
 * A Stream wrapper for a C file of type FILE*.
 */
class CFile : Stream {
  protected FILE* cfile;

  /**
   * Create the stream wrapper for the given C file.
   * Params:
   *   cfile = a valid C $(B FILE) pointer to wrap.
   *   mode = a bitwise combination of $(B FileMode.In) for a readable file
   *          and $(B FileMode.Out) for a writeable file.
   *   seekable = indicates if the stream should be _seekable.
   */
  this(FILE* cfile, FileMode mode, bool seekable = false) {
    super();
    this.file = cfile;
    readable = cast(bool)(mode & FileMode.In);
    writeable = cast(bool)(mode & FileMode.Out);
    this.seekable = seekable;
  }

  /**
   * Closes the stream.
   */
  ~this() { close(); }

  /**
   * Property to get or set the underlying file for this stream.
   * Setting the file marks the stream as open.
   */
  @property FILE* file() { return cfile; }

  /**
   * Ditto
   */
  @property void file(FILE* cfile) {
    this.cfile = cfile;
    isopen = true;
  }

  /**
   * Overrides of the $(B Stream) methods to call the underlying $(B FILE*)
   * C functions.
   */
  override void flush() { fflush(cfile); }

  /**
   * Ditto
   */
  override void close() {
    if (isopen)
      fclose(cfile);
    isopen = readable = writeable = seekable = false;
  }

  /**
   * Ditto
   */
  override bool eof() {
    return cast(bool)(readEOF || feof(cfile));
  }

  /**
   * Ditto
   */
  override char getc() {
    return cast(char)fgetc(cfile);
  }

  /**
   * Ditto
   */
  override char ungetc(char c) {
    return cast(char)core.stdc.stdio.ungetc(c,cfile);
  }

  /**
   * Ditto
   */
  override size_t readBlock(void* buffer, size_t size) {
    size_t n = fread(buffer,1,size,cfile);
    readEOF = cast(bool)(n == 0);
    return n;
  }

  /**
   * Ditto
   */
  override size_t writeBlock(const void* buffer, size_t size) {
    return fwrite(buffer,1,size,cfile);
  }

  /**
   * Ditto
   */
  override ulong seek(long offset, SeekPos rel) {
    readEOF = false;
    if (fseek(cfile,cast(int)offset,rel) != 0)
      throw new SeekException("unable to move file pointer");
    return ftell(cfile);
  }

  /**
   * Ditto
   */
  override void writeLine(const(char)[] s) {
    writeString(s);
    writeString("\n");
  }

  /**
   * Ditto
   */
  override void writeLineW(const(wchar)[] s) {
    writeStringW(s);
    writeStringW("\n");
  }

  // run a few tests
  unittest {
    import std.file : deleteme;
    import std.internal.cstring : tempCString;

    auto stream_file = (std.file.deleteme ~ "-stream.txt").tempCString();
    FILE* f = fopen(stream_file,"w");
    assert(f !is null);
    CFile file = new CFile(f,FileMode.Out);
    int i = 666;
    // should be ok to write
    assert(file.writeable);
    file.writeLine("Testing stream.d:");
    file.writeString("Hello, world!");
    file.write(i);
    // string#1 + string#2 + int should give exacly that
    version (Windows)
        assert(file.position == 19 + 13 + 4);
    version (Posix)
        assert(file.position == 18 + 13 + 4);
    file.close();
    // no operations are allowed when file is closed
    assert(!file.readable && !file.writeable && !file.seekable);
    f = fopen(stream_file,"r");
    file = new CFile(f,FileMode.In,true);
    // should be ok to read
    assert(file.readable);
    auto line = file.readLine();
    auto exp = "Testing stream.d:";
    assert(line[0] == 'T');
    assert(line.length == exp.length);
    assert(!std.algorithm.cmp(line, "Testing stream.d:"));
    // jump over "Hello, "
    file.seek(7, SeekPos.Current);
    version (Windows)
      assert(file.position == 19 + 7);
    version (Posix)
      assert(file.position == 18 + 7);
    assert(!std.algorithm.cmp(file.readString(6), "world!"));
    i = 0; file.read(i);
    assert(i == 666);
    // string#1 + string#2 + int should give exacly that
    version (Windows)
      assert(file.position == 19 + 13 + 4);
    version (Posix)
      assert(file.position == 18 + 13 + 4);
    // we must be at the end of file
    file.close();
    f = fopen(stream_file,"w+");
    file = new CFile(f,FileMode.In|FileMode.Out,true);
    file.writeLine("Testing stream.d:");
    file.writeLine("Another line");
    file.writeLine("");
    file.writeLine("That was blank");
    file.position = 0;
    char[][] lines;
    foreach(char[] line; file) {
      lines ~= line.dup;
    }
    assert( lines.length == 5 );
    assert( lines[0] == "Testing stream.d:");
    assert( lines[1] == "Another line");
    assert( lines[2] == "");
    assert( lines[3] == "That was blank");
    file.position = 0;
    lines = new char[][5];
    foreach(ulong n, char[] line; file) {
      lines[cast(size_t)(n-1)] = line.dup;
    }
    assert( lines[0] == "Testing stream.d:");
    assert( lines[1] == "Another line");
    assert( lines[2] == "");
    assert( lines[3] == "That was blank");
    file.close();
    remove(stream_file);
  }
}

/**
 * CFile wrapper of core.stdc.stdio.stdin (not seekable).
 */
__gshared CFile din;

/**
 * CFile wrapper of core.stdc.stdio.stdout (not seekable).
 */
__gshared CFile dout;

/**
 * CFile wrapper of core.stdc.stdio.stderr (not seekable).
 */
__gshared CFile derr;

shared static this() {
  // open standard I/O devices
  din = new CFile(core.stdc.stdio.stdin,FileMode.In);
  dout = new CFile(core.stdc.stdio.stdout,FileMode.Out);
  derr = new CFile(core.stdc.stdio.stderr,FileMode.Out);
}