<commit_before>// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "net/base/gzip_header.h"

#if defined(USE_SYSTEM_ZLIB)
#include <zlib.h>
#else
#include "third_party/zlib/zlib.h"  // for Z_DEFAULT_COMPRESSION
#endif

#include "base/logging.h"

const uint8 GZipHeader::magic[] = { 0x1f, 0x8b };

// ----------------------------------------------------------------------
// GZipHeader::ReadMore()
//    Attempt to parse the beginning of the given buffer as a gzip
//    header. If these bytes do not constitute a complete gzip header,
//    return INCOMPLETE_HEADER. If these bytes do not constitute a
//    *valid* gzip header, return INVALID_HEADER. If we find a
//    complete header, return COMPLETE_HEADER and set the pointer
//    pointed to by header_end to the first byte beyond the gzip header.
// ----------------------------------------------------------------------

GZipHeader::Status GZipHeader::ReadMore(const char* inbuf, int inbuf_len,
                                        const char** header_end) {
  DCHECK_GE(inbuf_len, 0);
  const uint8* pos = reinterpret_cast<const uint8*>(inbuf);
  const uint8* const end = pos + inbuf_len;

  while ( pos < end ) {
    switch ( state_ ) {
      case IN_HEADER_ID1:
        if ( *pos != magic[0] )  return INVALID_HEADER;
        pos++;
        state_++;
        break;
      case IN_HEADER_ID2:
        if ( *pos != magic[1] )  return INVALID_HEADER;
        pos++;
        state_++;
        break;
      case IN_HEADER_CM:
        if ( *pos != Z_DEFLATED )  return INVALID_HEADER;
        pos++;
        state_++;
        break;
      case IN_HEADER_FLG:
        flags_ = (*pos) & (FLAG_FHCRC | FLAG_FEXTRA |
                           FLAG_FNAME | FLAG_FCOMMENT);
        pos++;
        state_++;
        break;

      case IN_HEADER_MTIME_BYTE_0:
        pos++;
        state_++;
        break;
      case IN_HEADER_MTIME_BYTE_1:
        pos++;
        state_++;
        break;
      case IN_HEADER_MTIME_BYTE_2:
        pos++;
        state_++;
        break;
      case IN_HEADER_MTIME_BYTE_3:
        pos++;
        state_++;
        break;

      case IN_HEADER_XFL:
        pos++;
        state_++;
        break;

      case IN_HEADER_OS:
        pos++;
        state_++;
        break;

      case IN_XLEN_BYTE_0:
        if ( !(flags_ & FLAG_FEXTRA) ) {
          state_ = IN_FNAME;
          break;
        }
        // We have a two-byte little-endian length, followed by a
        // field of that length.
        extra_length_ = *pos;
        pos++;
        state_++;
        break;
      case IN_XLEN_BYTE_1:
        extra_length_ += *pos << 8;
        pos++;
        state_++;
        // We intentionally fall through, because if we have a
        // zero-length FEXTRA, we want to check to notice that we're
        // done reading the FEXTRA before we exit this loop...

      case IN_FEXTRA: {
        // Grab the rest of the bytes in the extra field, or as many
        // of them as are actually present so far.
        const int num_extra_bytes = static_cast<const int>(std::min(
            static_cast<ptrdiff_t>(extra_length_),
            (end - pos)));
        pos += num_extra_bytes;
        extra_length_ -= num_extra_bytes;
        if ( extra_length_ == 0 ) {
          state_ = IN_FNAME;   // advance when we've seen extra_length_ bytes
          flags_ &= ~FLAG_FEXTRA;   // we're done with the FEXTRA stuff
        }
        break;
      }
<commit_msg>Fix for GCC 4.2.1 on X86 target<commit_after>// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "net/base/gzip_header.h"

#if defined(USE_SYSTEM_ZLIB)
#include <zlib.h>
#else
#include "third_party/zlib/zlib.h"  // for Z_DEFAULT_COMPRESSION
#endif

#include "base/logging.h"

const uint8 GZipHeader::magic[] = { 0x1f, 0x8b };

// ----------------------------------------------------------------------
// GZipHeader::ReadMore()
//    Attempt to parse the beginning of the given buffer as a gzip
//    header. If these bytes do not constitute a complete gzip header,
//    return INCOMPLETE_HEADER. If these bytes do not constitute a
//    *valid* gzip header, return INVALID_HEADER. If we find a
//    complete header, return COMPLETE_HEADER and set the pointer
//    pointed to by header_end to the first byte beyond the gzip header.
// ----------------------------------------------------------------------

GZipHeader::Status GZipHeader::ReadMore(const char* inbuf, int inbuf_len,
                                        const char** header_end) {
  DCHECK_GE(inbuf_len, 0);
  const uint8* pos = reinterpret_cast<const uint8*>(inbuf);
  const uint8* const end = pos + inbuf_len;

  while ( pos < end ) {
    switch ( state_ ) {
      case IN_HEADER_ID1:
        if ( *pos != magic[0] )  return INVALID_HEADER;
        pos++;
        state_++;
        break;
      case IN_HEADER_ID2:
        if ( *pos != magic[1] )  return INVALID_HEADER;
        pos++;
        state_++;
        break;
      case IN_HEADER_CM:
        if ( *pos != Z_DEFLATED )  return INVALID_HEADER;
        pos++;
        state_++;
        break;
      case IN_HEADER_FLG:
        flags_ = (*pos) & (FLAG_FHCRC | FLAG_FEXTRA |
                           FLAG_FNAME | FLAG_FCOMMENT);
        pos++;
        state_++;
        break;

      case IN_HEADER_MTIME_BYTE_0:
        pos++;
        state_++;
        break;
      case IN_HEADER_MTIME_BYTE_1:
        pos++;
        state_++;
        break;
      case IN_HEADER_MTIME_BYTE_2:
        pos++;
        state_++;
        break;
      case IN_HEADER_MTIME_BYTE_3:
        pos++;
        state_++;
        break;

      case IN_HEADER_XFL:
        pos++;
        state_++;
        break;

      case IN_HEADER_OS:
        pos++;
        state_++;
        break;

      case IN_XLEN_BYTE_0:
        if ( !(flags_ & FLAG_FEXTRA) ) {
          state_ = IN_FNAME;
          break;
        }
        // We have a two-byte little-endian length, followed by a
        // field of that length.
        extra_length_ = *pos;
        pos++;
        state_++;
        break;
      case IN_XLEN_BYTE_1:
        extra_length_ += *pos << 8;
        pos++;
        state_++;
        // We intentionally fall through, because if we have a
        // zero-length FEXTRA, we want to check to notice that we're
        // done reading the FEXTRA before we exit this loop...

      case IN_FEXTRA: {
        // Grab the rest of the bytes in the extra field, or as many
        // of them as are actually present so far.
        const int num_extra_bytes = static_cast<const int>(std::min(
            static_cast<ptrdiff_t>(extra_length_),
#ifdef ANDROID
            static_cast<ptrdiff_t>
#endif
            (end - pos)));
        pos += num_extra_bytes;
        extra_length_ -= num_extra_bytes;
        if ( extra_length_ == 0 ) {
          state_ = IN_FNAME;   // advance when we've seen extra_length_ bytes
          flags_ &= ~FLAG_FEXTRA;   // we're done with the FEXTRA stuff
        }
        break;
      }

{'fraction_non_alphanumeric': 0.13355454168394856, 'fraction_numerical': 0.008710078805474907, 'mean_word_length': 1.710378418883477, 'pattern_counts': {'":': 0, '<': 18, '<?xml version=': 0, '>': 12, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 2, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '4297455', 'n_tokens_mistral': 2231, 'n_tokens_neox': 2163, 'n_words': 658}