Annotation of embedaddon/php/ext/spl/internal/splfileobject.inc, revision 1.1.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>