github.com/endocode/docker@v1.4.2-0.20160113120958-46eb4700391e/pkg/jsonlog/jsonlog_marshalling.go (about)

     1  // This code was initially generated by ffjson <https://github.com/pquerna/ffjson>
     2  // This code was generated via the following steps:
     3  // $ go get -u github.com/pquerna/ffjson
     4  // $ make BIND_DIR=. shell
     5  // $ ffjson pkg/jsonlog/jsonlog.go
     6  // $ mv pkg/jsonglog/jsonlog_ffjson.go pkg/jsonlog/jsonlog_marshalling.go
     7  //
     8  // It has been modified to improve the performance of time marshalling to JSON
     9  // and to clean it up.
    10  // Should this code need to be regenerated when the JSONLog struct is changed,
    11  // the relevant changes which have been made are:
    12  // import (
    13  //        "bytes"
    14  //-
    15  //        "unicode/utf8"
    16  // )
    17  //
    18  // func (mj *JSONLog) MarshalJSON() ([]byte, error) {
    19  //@@ -20,13 +16,13 @@ func (mj *JSONLog) MarshalJSON() ([]byte, error) {
    20  //        }
    21  //        return buf.Bytes(), nil
    22  // }
    23  //+
    24  // func (mj *JSONLog) MarshalJSONBuf(buf *bytes.Buffer) error {
    25  //-       var err error
    26  //-       var obj []byte
    27  //-       var first bool = true
    28  //-       _ = obj
    29  //-       _ = err
    30  //-       _ = first
    31  //+       var (
    32  //+               err       error
    33  //+               timestamp string
    34  //+               first     bool = true
    35  //+       )
    36  //        buf.WriteString(`{`)
    37  //        if len(mj.Log) != 0 {
    38  //                if first == true {
    39  //@@ -52,11 +48,11 @@ func (mj *JSONLog) MarshalJSONBuf(buf *bytes.Buffer) error {
    40  //                buf.WriteString(`,`)
    41  //        }
    42  //        buf.WriteString(`"time":`)
    43  //-       obj, err = mj.Created.MarshalJSON()
    44  //+       timestamp, err = FastTimeMarshalJSON(mj.Created)
    45  //        if err != nil {
    46  //                return err
    47  //        }
    48  //-       buf.Write(obj)
    49  //+       buf.WriteString(timestamp)
    50  //        buf.WriteString(`}`)
    51  //        return nil
    52  // }
    53  // @@ -81,9 +81,10 @@ func (mj *JSONLog) MarshalJSONBuf(buf *bytes.Buffer) error {
    54  //         if len(mj.Log) != 0 {
    55  // -                if first == true {
    56  // -                       first = false
    57  // -               } else {
    58  // -                       buf.WriteString(`,`)
    59  // -               }
    60  // +               first = false
    61  //                 buf.WriteString(`"log":`)
    62  //                 ffjsonWriteJSONString(buf, mj.Log)
    63  //         }
    64  
    65  package jsonlog
    66  
    67  import (
    68  	"bytes"
    69  	"unicode/utf8"
    70  )
    71  
    72  // MarshalJSON marshals the JSONLog.
    73  func (mj *JSONLog) MarshalJSON() ([]byte, error) {
    74  	var buf bytes.Buffer
    75  	buf.Grow(1024)
    76  	if err := mj.MarshalJSONBuf(&buf); err != nil {
    77  		return nil, err
    78  	}
    79  	return buf.Bytes(), nil
    80  }
    81  
    82  // MarshalJSONBuf marshals the JSONLog and stores the result to a bytes.Buffer.
    83  func (mj *JSONLog) MarshalJSONBuf(buf *bytes.Buffer) error {
    84  	var (
    85  		err       error
    86  		timestamp string
    87  		first     = true
    88  	)
    89  	buf.WriteString(`{`)
    90  	if len(mj.Log) != 0 {
    91  		first = false
    92  		buf.WriteString(`"log":`)
    93  		ffjsonWriteJSONString(buf, mj.Log)
    94  	}
    95  	if len(mj.Stream) != 0 {
    96  		if first == true {
    97  			first = false
    98  		} else {
    99  			buf.WriteString(`,`)
   100  		}
   101  		buf.WriteString(`"stream":`)
   102  		ffjsonWriteJSONString(buf, mj.Stream)
   103  	}
   104  	if first == true {
   105  		first = false
   106  	} else {
   107  		buf.WriteString(`,`)
   108  	}
   109  	buf.WriteString(`"time":`)
   110  	timestamp, err = FastTimeMarshalJSON(mj.Created)
   111  	if err != nil {
   112  		return err
   113  	}
   114  	buf.WriteString(timestamp)
   115  	buf.WriteString(`}`)
   116  	return nil
   117  }
   118  
   119  func ffjsonWriteJSONString(buf *bytes.Buffer, s string) {
   120  	const hex = "0123456789abcdef"
   121  
   122  	buf.WriteByte('"')
   123  	start := 0
   124  	for i := 0; i < len(s); {
   125  		if b := s[i]; b < utf8.RuneSelf {
   126  			if 0x20 <= b && b != '\\' && b != '"' && b != '<' && b != '>' && b != '&' {
   127  				i++
   128  				continue
   129  			}
   130  			if start < i {
   131  				buf.WriteString(s[start:i])
   132  			}
   133  			switch b {
   134  			case '\\', '"':
   135  				buf.WriteByte('\\')
   136  				buf.WriteByte(b)
   137  			case '\n':
   138  				buf.WriteByte('\\')
   139  				buf.WriteByte('n')
   140  			case '\r':
   141  				buf.WriteByte('\\')
   142  				buf.WriteByte('r')
   143  			default:
   144  
   145  				buf.WriteString(`\u00`)
   146  				buf.WriteByte(hex[b>>4])
   147  				buf.WriteByte(hex[b&0xF])
   148  			}
   149  			i++
   150  			start = i
   151  			continue
   152  		}
   153  		c, size := utf8.DecodeRuneInString(s[i:])
   154  		if c == utf8.RuneError && size == 1 {
   155  			if start < i {
   156  				buf.WriteString(s[start:i])
   157  			}
   158  			buf.WriteString(`\ufffd`)
   159  			i += size
   160  			start = i
   161  			continue
   162  		}
   163  
   164  		if c == '\u2028' || c == '\u2029' {
   165  			if start < i {
   166  				buf.WriteString(s[start:i])
   167  			}
   168  			buf.WriteString(`\u202`)
   169  			buf.WriteByte(hex[c&0xF])
   170  			i += size
   171  			start = i
   172  			continue
   173  		}
   174  		i += size
   175  	}
   176  	if start < len(s) {
   177  		buf.WriteString(s[start:])
   178  	}
   179  	buf.WriteByte('"')
   180  }