variable.c 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. /*
  2. * File: variable.c
  3. * Author: Arthur Brandao
  4. *
  5. * Created on 21 décembre 2018
  6. */
  7. #include <stdio.h>
  8. #include <stdlib.h>
  9. #include "str.h"
  10. #include "expreg.h"
  11. #include "variable.h"
  12. /* --- Extern --- */
  13. subdiv localsd;
  14. char localmem[MEM_SIZE];
  15. boolean ini = false;
  16. /* --- Fonctions publiques --- */
  17. char* parse_var(char* s, subdiv* sd, char* mem) {
  18. expreg er;
  19. int length, deb, fin, fin2 = 0, compteur = 0, index = 0;
  20. boolean first = true;
  21. char* str, * newstr;
  22. //Cherche le nombre de clefs dans la chaine
  23. length = strlen(s);
  24. ini_expreg(&er, s, "(\\$[[:alnum:]_]+)");
  25. while ((str = get_match_expreg(&er, &deb, &fin)) != NULL) {
  26. //1er tour
  27. if (first) {
  28. //Si il y a du texte avant
  29. if (deb != 0) {
  30. compteur++;
  31. }
  32. compteur++;
  33. //Garde en memoire la pos de fin
  34. fin2 = fin;
  35. first = false;
  36. }
  37. //Autre tours
  38. else {
  39. //Si il y a eu du texte entre les deux correspondances
  40. if (deb != fin2) {
  41. compteur++;
  42. }
  43. compteur++;
  44. //Garde en memoire la pos de fin
  45. fin2 = fin;
  46. }
  47. free(str);
  48. }
  49. //Si on n'est pas à la fin
  50. if (fin2 != length) {
  51. compteur++;
  52. }
  53. clean_expreg(&er);
  54. //Création tableau
  55. char** tab = malloc(sizeof(char*) * compteur);
  56. //Sécoupe la chaine
  57. first = true;
  58. ini_expreg(&er, s, "(\\$[[:alnum:]_]+)");
  59. while ((str = get_match_expreg(&er, &deb, &fin)) != NULL) {
  60. //1er tour
  61. if (first) {
  62. //Si il y a du texte avant
  63. if (deb != 0) {
  64. tab[index] = malloc(sizeof(char) * (deb + 1));
  65. memset(tab[index], 0, deb + 1);
  66. strncpy(tab[index], s, deb);
  67. index++;
  68. }
  69. tab[index] = malloc(sizeof(char) * (fin - deb + 1));
  70. memset(tab[index], 0, fin - deb + 1);
  71. strncpy(tab[index], s + deb, fin - deb);
  72. index++;
  73. //Garde en memoire la pos de fin
  74. fin2 = fin;
  75. first = false;
  76. }
  77. //Autre tours
  78. else {
  79. //Si il y a eu du texte entre les deux correspondances
  80. if (deb != fin2) {
  81. tab[index] = malloc(sizeof(char) * (deb - fin2 + 1));
  82. memset(tab[index], 0, deb - fin2 + 1);
  83. strncpy(tab[index], s + fin2, deb - fin2);
  84. index++;
  85. }
  86. tab[index] = malloc(sizeof(char) * (fin - deb + 1));
  87. memset(tab[index], 0, fin - deb + 1);
  88. strncpy(tab[index], s + deb, fin - deb);
  89. index++;
  90. //Garde en memoire la pos de fin
  91. fin2 = fin;
  92. }
  93. free(str);
  94. }
  95. //Si on n'est pas à la fin
  96. if (fin2 != length) {
  97. tab[index] = malloc(sizeof(char) * (length - fin2 + 1));
  98. memset(tab[index], 0, length - fin2 + 1);
  99. strncpy(tab[index], s + fin2, length - fin2);
  100. index++;
  101. }
  102. clean_expreg(&er);
  103. //Remplace les clef par leurs valeurs
  104. for(int i = 0; i < compteur; i++){
  105. if(tab[i][0] == '$'){
  106. char* val = get_data_subdiv(sd, mem, tab[i] + 1);
  107. if(val != NULL){
  108. free(tab[i]);
  109. tab[i] = val;
  110. }
  111. }
  112. }
  113. //Reconstruit la chaine
  114. length = 0;
  115. for(int i = 0; i < compteur; i++){
  116. length += strlen(tab[i]);
  117. }
  118. newstr = malloc(sizeof(char) * (length + 1));
  119. memset(newstr, 0, length + 1);
  120. index = 0;
  121. for(int i = 0; i < compteur; i++){
  122. length = strlen(tab[i]);
  123. for(int j = 0; j < length; j++){
  124. newstr[index] = tab[i][j];
  125. index++;
  126. }
  127. free(tab[i]);
  128. }
  129. free(tab);
  130. return newstr;
  131. }
  132. char* parse_local_var(char* str){
  133. if(!ini){
  134. int length = strlen(str) + 1;
  135. char* newstr = malloc(sizeof(char) * length);
  136. memset(newstr, 0, length);
  137. strncpy(newstr, str, length - 1);
  138. return newstr;
  139. }
  140. return parse_var(str, &localsd, localmem);
  141. }
  142. boolean add_local_data(char* data){
  143. if(!ini){
  144. ini_subdiv(&localsd);
  145. ini = true;
  146. }
  147. return add_fdata_subdiv(&localsd, localmem, data);
  148. }
  149. boolean remove_local_data(char* key){
  150. if(!ini){
  151. return false;
  152. }
  153. return remove_data_subdiv(&localsd, localmem, key);
  154. }
  155. void show_local_data(){
  156. show_data_subdiv(&localsd, localmem);
  157. }