6161// buffer). The parse_external_terms function does NOT perform range checking, and MUST
6262// therefore always be preceeded by a call to calculate_heap_usage.
6363
64- static term parse_external_terms (const uint8_t * external_term_buf , int * eterm_size , Context * ctx , int copy );
64+ static term parse_external_terms (const uint8_t * external_term_buf , int * eterm_size , Context * ctx , bool copy );
6565static int calculate_heap_usage (const uint8_t * external_term_buf , size_t remaining , int * eterm_size , bool copy , Context * ctx );
6666static size_t compute_external_size (Context * ctx , term t );
6767static int externalterm_from_term (Context * ctx , uint8_t * * buf , size_t * len , term t );
@@ -71,12 +71,14 @@ static int serialize_term(Context *ctx, uint8_t *buf, term t);
7171 * @brief
7272 * @param external_term buffer containing external term
7373 * @param ctx current context in which terms may be stored
74- * @param use_heap_fragment whether to store parsed terms in a heap fragment. If 0, terms
74+ * @param opts additional opts, such as ExternalTermToHeapFragment for storing parsed
75+ * terms in a heap fragment.
7576 * are stored in the context heap.
7677 * @param bytes_read the number of bytes read off external_term in order to yield a term
7778 * @return the parsed term
7879 */
79- static term externalterm_to_term_internal (const void * external_term , size_t size , Context * ctx , int use_heap_fragment , size_t * bytes_read , bool copy )
80+ static term externalterm_to_term_internal (const void * external_term , size_t size , Context * ctx ,
81+ ExternalTermOpts opts , size_t * bytes_read , bool copy )
8082{
8183 const uint8_t * external_term_buf = (const uint8_t * ) external_term ;
8284
@@ -94,7 +96,7 @@ static term externalterm_to_term_internal(const void *external_term, size_t size
9496 return term_invalid_term ();
9597 }
9698
97- if (use_heap_fragment ) {
99+ if (opts & ExternalTermToHeapFragment ) {
98100 struct ListHead * heap_fragment = malloc (heap_usage * sizeof (term ) + sizeof (struct ListHead ));
99101 if (IS_NULL_PTR (heap_fragment )) {
100102 return term_invalid_term ();
@@ -107,7 +109,7 @@ static term externalterm_to_term_internal(const void *external_term, size_t size
107109 // so all existing functions can be used on the heap fragment without any change.
108110 term * main_heap = ctx -> heap_ptr ;
109111 ctx -> heap_ptr = external_term_heap ;
110- term result = parse_external_terms (external_term_buf + 1 , & eterm_size , ctx , 0 );
112+ term result = parse_external_terms (external_term_buf + 1 , & eterm_size , ctx , false );
111113 * bytes_read = eterm_size + 1 ;
112114 ctx -> heap_ptr = main_heap ;
113115
@@ -117,16 +119,16 @@ static term externalterm_to_term_internal(const void *external_term, size_t size
117119 fprintf (stderr , "Unable to ensure %i free words in heap\n" , eterm_size );
118120 return term_invalid_term ();
119121 }
120- term result = parse_external_terms (external_term_buf + 1 , & eterm_size , ctx , 1 );
122+ term result = parse_external_terms (external_term_buf + 1 , & eterm_size , ctx , true );
121123 * bytes_read = eterm_size + 1 ;
122124 return result ;
123125 }
124126}
125127
126- term externalterm_to_term (const void * external_term , size_t size , Context * ctx , int use_heap_fragment )
128+ term externalterm_to_term (const void * external_term , size_t size , Context * ctx , ExternalTermOpts opts )
127129{
128130 size_t bytes_read = 0 ;
129- return externalterm_to_term_internal (external_term , size , ctx , use_heap_fragment , & bytes_read , false);
131+ return externalterm_to_term_internal (external_term , size , ctx , opts , & bytes_read , false);
130132}
131133
132134enum ExternalTermResult externalterm_from_binary (Context * ctx , term * dst , term binary , size_t * bytes_read )
@@ -326,7 +328,7 @@ static int serialize_term(Context *ctx, uint8_t *buf, term t)
326328 }
327329}
328330
329- static term parse_external_terms (const uint8_t * external_term_buf , int * eterm_size , Context * ctx , int copy )
331+ static term parse_external_terms (const uint8_t * external_term_buf , int * eterm_size , Context * ctx , bool copy )
330332{
331333 switch (external_term_buf [0 ]) {
332334 case NEW_FLOAT_EXT : {
0 commit comments