Annotation of embedaddon/php/ext/spl/internal/splfileobject.inc, revision 1.1
1.1 ! misho 1: <?php
! 2:
! 3: /** @file splfileobject.inc
! 4: * @ingroup SPL
! 5: * @brief class FileObject
! 6: * @author Marcus Boerger
! 7: * @date 2003 - 2009
! 8: *
! 9: * SPL - Standard PHP Library
! 10: */
! 11:
! 12: /** @ingroup SPL
! 13: * @brief Object representation for any stream
! 14: * @author Marcus Boerger
! 15: * @version 1.1
! 16: * @since PHP 5.1
! 17: */
! 18: class SplFileObject extends SplFileInfo implements RecursiveIterator, SeekableIterator
! 19: {
! 20: /** Flag: wheter to suppress new lines */
! 21: const DROP_NEW_LINE = 0x00000001;
! 22:
! 23: private $fp;
! 24: private $fname;
! 25: private $line = NULL;
! 26: private $lnum = 0;
! 27: private $max_len = 0;
! 28: private $flags = 0;
! 29: private $delimiter= ',';
! 30: private $enclosure= '"';
! 31:
! 32: /**
! 33: * Constructs a new file object
! 34: *
! 35: * @param $file_name The name of the stream to open
! 36: * @param $open_mode The file open mode
! 37: * @param $use_include_path Whether to search in include paths
! 38: * @param $context A stream context
! 39: * @throw RuntimeException If file cannot be opened (e.g. insufficient
! 40: * access rights).
! 41: */
! 42: function __construct($file_name, $open_mode = 'r', $use_include_path = false, $context = NULL)
! 43: {
! 44: $this->fp = fopen($file_name, $open_mode, $use_include_path, $context);
! 45: if (!$this->fp)
! 46: {
! 47: throw new RuntimeException("Cannot open file $file_name");
! 48: }
! 49: $this->fname = $file_name;
! 50: }
! 51:
! 52: /**
! 53: * @return whether the end of the stream is reached
! 54: */
! 55: function eof()
! 56: {
! 57: return eof($this->fp);
! 58: }
! 59:
! 60: /** increase current line number
! 61: * @return next line from stream
! 62: */
! 63: function fgets()
! 64: {
! 65: $this->freeLine();
! 66: $this->lnum++;
! 67: $buf = fgets($this->fp, $this->max_len);
! 68:
! 69: return $buf;
! 70: }
! 71:
! 72: /**
! 73: * @param delimiter character used as field separator
! 74: * @param enclosure end of
! 75: * @return array containing read data
! 76: */
! 77: function fgetcsv($delimiter = NULL, $enclosure = NULL)
! 78: {
! 79: $this->freeLine();
! 80: $this->lnum++;
! 81: switch(fun_num_args())
! 82: {
! 83: case 0:
! 84: $delimiter = $this->delimiter;
! 85: case 1:
! 86: $enclosure = $this->enclosure;
! 87: default:
! 88: case 2:
! 89: break;
! 90: }
! 91: return fgetcsv($this->fp, $this->max_len, $delimiter, $enclosure);
! 92: }
! 93:
! 94: /**
! 95: * Set the delimiter and enclosure character used in fgetcsv
! 96: *
! 97: * @param delimiter new delimiter, defaults to ','
! 98: * @param enclosure new enclosure, defaults to '"'
! 99: */
! 100: function setCsvControl($delimiter = ';', $enclosure = '"')
! 101: {
! 102: $this->delimiter = $delimiter;
! 103: $this->enclosure = $enclosure;
! 104: }
! 105:
! 106: /**
! 107: * @return array(delimiter, enclosure) as used in fgetcsv
! 108: */
! 109: function getCsvControl($delimiter = ',', $enclosure = '"')
! 110: {
! 111: return array($this->delimiter, $this->enclosure);
! 112: }
! 113:
! 114: /**
! 115: * @param operation lock operation (LOCK_SH, LOCK_EX, LOCK_UN, LOCK_NB)
! 116: * @retval $wouldblock whether the operation would block
! 117: */
! 118: function flock($operation, &$wouldblock)
! 119: {
! 120: return flock($this->fp, $operation, $wouldblock);
! 121: }
! 122:
! 123: /**
! 124: * Flush current data
! 125: * @return success or failure
! 126: */
! 127: function fflush()
! 128: {
! 129: return fflush($this->fp);
! 130: }
! 131:
! 132: /**
! 133: * @return current file position
! 134: */
! 135: function ftell()
! 136: {
! 137: return ftell($this->fp);
! 138: }
! 139:
! 140: /**
! 141: * @param pos new file position
! 142: * @param whence seek method (SEEK_SET, SEEK_CUR, SEEK_END)
! 143: * @return Upon success, returns 0; otherwise, returns -1. Note that
! 144: * seeking past EOF is not considered an error.
! 145: */
! 146: function fseek($pos, $whence = SEEK_SET)
! 147: {
! 148: return fseek($this->fp, $pos, $whence);
! 149: }
! 150:
! 151: /**
! 152: * @return next char from file
! 153: * @note a new line character does not increase $this->lnum
! 154: */
! 155: function fgetc()
! 156: {
! 157: $this->freeLine();
! 158: $c = fgetc($this->fp);
! 159: if ($c == '\n') {
! 160: $this->lnum++;
! 161: }
! 162: }
! 163:
! 164: /** Read and return remaining part of stream
! 165: * @return size of remaining part passed through
! 166: */
! 167: function fpassthru()
! 168: {
! 169: return fpassthru($this->fp);
! 170: }
! 171:
! 172: /** Get a line from the file and strip HTML tags
! 173: * @param $allowable_tags tags to keep in the string
! 174: */
! 175: function fgetss($allowable_tags = NULL)
! 176: {
! 177: return fgetss($this->fp, $allowable_tags);
! 178: }
! 179:
! 180: /** Scan the next line
! 181: * @param $format string specifying format to parse
! 182: */
! 183: function fscanf($format /* , ... */)
! 184: {
! 185: $this->freeLine();
! 186: $this->lnum++;
! 187: return fscanf($this->fp, $format /* , ... */);
! 188: }
! 189:
! 190: /**
! 191: * @param $str to write
! 192: * @param $length maximum line length to write
! 193: */
! 194: function fwrite($str, $length = NULL)
! 195: {
! 196: return fwrite($this->fp, $length);
! 197: }
! 198:
! 199: /**
! 200: * @return array of file stat information
! 201: */
! 202: function fstat()
! 203: {
! 204: return fstat($this->fp);
! 205: }
! 206:
! 207: /**
! 208: * @param $size new size to truncate file to
! 209: */
! 210: function ftruncate($size)
! 211: {
! 212: return ftruncate($this->fp, $size);
! 213: }
! 214:
! 215: /**
! 216: * @param $flags new flag set
! 217: */
! 218: function setFlags($flags)
! 219: {
! 220: $this->flags = $flags;
! 221: }
! 222:
! 223: /**
! 224: * @return current set of flags
! 225: */
! 226: function getFlags()
! 227: {
! 228: return $this->flags;
! 229: }
! 230:
! 231: /**
! 232: * @param $max_len set the maximum line length read
! 233: */
! 234: function setMaxLineLen($max_len)
! 235: {
! 236: $this->max_len = $max_len;
! 237: }
! 238:
! 239: /**
! 240: * @return current setting for max line
! 241: */
! 242: function getMaxLineLen()
! 243: {
! 244: return $this->max_len;
! 245: }
! 246:
! 247: /**
! 248: * @return false
! 249: */
! 250: function hasChildren()
! 251: {
! 252: return false;
! 253: }
! 254:
! 255: /**
! 256: * @return false
! 257: */
! 258: function getChildren()
! 259: {
! 260: return NULL;
! 261: }
! 262:
! 263: /**
! 264: * Invalidate current line buffer and set line number to 0.
! 265: */
! 266: function rewind()
! 267: {
! 268: $this->freeLine();
! 269: $this->lnum = 0;
! 270: }
! 271:
! 272: /**
! 273: * @return whether more data can be read
! 274: */
! 275: function valid()
! 276: {
! 277: return !$this->eof();
! 278: }
! 279:
! 280: /**
! 281: * @note Fill current line buffer if not done yet.
! 282: * @return line buffer
! 283: */
! 284: function current()
! 285: {
! 286: if (is_null($this->line))
! 287: {
! 288: $this->line = getCurrentLine();
! 289: }
! 290: return $this->line;
! 291: }
! 292:
! 293: /**
! 294: * @return line number
! 295: * @note fgetc() will increase the line number when reaing a new line char.
! 296: * This has the effect key() called on a read a new line will already
! 297: * return the increased line number.
! 298: * @note Line counting works as long as you only read the file and do not
! 299: * use fseek().
! 300: */
! 301: function key()
! 302: {
! 303: return $this->lnum;
! 304: }
! 305:
! 306: /** Invalidate current line buffer.
! 307: */
! 308: function next()
! 309: {
! 310: $this->freeLine();
! 311: }
! 312:
! 313: /**
! 314: * @return next line read from file and increase the line counter
! 315: */
! 316: private function readLine()
! 317: {
! 318: if ($this->eof())
! 319: {
! 320: $this->freeLine();
! 321: throw new RuntimeException("Cannot read from file " . $this->fname);
! 322: }
! 323: if ($this->line) {
! 324: $this->lnum++;
! 325: }
! 326: $this->freeLine();
! 327: $this->line = fgets($this->fp, $this->max_len);
! 328: return $this->line;
! 329: }
! 330:
! 331: /**
! 332: * Free the current line buffer and increment the line counter
! 333: */
! 334: private function freeLine()
! 335: {
! 336: if ($this->line) {
! 337: $this->line = NULL;
! 338: }
! 339: }
! 340:
! 341: /*
! 342: * @note If you DO overload this function key() and current() will increment
! 343: * $this->lnum automatically. If not then function reaLine() will do
! 344: * that for you.
! 345: */
! 346: function getCurrentLine()
! 347: {
! 348: $this->freeLine();
! 349: if ($this->eof())
! 350: {
! 351: throw new RuntimeException("Cannot read from file " . $this->fname);
! 352: }
! 353: $this->readLine();
! 354: }
! 355:
! 356: /**
! 357: * @return current line
! 358: */
! 359: function __toString()
! 360: {
! 361: return current();
! 362: }
! 363:
! 364: /**
! 365: * @param $line_pos Seek to this line
! 366: */
! 367: function seek($line_pos)
! 368: {
! 369: $this->rewind();
! 370: while($this->lnum < $line_pos && !$this->eof())
! 371: {
! 372: $this->getCurrentLine();
! 373: }
! 374: }
! 375: }
! 376:
! 377: ?>
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>