[zstd] Simplified stream decompression with multireader
diff --git a/zstd_stream.go b/zstd_stream.go
index ce0137a..ea58155 100644
--- a/zstd_stream.go
+++ b/zstd_stream.go
@@ -182,7 +182,6 @@
 
 // Read satifies the io.Reader interface
 func (r *Reader) Read(p []byte) (int, error) {
-	var err error
 
 	// If we already have enough bytes, return
 	if r.dstBuffer.Len() >= len(p) {
@@ -192,36 +191,17 @@
 	for r.dstBuffer.Len() < len(p) {
 		// Populate src
 		src := r.compressionBuffer
-		if r.srcBuffer.Len() >= len(src) { // We don't need to read anything from src
-			_, err := r.srcBuffer.Read(src)
-			if err != nil {
-				return 0, fmt.Errorf("failed to read from srcBuffer: %s", err)
-			}
-		} else { // We need to read some data
-			n, err := io.ReadFull(r.underlyingReader, src)
-			if err == io.EOF {
-				if r.srcBuffer.Len() == 0 { // No more things to do
-					break
-				}
-			}
-			if err != nil && err != io.ErrUnexpectedEOF {
-				return 0, fmt.Errorf("failed to read underlying reader: %s", err)
-			}
-			// Create buffer
-			if r.srcBuffer.Len() == 0 { // Fast path: do not use srcBuffer
-				src = src[:n]
-			} else {
-				_, err = r.srcBuffer.Write(src[:n])
-				if err != nil {
-					return 0, fmt.Errorf("failed to write to temporary src buffer: %s", err)
-				}
-				n, err = r.srcBuffer.Read(src)
-				if err != nil {
-					return 0, fmt.Errorf("failed to read from temporary src buffer: %s", err)
-				}
-				src = src[:n]
-			}
+		reader := r.underlyingReader
+		if r.srcBuffer.Len() != 0 {
+			reader = io.MultiReader(&r.srcBuffer, r.underlyingReader)
 		}
+		n, err := io.ReadFull(reader, src)
+		if err == io.EOF {
+			break
+		} else if err != nil && err != io.ErrUnexpectedEOF {
+			return 0, fmt.Errorf("failed to read from underlying reader: %s", err)
+		}
+		src = src[:n]
 
 		// C code
 		cSrc := unsafe.Pointer(&src[0])