mercurial/mpatch.c
branchstable
changeset 38190 1ec4cb8cbc87
parent 38189 faa924469635
child 38191 b8b253aec953
equal deleted inserted replaced
38189:faa924469635 38190:1ec4cb8cbc87
    18 
    18 
    19  This software may be used and distributed according to the terms
    19  This software may be used and distributed according to the terms
    20  of the GNU General Public License, incorporated herein by reference.
    20  of the GNU General Public License, incorporated herein by reference.
    21 */
    21 */
    22 
    22 
       
    23 #include <limits.h>
    23 #include <stdlib.h>
    24 #include <stdlib.h>
    24 #include <string.h>
    25 #include <string.h>
    25 
    26 
    26 #include "bitmanipulation.h"
    27 #include "bitmanipulation.h"
    27 #include "compat.h"
    28 #include "compat.h"
    28 #include "mpatch.h"
    29 #include "mpatch.h"
       
    30 
       
    31 /* VC9 doesn't include bool and lacks stdbool.h based on cext/util.h */
       
    32 #if defined(_MSC_VER) || __STDC_VERSION__ < 199901L
       
    33 #define true 1
       
    34 #define false 0
       
    35 typedef unsigned char bool;
       
    36 #else
       
    37 #include <stdbool.h>
       
    38 #endif
    29 
    39 
    30 static struct mpatch_flist *lalloc(ssize_t size)
    40 static struct mpatch_flist *lalloc(ssize_t size)
    31 {
    41 {
    32 	struct mpatch_flist *a = NULL;
    42 	struct mpatch_flist *a = NULL;
    33 
    43 
    56 }
    66 }
    57 
    67 
    58 static ssize_t lsize(struct mpatch_flist *a)
    68 static ssize_t lsize(struct mpatch_flist *a)
    59 {
    69 {
    60 	return a->tail - a->head;
    70 	return a->tail - a->head;
       
    71 }
       
    72 
       
    73 /* add helper to add src and *dest iff it won't overflow */
       
    74 static inline bool safeadd(int src, int *dest)
       
    75 {
       
    76 	if ((src > 0) == (*dest > 0)) {
       
    77 		if (*dest > 0) {
       
    78 			if (src > (INT_MAX - *dest)) {
       
    79 				return false;
       
    80 			}
       
    81 		} else {
       
    82 			if (src < (INT_MIN - *dest)) {
       
    83 				return false;
       
    84 			}
       
    85 		}
       
    86 	}
       
    87 	*dest += src;
       
    88 	return true;
    61 }
    89 }
    62 
    90 
    63 /* move hunks in source that are less cut to dest, compensating
    91 /* move hunks in source that are less cut to dest, compensating
    64    for changes in offset. the last hunk may be split if necessary.
    92    for changes in offset. the last hunk may be split if necessary.
    65 */
    93 */