/* * Copyright (c) 2001-2008, Perforce Software, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL PERFORCE SOFTWARE, INC. BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "clientapi.h" #include "undefdups.h" extern "C" { #include "php.h" } #include "Zend/zend_exceptions.h" #include "php_macros.h" #include "php_p4result.h" #include "php_p4_exception.h" /* Create a new P4Result instance. Call Reset whenever creating an instance. */ P4Result::P4Result() : output(NULL), errors(NULL), warnings(NULL) { Reset(); } /* Destroy P4Result instance. */ P4Result::~P4Result() { if ( output != NULL ) { if ( Z_TYPE_P(output) == IS_ARRAY ) zval_dtor(output); efree(output); output = NULL; } if ( errors != NULL ) { if ( Z_TYPE_P(errors) == IS_ARRAY ) zval_dtor(errors); efree(errors); errors = NULL; } if ( warnings != NULL ) { if ( Z_TYPE_P(warnings) == IS_ARRAY ) zval_dtor(warnings); efree(warnings); warnings = NULL; } } void P4Result::GetOutput( zval *retval ) { *retval = *output; zval_copy_ctor(retval); ADDREF_FUNC(output); } void P4Result::GetWarnings( zval *retval ) { *retval = *warnings; zval_copy_ctor(retval); ADDREF_FUNC(warnings); } void P4Result::GetErrors( zval *retval ) { *retval = *errors; zval_copy_ctor(retval); ADDREF_FUNC(errors); } // // Reset P4Result instance. Clear error, warning and output buffers. // void P4Result::Reset() { if (warnings != NULL ) { if (Z_TYPE_P(warnings) == IS_ARRAY) { zval_dtor(warnings); } efree( warnings ); warnings = NULL; } if ( output != NULL ) { if (Z_TYPE_P(output) == IS_ARRAY) { zval_dtor(output); } efree( output ); output = NULL; } if ( errors != NULL ) { if (Z_TYPE_P(errors) == IS_ARRAY) { zval_dtor(errors); } efree( errors ); errors = NULL; } MAKE_STD_ZVAL( warnings ); array_init( warnings ); MAKE_STD_ZVAL( output ); array_init( output ); MAKE_STD_ZVAL( errors ); array_init(errors); } void P4Result::AppendString( zval *list, const char *str ) { if (add_next_index_string(list, (char *)str, 1) == FAILURE) { StrBuf m; TSRMLS_FETCH(); m << "P4Result::AppendString() - Error adding string to list."; zend_throw_exception_ex( get_p4_exception_ce(), 0 TSRMLS_CC, m.Text() ); } } void P4Result::AddOutput( const char *msg ) { AppendString(output, msg); } void P4Result::AddOutput( zval *out ) { add_next_index_zval(output, out); } // // Add an error to the error or warning buffer depending on severity. // void P4Result::AddError(Error *e) { StrBuf m; e->Fmt( &m, EF_PLAIN ); int s; s = e->GetSeverity(); /* Empty and informational messages are pushed out as output as nothing * worthy of error handling has occurred. Warnings go into the warnings * list and the rest are lumped together as errors. */ if ( s == E_EMPTY || s == E_INFO ) { AddOutput( m.Text() ); return; } if ( s == E_WARN ) AppendString( warnings, m.Text() ); else AppendString( errors, m.Text() ); } // // Return the number of errors that have been encountered. // int P4Result::ErrorCount() { return zend_hash_num_elements( Z_ARRVAL_P(errors) ); } // // Return the number of warnings that have been encountered. // int P4Result::WarningCount() { return zend_hash_num_elements( Z_ARRVAL_P(warnings) ); } void P4Result::FmtErrors( StrBuf &buf ) { Fmt( "[Error]: ", errors, buf ); } void P4Result::FmtWarnings( StrBuf &buf ) { Fmt( "[Warning]: ", warnings, buf ); } int P4Result::Length( zval *list ) { return zend_hash_num_elements( Z_ARRVAL_P(list) ); } void P4Result::Fmt( const char *label, zval *list, StrBuf &buf ) { HashTable *ht; ht = Z_ARRVAL_P(list); buf.Clear(); // If the array is empty, then we just return if( zend_hash_num_elements( ht ) == 0 ) return; // This is the string we'll use to prefix each entry in the array StrBuf csep; csep << "\n\t" << label; // Join the array elements together, using our separator as glue. // Append the result to the buffer. HashPosition pos; zval **e; int size; size = zend_hash_num_elements(ht); if ( size > 0 ) buf << csep; int i = 0; for (zend_hash_internal_pointer_reset_ex( ht, &pos ); zend_hash_get_current_data_ex( ht, (void **)&e, &pos ) == SUCCESS; zend_hash_move_forward_ex( ht, &pos ) ) { convert_to_string(*e); buf << Z_STRVAL_PP(e); if ( i < (size - 1) ) buf << csep; i++; } }
# | Change | User | Description | Committed | |
---|---|---|---|---|---|
#2 | 24779 | Robert Cowham | P4PHP 2016.2.1490102 | ||
#1 | 16506 | perforce_software | Move P4PHP to main branch. | ||
//guest/perforce_software/p4php/php_p4result.cc | |||||
#1 | 8467 | Jan Van Uytven |
Initial commit of P4PHP from //depot/main/p4-php |