Guest User

label.c

a guest
Nov 27th, 2022
60
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.37 KB | Source Code | 0 0
  1. #include "label.h"
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <stdint.h>
  5.  
  6. static void pushLabelDef(labelDefArr_t *defs, char *name, uint16_t cmdNo)
  7. {
  8.   size_t num = defs->num++;
  9.  
  10.   if(num == 0)
  11.     defs->ptr = malloc(sizeof(labelDef_t));
  12.   else if(!(num & (num - 1)))
  13.     defs->ptr = realloc(defs->ptr, (2 * num * sizeof(labelDef_t)));
  14.  
  15.   strcpy(defs->ptr[num].name, name);
  16.   defs->ptr[num].cmdNo = cmdNo;
  17. }
  18.  
  19. static uint16_t findOrPushLabelDef(labelDefArr_t *defs, char *name)
  20. {
  21.   uint16_t num = defs->num;
  22.  
  23.   for(size_t i = 0; i < num; i++)
  24.     if(!strcmp(defs->ptr[i].name, name))
  25.       return i;
  26.  
  27.   pushLabelDef(defs, name, 0);
  28.   return num;
  29. }
  30.  
  31. static void pushLabelUse(labelUseArr_t *uses, uint16_t cmdNo, uint16_t labelNo)
  32. {
  33.   size_t num = uses->num++;
  34.  
  35.   if(num == 0)
  36.     uses->ptr = malloc(sizeof(labelUse_t));
  37.   else if(!(num & (num - 1)))
  38.     uses->ptr = realloc(uses->ptr, (2 * num * sizeof(labelUse_t)));
  39.  
  40.   uses->ptr[num].cmdNo = cmdNo;
  41.   uses->ptr[num].labelNo = labelNo;
  42. }
  43.  
  44. void addLabelDef(labelMapping_t *mapping, char *name, uint16_t cmdNo)
  45. {
  46.   uint16_t defNo = findOrPushLabelDef(&mapping->defs, name);
  47.   mapping->defs.ptr[defNo].cmdNo = cmdNo;
  48. }
  49.  
  50. void addLabelUse(labelMapping_t *mapping, char *name, uint16_t cmdNo)
  51. {
  52.   uint16_t defNo = findOrPushLabelDef(&mapping->defs, name);
  53.   pushLabelUse(&mapping->uses, cmdNo, defNo);
  54. }
  55.  
Advertisement
Add Comment
Please, Sign In to add comment