|  | @@ -466,13 +466,15 @@ static cJSON_bool insert_item_in_array(cJSON *array, size_t which, cJSON *newite
 | 
	
		
			
				|  |  |      return 1;
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +enum patch_operation { INVALID, ADD, REMOVE, REPLACE, MOVE, COPY, TEST };
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  static int cJSONUtils_ApplyPatch(cJSON *object, cJSON *patch)
 | 
	
		
			
				|  |  |  {
 | 
	
		
			
				|  |  |      cJSON *op = NULL;
 | 
	
		
			
				|  |  |      cJSON *path = NULL;
 | 
	
		
			
				|  |  |      cJSON *value = NULL;
 | 
	
		
			
				|  |  |      cJSON *parent = NULL;
 | 
	
		
			
				|  |  | -    int opcode = 0;
 | 
	
		
			
				|  |  | +    enum patch_operation opcode = INVALID;
 | 
	
		
			
				|  |  |      unsigned char *parentptr = NULL;
 | 
	
		
			
				|  |  |      unsigned char *childptr = NULL;
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -487,23 +489,23 @@ static int cJSONUtils_ApplyPatch(cJSON *object, cJSON *patch)
 | 
	
		
			
				|  |  |      /* decode operation */
 | 
	
		
			
				|  |  |      if (!strcmp(op->valuestring, "add"))
 | 
	
		
			
				|  |  |      {
 | 
	
		
			
				|  |  | -        opcode = 0;
 | 
	
		
			
				|  |  | +        opcode = ADD;
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |      else if (!strcmp(op->valuestring, "remove"))
 | 
	
		
			
				|  |  |      {
 | 
	
		
			
				|  |  | -        opcode = 1;
 | 
	
		
			
				|  |  | +        opcode = REMOVE;
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |      else if (!strcmp(op->valuestring, "replace"))
 | 
	
		
			
				|  |  |      {
 | 
	
		
			
				|  |  | -        opcode = 2;
 | 
	
		
			
				|  |  | +        opcode = REPLACE;
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |      else if (!strcmp(op->valuestring, "move"))
 | 
	
		
			
				|  |  |      {
 | 
	
		
			
				|  |  | -        opcode = 3;
 | 
	
		
			
				|  |  | +        opcode = MOVE;
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |      else if (!strcmp(op->valuestring, "copy"))
 | 
	
		
			
				|  |  |      {
 | 
	
		
			
				|  |  | -        opcode = 4;
 | 
	
		
			
				|  |  | +        opcode = COPY;
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |      else if (!strcmp(op->valuestring, "test"))
 | 
	
		
			
				|  |  |      {
 | 
	
	
		
			
				|  | @@ -516,8 +518,7 @@ static int cJSONUtils_ApplyPatch(cJSON *object, cJSON *patch)
 | 
	
		
			
				|  |  |          return 3;
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    /* Remove/Replace */
 | 
	
		
			
				|  |  | -    if ((opcode == 1) || (opcode == 2))
 | 
	
		
			
				|  |  | +    if ((opcode == REMOVE) || (opcode == REPLACE))
 | 
	
		
			
				|  |  |      {
 | 
	
		
			
				|  |  |          /* Get rid of old. */
 | 
	
		
			
				|  |  |          cJSON *old_item = cJSONUtils_PatchDetach(object, (unsigned char*)path->valuestring);
 | 
	
	
		
			
				|  | @@ -526,7 +527,7 @@ static int cJSONUtils_ApplyPatch(cJSON *object, cJSON *patch)
 | 
	
		
			
				|  |  |              return 13;
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |          cJSON_Delete(old_item);
 | 
	
		
			
				|  |  | -        if (opcode == 1)
 | 
	
		
			
				|  |  | +        if (opcode == REMOVE)
 | 
	
		
			
				|  |  |          {
 | 
	
		
			
				|  |  |              /* For Remove, this job is done. */
 | 
	
		
			
				|  |  |              return 0;
 | 
	
	
		
			
				|  | @@ -534,7 +535,7 @@ static int cJSONUtils_ApplyPatch(cJSON *object, cJSON *patch)
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      /* Copy/Move uses "from". */
 | 
	
		
			
				|  |  | -    if ((opcode == 3) || (opcode == 4))
 | 
	
		
			
				|  |  | +    if ((opcode == MOVE) || (opcode == COPY))
 | 
	
		
			
				|  |  |      {
 | 
	
		
			
				|  |  |          cJSON *from = cJSON_GetObjectItem(patch, "from");
 | 
	
		
			
				|  |  |          if (!from)
 | 
	
	
		
			
				|  | @@ -543,14 +544,12 @@ static int cJSONUtils_ApplyPatch(cJSON *object, cJSON *patch)
 | 
	
		
			
				|  |  |              return 4;
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        if (opcode == 3)
 | 
	
		
			
				|  |  | +        if (opcode == MOVE)
 | 
	
		
			
				|  |  |          {
 | 
	
		
			
				|  |  | -            /* move */
 | 
	
		
			
				|  |  |              value = cJSONUtils_PatchDetach(object, (unsigned char*)from->valuestring);
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  | -        if (opcode == 4)
 | 
	
		
			
				|  |  | +        if (opcode == COPY)
 | 
	
		
			
				|  |  |          {
 | 
	
		
			
				|  |  | -            /* copy */
 | 
	
		
			
				|  |  |              value = cJSONUtils_GetPointer(object, from->valuestring);
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |          if (!value)
 | 
	
	
		
			
				|  | @@ -558,7 +557,7 @@ static int cJSONUtils_ApplyPatch(cJSON *object, cJSON *patch)
 | 
	
		
			
				|  |  |              /* missing "from" for copy/move. */
 | 
	
		
			
				|  |  |              return 5;
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  | -        if (opcode == 4)
 | 
	
		
			
				|  |  | +        if (opcode == COPY)
 | 
	
		
			
				|  |  |          {
 | 
	
		
			
				|  |  |              value = cJSON_Duplicate(value, 1);
 | 
	
		
			
				|  |  |          }
 |