00001
00002 #include <stdio.h>
00003 #include <string.h>
00004 #include <stdlib.h>
00005 #include <ctype.h>
00006 #include <stddef.h>
00007 #include <stdio.h>
00008 #include <stdarg.h>
00009
00010 #include "logger.h"
00011 #include "pldstr.h"
00012
00013 #include "MALLOC.h"
00014
00015 #ifdef _MSC_VER
00016 #define vsnprintf _vsnprintf
00017 #define strdup _strdup
00018 #endif
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037 char *PLD_strstr(char *haystack, char *needle, int insensitive)
00038 {
00039 char *hs, *ne;
00040 char *result;
00041
00042
00043
00044 if (insensitive > 0)
00045 {
00046 hs = strdup(haystack);
00047 PLD_strlower(hs);
00048 ne = strdup(needle);
00049 PLD_strlower(ne);
00050 } else {
00051 hs = haystack;
00052 ne = needle;
00053 }
00054
00055 result = strstr(hs, ne);
00056
00057
00058
00059 if ((result != NULL)&&(insensitive > 0))
00060 {
00061 result = result -hs +haystack;
00062 FREE(hs);
00063 FREE(ne);
00064
00065
00066 }
00067
00068 return result;
00069 }
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082 char *PLD_strncpy (char *dst, const char *src, size_t len)
00083 {
00084
00085
00086
00087
00088
00089
00090
00091 if (len==0) return NULL;
00092
00093
00094
00095
00096 if (dst)
00097 {
00098 char *dp = dst;
00099
00100
00101
00102 if (src)
00103 {
00104 char *sp = (char *)src;
00105 while ((--len)&&(*sp)) { *dp=*sp; dp++; sp++; }
00106 }
00107
00108 *dp='\0';
00109 }
00110
00111 return dst;
00112 }
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127 char *PLD_strncat( char *dst, const char *src, size_t len )
00128 {
00129 char *dp = dst;
00130 const char *sp = src;
00131 size_t cc;
00132
00133 if (len == 0) return dst;
00134
00135 len--;
00136
00137
00138 cc = 0;
00139 while ((*dp)&&(cc < len)) { dp++; cc++; }
00140
00141
00142
00143 if (cc >= len) return dst;
00144
00145
00146
00147 while ((*sp)&&(cc < len))
00148 {
00149 cc++;
00150 *dp = *sp;
00151 dp++;
00152 sp++;
00153 }
00154
00155
00156
00157 *dp = '\0';
00158
00159 return dst;
00160 }
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176 char *PLD_strncate( char *dst, const char *src, size_t len, char *endpoint )
00177 {
00178 char *dp = dst;
00179 const char *sp = src;
00180 size_t cc = 0;
00181
00182 if (len == 0) return dst;
00183
00184 len--;
00185
00186
00187
00188
00189 if ((!endpoint)||(endpoint == dst)||((endpoint -dst +1)>(int)len))
00190 {
00191
00192 cc = 0;
00193 while ((*dp != '\0')&&(cc < len)) { dp++; cc++; }
00194 }
00195 else {
00196 cc = endpoint -dst +1;
00197 dp = endpoint;
00198 }
00199
00200
00201
00202 if (cc >= len) return dst;
00203
00204
00205
00206 while ((*sp)&&(cc < len))
00207 {
00208 cc++;
00209 *dp = *sp;
00210 dp++;
00211 sp++;
00212 }
00213
00214
00215
00216 *dp = '\0';
00217
00218 return dst;
00219 }
00220
00221
00222
00223
00224
00225
00226
00227
00228
00229
00230
00231
00232
00233
00234 int PLD_strncasecmp( char *s1, char *s2, int n )
00235 {
00236 char *ds1 = s1, *ds2 = s2;
00237 char c1, c2;
00238 int result = 0;
00239
00240 while(n > 0)
00241 {
00242 c1 = tolower(*ds1);
00243 c2 = tolower(*ds2);
00244
00245 if (c1 == c2)
00246 {
00247 n--;
00248 ds1++;
00249 ds2++;
00250 }
00251 else
00252 {
00253 result = c2 - c1;
00254 n = 0;
00255 }
00256
00257 }
00258
00259 return result;
00260
00261 }
00262
00263
00264
00265
00266
00267
00268
00269
00270
00271
00272
00273
00274 char *PLD_strtok( struct PLD_strtok *st, char *line, char *delimeters )
00275 {
00276 char *stop;
00277 char *dc;
00278 char *result = NULL;
00279
00280 if ( line )
00281 {
00282 st->start = line;
00283 }
00284
00285
00286
00287 dc = delimeters;
00288 while ((st->start)&&(*dc != '\0'))
00289 {
00290 if (*dc == *(st->start))
00291 {
00292 st->start++;
00293 dc = delimeters;
00294 }
00295 else dc++;
00296 }
00297
00298
00299
00300 result = st->start;
00301
00302 if ((st->start)&&(st->start != '\0'))
00303 {
00304 stop = strpbrk( st->start, delimeters );
00305
00306
00307
00308
00309
00310 if (stop)
00311 {
00312
00313
00314
00315 st->delimeter = *stop;
00316
00317
00318
00319 *stop = '\0';
00320
00321
00322
00323
00324
00325
00326
00327 stop++;
00328 dc = delimeters;
00329 while (*dc != '\0')
00330 {
00331 if (*dc == *stop)
00332 {
00333 stop++;
00334 dc = delimeters;
00335 }
00336 else dc++;
00337 }
00338
00339 if (*stop == '\0') st->start = NULL;
00340 else st->start = stop;
00341
00342 }
00343 else {
00344 st->start = NULL;
00345 st->delimeter = '\0';
00346 }
00347 }
00348 else {
00349 st->start = NULL;
00350 result = NULL;
00351 }
00352
00353
00354 return result;
00355 }
00356
00357
00358
00359
00360
00361
00362
00363
00364
00365
00366 int PLD_strlower( unsigned char *convertme )
00367 {
00368
00369
00370
00371
00372
00373 char *c = convertme;
00374
00375 while ( *c != '\0') {*c = tolower((int)*c); c++;}
00376
00377 return 0;
00378 }
00379
00380
00381
00382
00383
00384
00385
00386
00387
00388
00389
00390
00391
00392
00393
00394
00395
00396
00397
00398
00399
00400
00401
00402
00403 char *PLD_strreplace_general( struct PLD_strreplace *replace_details )
00404 {
00405 char *new_buffer=NULL;
00406 char *source_end;
00407 char *segment_start, *segment_end, *segment_p;
00408 char *new_p;
00409 char *preexist_location=NULL;
00410 char *postexist_location=NULL;
00411 int replace_count=0;
00412 int size_required;
00413 int size_difference;
00414 int source_length;
00415 int searchfor_length;
00416 int replacewith_length;
00417 int segment_ok;
00418
00419 if (replace_details->source == NULL) return NULL;
00420
00421 source_length = strlen( replace_details->source );
00422 source_end = replace_details->source +source_length;
00423 searchfor_length = strlen(replace_details->searchfor);
00424 replacewith_length = strlen(replace_details->replacewith);
00425 size_difference = replacewith_length -searchfor_length;
00426 size_required = source_length;
00427 replace_count = replace_details->replacenumber;
00428
00429 if ((replace_details->preexist != NULL)&&(strlen(replace_details->preexist) < 1)) replace_details->preexist = NULL;
00430 if ((replace_details->postexist != NULL)&&(strlen(replace_details->postexist) < 1)) replace_details->postexist = NULL;
00431
00432
00433
00434
00435
00436 if (replace_details->preexist != NULL)
00437 {
00438 preexist_location = PLD_strstr(replace_details->source, replace_details->preexist, replace_details->insensitive);
00439 if (preexist_location == NULL)
00440 {
00441 return replace_details->source;
00442 }
00443 }
00444
00445
00446
00447 if (replace_details->postexist != NULL)
00448 {
00449 char *p = replace_details->source;
00450 postexist_location = NULL;
00451 do {
00452 p = PLD_strstr(p, replace_details->postexist, replace_details->insensitive);
00453 if (p != NULL)
00454 {
00455 postexist_location = p;
00456 p = p +strlen(replace_details->postexist);
00457 }
00458 } while (p != NULL);
00459
00460 if (postexist_location == NULL)
00461 {
00462 return replace_details->source;
00463 }
00464 }
00465
00466
00467
00468
00469
00470
00471
00472
00473 if (size_difference > 0)
00474 {
00475 if (replace_count == 0)
00476 {
00477 char *p, *q;
00478
00479 p = replace_details->source;
00480 q = PLD_strstr(p, replace_details->searchfor, replace_details->insensitive);
00481 while (q != NULL)
00482 {
00483 replace_count++;
00484
00485 p = q +searchfor_length;
00486 q = PLD_strstr(p, replace_details->searchfor, replace_details->insensitive);
00487 }
00488
00489 }
00490 size_required = source_length +(size_difference *replace_count) +1;
00491 } else size_required = source_length +1;
00492
00493
00494
00495
00496 new_buffer = MALLOC( sizeof(char) *size_required);
00497 if (new_buffer == NULL)
00498 {
00499 LOGGER_log("%s:%d:PLD_strreplace:ERROR: Cannot allocate %d bytes of memory to perform replacement operation", FL, size_required);
00500 return replace_details->source;
00501 }
00502
00503
00504
00505
00506
00507 segment_start = replace_details->source;
00508
00509
00510
00511 segment_ok = 0;
00512 segment_end = PLD_strstr(replace_details->source, replace_details->searchfor, replace_details->insensitive);
00513
00514
00515
00516 while ((segment_end != NULL)&&(segment_ok == 0)\
00517 &&((replace_details->preexist != NULL)||(replace_details->postexist != NULL)))
00518 {
00519 int pre_ok = 0;
00520 int post_ok = 0;
00521
00522
00523
00524
00525
00526
00527
00528
00529
00530
00531
00532
00533
00534 if (preexist_location == NULL) pre_ok = 1;
00535 else if (preexist_location < segment_end){ pre_ok = 1;}
00536
00537 if (postexist_location == NULL) post_ok = 1;
00538 else if (postexist_location > segment_end){ post_ok = 1;}
00539
00540 if ((pre_ok == 0)||(post_ok == 0)) { segment_end = PLD_strstr(segment_end +searchfor_length, replace_details->searchfor, replace_details->insensitive); }
00541 else segment_ok = 1;
00542 }
00543
00544 segment_p = segment_start;
00545 new_p = new_buffer;
00546 while (segment_start != NULL)
00547 {
00548 int replacewith_count;
00549 char *replacewith_p;
00550
00551 if (segment_end == NULL) segment_end = source_end;
00552
00553 replace_count--;
00554
00555
00556 segment_p = segment_start;
00557 while ((segment_p < segment_end)&&(size_required > 0))
00558 {
00559 *new_p = *segment_p;
00560 new_p++;
00561 segment_p++;
00562 size_required--;
00563 }
00564
00565
00566 if (segment_end < source_end)
00567 {
00568 replacewith_count = replacewith_length;
00569 replacewith_p = replace_details->replacewith;
00570 while ((replacewith_count--)&&(size_required > 0))
00571 {
00572 *new_p = *replacewith_p;
00573 new_p++;
00574 replacewith_p++;
00575 size_required--;
00576 }
00577 }
00578
00579 if (size_required < 1 )
00580 {
00581 LOGGER_log("%s:%d:PLD_strreplace_general: Allocated memory ran out while replacing '%s' with '%s'",FL, replace_details->searchfor, replace_details->replacewith);
00582 *new_p='\0';
00583 break;
00584 }
00585
00586
00587 segment_start = segment_end +searchfor_length;
00588
00589
00590
00591
00592
00593
00594
00595
00596
00597
00598 if (replace_count == 0)
00599 {
00600 segment_end = NULL;
00601 } else {
00602
00603
00604
00605
00606
00607
00608
00609
00610
00611
00612
00613 if (segment_start > source_end)
00614 {
00615 segment_start = NULL;
00616 } else {
00617
00618
00619 segment_ok = 0;
00620 segment_end = PLD_strstr(segment_end +searchfor_length, replace_details->searchfor, replace_details->insensitive);
00621
00622
00623
00624
00625
00626 while ((segment_end != NULL)&&(segment_ok == 0)\
00627 &&((replace_details->preexist != NULL)||(replace_details->postexist != NULL)))
00628 {
00629 int pre_ok = 0;
00630 int post_ok = 0;
00631
00632
00633
00634
00635
00636
00637
00638
00639
00640
00641
00642
00643
00644 if (preexist_location == NULL) pre_ok = 1;
00645 else if (preexist_location < segment_end){ pre_ok = 1;}
00646
00647 if (postexist_location == NULL) post_ok = 1;
00648 else if (postexist_location > segment_end){ post_ok = 1;}
00649
00650 if ((pre_ok == 0)||(post_ok == 0)) { segment_end = PLD_strstr(segment_end +searchfor_length, replace_details->searchfor, replace_details->insensitive); }
00651 else segment_ok = 1;
00652 }
00653
00654 }
00655
00656 }
00657
00658 }
00659
00660 *new_p = '\0';
00661
00662 if (replace_details->source != NULL) FREE (replace_details->source);
00663 replace_details->source = new_buffer;
00664 return new_buffer;
00665 }
00666
00667
00668
00669
00670
00671
00672
00673
00674
00675
00676
00677
00678
00679
00680
00681
00682
00683
00684
00685 char *PLD_strreplace( char **source, char *searchfor, char *replacewith, int replacenumber )
00686 {
00687 struct PLD_strreplace replace_details;
00688 char *tmp_source;
00689
00690 replace_details.source = *source;
00691 replace_details.searchfor = searchfor;
00692 replace_details.replacewith = replacewith;
00693 replace_details.replacenumber = replacenumber;
00694 replace_details.preexist = NULL;
00695 replace_details.postexist = NULL;
00696 replace_details.insensitive = 0;
00697
00698 tmp_source = PLD_strreplace_general( &replace_details );
00699
00700 if (tmp_source != *source) *source = tmp_source;
00701
00702 return *source;
00703 }
00704
00705
00706
00707
00708
00709
00710
00711
00712
00713
00714
00715
00716
00717
00718
00719
00720
00721
00722
00723
00724
00725 char *PLD_dprintf(const char *format, ...)
00726 {
00727 int n, size = 1024;
00728 char *p;
00729 va_list ap;
00730
00731
00732 p = MALLOC(size *sizeof(char));
00733 if (p == NULL) return NULL;
00734
00735 while (1)
00736 {
00737
00738 va_start(ap, format);
00739
00740 n = vsnprintf (p, size, format, ap);
00741 va_end(ap);
00742
00743
00744 if ((n > -1) && (n < size)) return p;
00745
00746
00747
00748
00749
00750
00751
00752
00753 if (n > -1) size = n+1;
00754 else size *= 2;
00755
00756
00757
00758
00759 if (1)
00760 {
00761 char *tmp_p;
00762
00763 tmp_p = REALLOC(p, size);
00764 if (tmp_p == NULL){ if (p != NULL) FREE(p); return NULL; }
00765 else p = tmp_p;
00766 }
00767 }
00768
00769 }
00770
00771
00772