212 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			C
		
	
	
			
		
		
	
	
			212 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			C
		
	
	
| /****** parser.c
 | |
|   This file defines the code for parsing, checking, comparing, etc., slots, stats, rolls, and otherwise.
 | |
| 
 | |
|   All functions work by taking in pointers to char arrays and doing the operations upon those strings.
 | |
| ******/
 | |
| #include <ctype.h>
 | |
| #include <stdio.h> // remove me
 | |
| #include <stdlib.h>
 | |
| #include <string.h> // memset!
 | |
| 
 | |
| #include "parser.h"
 | |
| 
 | |
| /* slots */
 | |
| /**** slotsCompareSlots
 | |
|   Attempts to search for/compare needle to haystack. If haystack is missing a portion of the needle, then the difference in values is placed in the passed string and a non-zero int is returned. Ex: "A2H1" (one handed dude), "H2" (two-handed weapon), returns "H1" 
 | |
| ****/
 | |
| int slotsCompareSlots(char *diff, const char *haystack, char *needle) {
 | |
|   char difference[64];
 | |
|   char *h_slots = slotsBuildTable(haystack);
 | |
|   char *n_slots = slotsBuildTable(needle);
 | |
|   int i = 0;
 | |
|   int j = 0;
 | |
|   int v_i = 0;
 | |
|   while (i < 64) {
 | |
|     if (h_slots[i] < n_slots[i]) {
 | |
|       // value is the difference between the haystack and needle's current slot pair
 | |
|       char value[16];
 | |
|       itoa(n_slots[i]-h_slots[i], &value, 10);
 | |
| 
 | |
|       difference[j++] = i+64; // "convert" to alpha
 | |
|       // add our converted value to our difference string
 | |
|       v_i = 0;
 | |
|       while (value[v_i] != '\0') {
 | |
|         difference[j++] = value[v_i];
 | |
|         v_i++;
 | |
|       }
 | |
|     }
 | |
|     i++;
 | |
|   }
 | |
|   difference[j] = '\0'; // terminate our diff string
 | |
|   if (diff)
 | |
|     strcpy(diff, difference);
 | |
|   slotsFreeTable(h_slots);
 | |
|   slotsFreeTable(n_slots);
 | |
|   if (j > 0)
 | |
|     return 1;
 | |
|   else
 | |
|     return 0;
 | |
| }
 | |
| 
 | |
| int slotsCanAdd(char *needed_slots, const char *slots_total, const char *slots_used, const char *slots_to_add) {
 | |
|   char *t_slots = slotsBuildTable(slots_total);
 | |
|   char *u_slots = slotsBuildTable(slots_used);
 | |
|   char *a_slots = slotsBuildTable(slots_to_add);
 | |
| 
 | |
|   char value[16];
 | |
|   int v_i = 0;
 | |
|   char return_slots[64];
 | |
|   int return_value = 0;
 | |
| 
 | |
|   int i = 0;
 | |
|   int j = 0;
 | |
|   while (i < 64) {
 | |
|     if (t_slots[i] >= a_slots[i]) {
 | |
|       // if used slots and added_slots are greater than total slots
 | |
|       if (u_slots[i] + a_slots[i] > t_slots[i]) {
 | |
|         return_slots[j++] = i+64; // "convert integer to alpha
 | |
|         itoa((u_slots[i]+a_slots[i]) - t_slots[i], &value, 10);
 | |
|         v_i = 0;
 | |
|         while (value[v_i] != '\0') {
 | |
|           return_slots[j++] = value[v_i];
 | |
|           v_i++;
 | |
|         }
 | |
|         return_slots[j++] = '\0';
 | |
|         return_value = 2;
 | |
|         break;
 | |
|       }
 | |
|     // if slots to add are greater than our total slots
 | |
|     } else {
 | |
|       return_slots[j++] = i+64; // "convert integer to alpha
 | |
|       itoa(a_slots[i] - t_slots[i], &value, 10);
 | |
|       v_i = 0;
 | |
|       while (value[v_i] != '\0') {
 | |
|         return_slots[j++] = value[v_i];
 | |
|         v_i++;
 | |
|       }
 | |
|       return_slots[j++] = '\0';
 | |
|       return_value = 1;
 | |
|       break;
 | |
|     }
 | |
|     i++;
 | |
|   }
 | |
|   if (needed_slots)
 | |
|     strcpy(needed_slots, return_slots); // copy over to the passed string
 | |
|   slotsFreeTable(t_slots);
 | |
|   slotsFreeTable(u_slots);
 | |
|   slotsFreeTable(a_slots);
 | |
|   return(return_value);
 | |
| }
 | |
| 
 | |
| int slotsGreaterThanSlots(char *diff, const char *haystack, char *needle) {
 | |
|   char difference[64];
 | |
|   char *h_slots = slotsBuildTable(haystack);
 | |
|   char *n_slots = slotsBuildTable(needle);
 | |
|   int i = 0;
 | |
|   int j = 0;
 | |
|   int v_i = 0;
 | |
|   while (i < 64) {
 | |
|     if (n_slots[i] >= h_slots[i]) {
 | |
|       printf("%d avail, need %d\n", n_slots[i], h_slots[i]);
 | |
|       j++;
 | |
|     }
 | |
|     i++;
 | |
|   }
 | |
|   slotsFreeTable(h_slots);
 | |
|   slotsFreeTable(n_slots);
 | |
|   if (diff)
 | |
|     diff[0] = '\0';
 | |
|   if (j > 0)
 | |
|     return 1;
 | |
|   else
 | |
|     return 0;
 | |
| }
 | |
| 
 | |
| void slotsAddSlots(char *target, char *adding) {
 | |
|   char *t_slots = slotsBuildTable(target);
 | |
|   char *a_slots = slotsBuildTable(adding);
 | |
| 
 | |
|   char difference[64];
 | |
|   int j = 0;
 | |
|   int i = 0;
 | |
|   int v_i = 0;
 | |
|   while (i < 64) {
 | |
|     if (a_slots[i] > 0 || t_slots[i] > 0) {
 | |
|       char value[16];
 | |
|       itoa(t_slots[i]+a_slots[i], &value, 10);
 | |
|       difference[j++] = i+64;
 | |
|       v_i = 0;
 | |
|       while (value[v_i] != '\0') {
 | |
|         difference[j++] = value[v_i];
 | |
|         v_i++;
 | |
|       }
 | |
|     }
 | |
|     i++;
 | |
|   }
 | |
|   difference[j] = '\0';
 | |
|   slotsFreeTable(t_slots);
 | |
|   slotsFreeTable(a_slots);
 | |
|   strcpy(target, difference);
 | |
| }
 | |
| 
 | |
| void slotsRemoveSlots(char *target, char *removing) {
 | |
|   char *t_slots = slotsBuildTable(target);
 | |
|   char *r_slots = slotsBuildTable(removing);
 | |
| 
 | |
|   char difference[64];
 | |
|   int j = 0;
 | |
|   int i = 0;
 | |
|   int v_i = 0;
 | |
|   while (i < 64) {
 | |
|     if (r_slots[i] > 0 || t_slots[i] > 0) {
 | |
|       char value[16];
 | |
|       itoa(t_slots[i]-r_slots[i], &value, 10);
 | |
|       difference[j++] = i+64;
 | |
|       v_i = 0;
 | |
|       while (value[v_i] != '\0') {
 | |
|         difference[j++] = value[v_i];
 | |
|         v_i++;
 | |
|       }
 | |
|     }
 | |
|     i++;
 | |
|   }
 | |
|   difference[j] = '\0';
 | |
|   slotsFreeTable(t_slots);
 | |
|   slotsFreeTable(r_slots);
 | |
|   strcpy(target, difference);
 | |
| }
 | |
| 
 | |
| 
 | |
| char *slotsBuildTable(const char *slots) {
 | |
|   char *table = malloc(64);
 | |
|   memset(&table[0], 0, 64); // clear our table
 | |
|   int i = 0;
 | |
|   int j = 0;
 | |
|   char temp[64];
 | |
|   int t = 0;
 | |
|   while (slots[i] != '\0') {
 | |
|     if (slots[i] > 64) { // found a letter (kinda, we get some other chars too)!
 | |
|       j = i+1;
 | |
|       t = 0;
 | |
|       while (isdigit(slots[j])) {
 | |
|         temp[t] = slots[j];
 | |
|         j++;
 | |
|         t++;
 | |
|       }
 | |
|       temp[t] = '\0';
 | |
|       table[slots[i]-64] = atoi(temp);
 | |
|     }
 | |
|     i++;
 | |
|   }
 | |
|   /*i = 0;
 | |
|   while (i < 64) {
 | |
|     printf("slot %c reads %d\n:", i+64, table[i]);
 | |
|     i++;
 | |
|   }*/
 | |
|   return table;
 | |
| }
 | |
| 
 | |
| void slotsFreeTable(char *table) {
 | |
|   free(table);
 | |
| }
 |