fork download
  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. int setNthValueMax(int index, const char *old_values, const char *new_value, char *result)
  5. {
  6. int i = 0;
  7. const char d = ';';
  8. const char *d1 = 0, *d2 = 0; // delimiters: d1 is for N(index-1) & N(index); d2 is for N(index) & N(index+1)
  9. char *p = result;
  10.  
  11. for (d1 = old_values; i < index && d1; i++)
  12. d1 = strchr(d1 + 1, d);
  13.  
  14. if (d1) { // has ending delimiter
  15. d2 = strchr(d1 + 1, d);
  16. if (index) {
  17. strncpy(p, old_values, d1 - old_values + 1); // 1. copy old value until d1
  18. p += d1 - old_values + 1;
  19. i = index - i;
  20. while (i--)
  21. p += sprintf(p, "%c", d); // 2. append missing delimiters
  22. }
  23. p += sprintf(p, "%s", new_value); // 3. append new value
  24. if (d2)
  25. strcpy(p, d2); // 4. append rest old values
  26. } else { // has no ending delimiter
  27. p += sprintf(p, "%s", old_values); // 1. copy whole old vaules
  28. i = index - i + 1;
  29. while (i--)
  30. p += sprintf(p, "%c", d); // 2. append missing delimiters
  31. sprintf(p, "%s", new_value); // 3. append new value
  32. }
  33. return 0;
  34. }
  35.  
  36. int getNthValueSafe(int index, char *value, char delimit, char *result, int len)
  37. {
  38. int i=0, result_len=0;
  39. char *begin, *end;
  40.  
  41. if(!value || !result || !len)
  42. return -1;
  43.  
  44. begin = value;
  45. end = strchr(begin, delimit);
  46.  
  47. while(i<index && end){
  48. begin = end+1;
  49. end = strchr(begin, delimit);
  50. i++;
  51. }
  52.  
  53. //no delimit
  54. if(!end){
  55. if(i == index){
  56. end = begin + strlen(begin);
  57. result_len = (len-1) < (end-begin) ? (len-1) : (end-begin);
  58. }else
  59. return -1;
  60. }else
  61. result_len = (len-1) < (end-begin)? (len-1) : (end-begin);
  62.  
  63. memcpy(result, begin, result_len );
  64. *(result+ result_len ) = '\0';
  65.  
  66. return 0;
  67. }
  68.  
  69. char *set_ssid_value_safe(int i, char *old_value, char *nth_value, char *set_value)
  70. {
  71. char *buf[4];
  72. if (getNthValueSafe(i, old_value, ';', nth_value, sizeof(nth_value)) != -1) {
  73.  
  74. /*if (set_value != "") {
  75. printf("has value\n");
  76.  
  77. } else {
  78. printf("don't have value\n");
  79. set_value = nth_value;
  80. printf("newnew: %s\n", set_value);
  81. }*/
  82. buf[i] = nth_value;
  83. if (nth_value != NULL) {
  84. if (set_value == "") {
  85. printf("don't have value, old = %s\n", buf[i]);
  86. //buf[i] = nth_value;
  87. //sprintf(buf, "%s", nth_value);
  88. //printf("buf = %s", buf[i]);
  89. //sprintf(set_value, "%s", buf);
  90. set_value = buf[i];
  91. return set_value;
  92. //sprintf(buf, );
  93. } else
  94. return set_value;
  95. }
  96. }
  97.  
  98. }
  99.  
  100. int main(void) {
  101. char *s_radius_server = "1;2;3;4";
  102. char *s_rad_ip[4], *ori[4];
  103.  
  104. int i;
  105. char buf[100], rec[64];
  106.  
  107. s_rad_ip[0] = "192.168.1.1";
  108. s_rad_ip[1] = "";
  109. s_rad_ip[2] = "192.168.1.3";
  110. s_rad_ip[3] = "192.168.1.4";
  111.  
  112. for (i = 0; i < 4; i++) {
  113. #if 0
  114. if (getNthValueSafe(i, s_radius_server, ';', buf, sizeof(buf)) != -1) {
  115. /*if (set_value != "") {
  116. printf("has value\n");
  117.  
  118. } else {
  119. printf("don't have value\n");
  120. set_value = nth_value;
  121. printf("newnew: %s\n", set_value);
  122. }*/
  123. if (!*s_rad_ip[i]) {
  124. printf("don't have value, old = %s\n", buf);
  125. //s_rad_ip[i] = buf;
  126. //sprintf(buf, "%s", nth_value);
  127. sprintf(s_rad_ip[i], "%s", buf);
  128. printf("buf = %s", s_rad_ip[i]);
  129.  
  130. //set_value = buf[i];
  131. //return nth_value;//buf[i];
  132. //sprintf(buf, );
  133. } else
  134. s_rad_ip[i] = s_rad_ip[i];
  135. }
  136. #endif
  137.  
  138.  
  139. ori[i] = set_ssid_value_safe(i, s_radius_server, buf, s_rad_ip[i]);
  140. printf("out = %s\n", ori[i]);
  141. //s_rad_ip[i] = ori[i];
  142. }
  143. //s_rad_ip[1] = "5";
  144. for (i = 0; i < 4; i++) {
  145. printf("new = %s\n", ori[i]);
  146. }
  147. return 0;
  148. }
Success #stdin #stdout 0s 4472KB
stdin
Standard input is empty
stdout
out = 192.168.1.1
don't have value, old = 2
out = 2
out = 192.168.1.3
out = 192.168.1.4
new = 192.168.1.1
new = 4
new = 192.168.1.3
new = 192.168.1.4