Improve readability of MPS reader implementation

Signed-off-by: Hanno Becker <hanno.becker@arm.com>
diff --git a/library/mps_reader.c b/library/mps_reader.c
index a1c0a1c..508f65a 100644
--- a/library/mps_reader.c
+++ b/library/mps_reader.c
@@ -66,6 +66,54 @@
  *
  */
 
+static inline int mps_reader_is_accumulating(
+    mbedtls_mps_reader const *rd )
+{
+    mbedtls_mps_size_t ar;
+    if( rd->acc == NULL )
+        return( 0 );
+
+    ar = rd->acc_share.acc_remaining;
+    return( ar > 0 );
+}
+
+static inline int mps_reader_is_producing(
+    mbedtls_mps_reader const *rd )
+{
+    unsigned char *frag = rd->frag;
+    return( frag == NULL );
+}
+
+static inline int mps_reader_is_consuming(
+    mbedtls_mps_reader const *rd )
+{
+    return( !mps_reader_is_producing( rd ) );
+}
+
+static inline mbedtls_mps_size_t mps_reader_get_fragment_offset(
+    mbedtls_mps_reader const *rd )
+{
+    unsigned char *acc = rd->acc;
+    mbedtls_mps_size_t fo;
+
+    if( acc == NULL )
+        return( 0 );
+
+    fo = rd->acc_share.frag_offset;
+    return( fo );
+}
+
+static inline mbedtls_mps_size_t mps_reader_serving_from_accumulator(
+    mbedtls_mps_reader const *rd )
+{
+    mbedtls_mps_size_t fo, end;
+
+    fo = mps_reader_get_fragment_offset( rd );
+    end = rd->end;
+
+    return( end < fo );
+}
+
 static inline void mps_reader_zero( mbedtls_mps_reader *rd )
 {
     /* A plain memset() would likely be more efficient,
@@ -92,7 +140,9 @@
                              unsigned char *acc,
                              mbedtls_mps_size_t acc_len )
 {
-    MBEDTLS_MPS_TRACE_INIT( "reader_init, acc len %u", (unsigned) acc_len );
+    MBEDTLS_MPS_TRACE_INIT( "mbedtls_mps_reader_init" );
+    MBEDTLS_MPS_TRACE( mbedtls_mps_trace_comment,
+                       "* Accumulator size: %u bytes", (unsigned) acc_len );
     mps_reader_zero( rd );
     rd->acc = acc;
     rd->acc_len = acc_len;
@@ -101,7 +151,7 @@
 
 int mbedtls_mps_reader_free( mbedtls_mps_reader *rd )
 {
-    MBEDTLS_MPS_TRACE_INIT( "reader_free" );
+    MBEDTLS_MPS_TRACE_INIT( "mbedtls_mps_reader_free" );
     mps_reader_zero( rd );
     MBEDTLS_MPS_TRACE_RETURN( 0 );
 }
@@ -110,31 +160,31 @@
                              unsigned char *new_frag,
                              mbedtls_mps_size_t new_frag_len )
 {
-    unsigned char *acc;
     mbedtls_mps_size_t copy_to_acc;
-    MBEDTLS_MPS_TRACE_INIT( "reader_feed, frag %p, len %u",
-                (void*) new_frag, (unsigned) new_frag_len );
+    MBEDTLS_MPS_TRACE_INIT( "mbedtls_mps_reader_feed" );
+    MBEDTLS_MPS_TRACE( mbedtls_mps_trace_comment,
+                       "* Fragment length: %u bytes", (unsigned) new_frag_len );
 
     if( new_frag == NULL )
         MBEDTLS_MPS_TRACE_RETURN( MBEDTLS_ERR_MPS_READER_INVALID_ARG );
 
-    MBEDTLS_MPS_STATE_VALIDATE_RAW( rd->frag == NULL,
+    MBEDTLS_MPS_STATE_VALIDATE_RAW( mps_reader_is_producing( rd ),
         "mbedtls_mps_reader_feed() requires reader to be in producing mode" );
 
-    acc = rd->acc;
-    if( acc != NULL )
+    if( mps_reader_is_accumulating( rd ) )
     {
-        mbedtls_mps_size_t aa, ar;
+        unsigned char *acc    = rd->acc;
+        mbedtls_mps_size_t ar = rd->acc_share.acc_remaining;
+        mbedtls_mps_size_t aa = rd->acc_avail;
 
-        ar = rd->acc_share.acc_remaining;
-        aa = rd->acc_avail;
+        /* Skip over parts of the accumulator that have already been filled. */
+        acc += aa;
 
         copy_to_acc = ar;
         if( copy_to_acc > new_frag_len )
             copy_to_acc = new_frag_len;
 
-        acc += aa;
-
+        /* Copy new contents to accumulator. */
         if( copy_to_acc > 0 )
             memcpy( acc, new_frag, copy_to_acc );
 
@@ -146,21 +196,24 @@
         ar -= copy_to_acc;
         if( ar > 0 )
         {
-            /* Need more data */
+            /* We need to accumulate more data. Stay in producing mode. */
             aa += copy_to_acc;
             rd->acc_share.acc_remaining = ar;
             rd->acc_avail = aa;
             MBEDTLS_MPS_TRACE_RETURN( MBEDTLS_ERR_MPS_READER_NEED_MORE );
         }
 
+        /* We have filled the accumulator: Move to consuming mode. */
+
         MBEDTLS_MPS_TRACE( mbedtls_mps_trace_comment,
                            "Enough data available to serve user request" );
 
+        /* Remember overlap of accumulator and fragment. */
         rd->acc_share.frag_offset = aa;
         aa += copy_to_acc;
         rd->acc_avail = aa;
     }
-    else
+    else /* Not accumulating */
     {
         rd->acc_share.frag_offset = 0;
     }
@@ -178,33 +231,23 @@
                             unsigned char **buffer,
                             mbedtls_mps_size_t *buflen )
 {
-    unsigned char *frag, *acc;
-    mbedtls_mps_size_t end, fo, fl, frag_fetched, frag_remaining;
-    MBEDTLS_MPS_TRACE_INIT( "reader_get %p, desired %u",
-                            (void*) rd, (unsigned) desired );
+    unsigned char *frag;
+    mbedtls_mps_size_t fl, fo, end, frag_fetched, frag_remaining;
+    MBEDTLS_MPS_TRACE_INIT( "mbedtls_mps_reader_get" );
+    MBEDTLS_MPS_TRACE( mbedtls_mps_trace_comment,
+                       "* Bytes requested: %u", (unsigned) desired );
 
-    frag = rd->frag;
-    MBEDTLS_MPS_STATE_VALIDATE_RAW( frag != NULL,
+    MBEDTLS_MPS_STATE_VALIDATE_RAW( mps_reader_is_consuming( rd ),
           "mbedtls_mps_reader_get() requires reader to be in consuming mode" );
 
-    /* The fragment offset indicates the offset of the fragment
-     * from the accmulator, if the latter is present. Use a offset
-     * of \c 0 if no accumulator is used. */
-    acc = rd->acc;
-    if( acc == NULL )
-        fo = 0;
-    else
-        fo = rd->acc_share.frag_offset;
-
-    MBEDTLS_MPS_TRACE( mbedtls_mps_trace_comment,
-            "frag_off %u, end %u, acc_avail %d",
-            (unsigned) fo, (unsigned) rd->end,
-            acc == NULL ? -1 : (int) rd->acc_avail );
+    end = rd->end;
+    fo = mps_reader_get_fragment_offset( rd );
 
     /* Check if we're still serving from the accumulator. */
-    end = rd->end;
-    if( end < fo )
+    if( mps_reader_serving_from_accumulator( rd ) )
     {
+        unsigned char *acc;
+
         MBEDTLS_MPS_TRACE( mbedtls_mps_trace_comment,
                            "Serve the request from the accumulator" );
         if( fo - end < desired )
@@ -291,7 +334,9 @@
             }
         }
 
+        acc = rd->acc;
         acc += end;
+
         *buffer = acc;
         if( buflen != NULL )
             *buflen = desired;
@@ -310,7 +355,6 @@
     fl = rd->frag_len;
     frag_fetched = end - fo; /* The amount of data from the current fragment
                               * that has already been passed to the user. */
-    frag += frag_fetched;
     frag_remaining = fl - frag_fetched; /* Remaining data in fragment */
 
     /* Check if we can serve the read request from the fragment. */
@@ -338,6 +382,10 @@
 
     /* There's enough data in the current fragment to serve the
      * (potentially modified) read request. */
+
+    frag = rd->frag;
+    frag += frag_fetched;
+
     *buffer = frag;
     if( buflen != NULL )
         *buflen = desired;
@@ -351,8 +399,8 @@
 int mbedtls_mps_reader_commit( mbedtls_mps_reader *rd )
 {
     mbedtls_mps_size_t end;
-    MBEDTLS_MPS_TRACE_INIT( "reader_commit" );
-    MBEDTLS_MPS_STATE_VALIDATE_RAW( rd->frag != NULL,
+    MBEDTLS_MPS_TRACE_INIT( "mbedtls_mps_reader_commit" );
+    MBEDTLS_MPS_STATE_VALIDATE_RAW( mps_reader_is_consuming( rd ),
        "mbedtls_mps_reader_commit() requires reader to be in consuming mode" );
 
     end = rd->end;
@@ -372,19 +420,16 @@
     if( paused != NULL )
         *paused = 0;
 
-    frag = rd->frag;
-    MBEDTLS_MPS_STATE_VALIDATE_RAW( frag != NULL,
+    MBEDTLS_MPS_STATE_VALIDATE_RAW( mps_reader_is_consuming( rd ),
            "mbedtls_mps_reader_reclaim() requires reader to be in consuming mode" );
 
+    frag    = rd->frag;
     acc     = rd->acc;
     pending = rd->pending;
     commit  = rd->commit;
     fl      = rd->frag_len;
 
-    if( acc == NULL )
-        fo = 0;
-    else
-        fo = rd->acc_share.frag_offset;
+    fo = mps_reader_get_fragment_offset( rd );
 
     if( pending == 0 )
     {