diff --git a/src/upb.h b/src/upb.h index 64f2c54497..685a292566 100644 --- a/src/upb.h +++ b/src/upb.h @@ -36,6 +36,7 @@ extern "C" { #define UPB_INDEX(base, i, m) (void*)((char*)(base) + ((i)*(m))) INLINE uint32_t max(uint32_t a, uint32_t b) { return a > b ? a : b; } +INLINE uint32_t min(uint32_t a, uint32_t b) { return a < b ? a : b; } /* Value type as defined in a .proto file. The values of this are defined by * google_protobuf_FieldDescriptorProto_Type (from descriptor.proto). diff --git a/src/upb_string.h b/src/upb_string.h index 7a05811b8c..de2384d120 100644 --- a/src/upb_string.h +++ b/src/upb_string.h @@ -43,8 +43,15 @@ INLINE bool upb_streql(struct upb_string *s1, struct upb_string *s2) { memcmp(s1->ptr, s2->ptr, s1->byte_len) == 0; } +INLINE int upb_strcmp(struct upb_string s1, struct upb_string s2) { + size_t common_length = min(s1.byte_len, s2.byte_len); + int common_diff = memcmp(s1.ptr, s2.ptr, common_length); + if(common_diff == 0) return s1.byte_len - s2.byte_len; + else return common_diff; +} + INLINE void upb_strcpy(struct upb_string *dest, struct upb_string *src) { - memcpy(dest->ptr, src->ptr, dest->byte_len); + memcpy(dest->ptr, src->ptr, src->byte_len); dest->byte_len = src->byte_len; } @@ -56,6 +63,14 @@ INLINE struct upb_string upb_strdup(struct upb_string s) { return copy; } +INLINE struct upb_string upb_strdupc(char *s) { + struct upb_string copy; + copy.byte_len = strlen(s); + copy.ptr = (char*)malloc(copy.byte_len); + memcpy(copy.ptr, s, copy.byte_len); + return copy; +} + INLINE void upb_strfree(struct upb_string s) { free(s.ptr); }