00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #include <malloc.h>
00014 #include <string.h>
00015 #include <stdlib.h>
00016 #include <math.h>
00017 #include <ctype.h>
00018 #include "WSxM_header.h"
00019
00020
00021 #ifndef WSXM_MAXCHARS
00022 #define WSXM_MAXCHARS 1000
00023 #endif
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033 FileIdStruc FileId[] = {
00034
00035 {0, "SPM Image", "Topography", "SxM Image file\n", ".top", "-TOPO"}
00036 ,
00037 {1, "SPM Movie", "Topography Movie", "Movie Image file\n", ".mpp", "-MOVIE"}
00038 ,
00039 {2, "CITS File", "Current Imaging Tunneling Spectroscopy", "CITS Image file\n", ".cit", "-CITS"}
00040 ,
00041 {3, "IV File", "IV Curve", "IV curve file\n", ".iv.cur", "-IV"}
00042 ,
00043 {4, "IZ File", "IZ Curve", "IZ curve file\n", ".iz.cur", "-IZ"}
00044 ,
00045 {5, "ZV File", "ZV Curve", "ZV curve file\n", ".zv.cur", "-ZV"}
00046 ,
00047 {6, "FZ File", "FZ Curve", "FZ curve file\n", ".fz.cur", "-FZ"}
00048 ,
00049 {7, "Generic Curves", "Generic Curve", "Generic curve file\n", ".curve", "-generic"}
00050 ,
00051 {8, NULL, NULL, NULL, NULL}
00052 };
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063 void HeaderInit(WSxM_HEADER * pHeader)
00064 {
00065 if (pHeader == NULL)
00066 return;
00067
00068 pHeader->tszTitles = NULL;
00069 pHeader->tszLabels = NULL;
00070 pHeader->tszValues = NULL;
00071
00072 pHeader->iNumFields = 0;
00073 }
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096 int HeaderRead(WSxM_HEADER * pHeader, FILE * pFile)
00097 {
00098 int iStatus = 0;
00099
00100 if ((pHeader == NULL) || (pFile == NULL))
00101 return -1;
00102
00103 if (pHeader->iNumFields != 0)
00104 return -1;
00105
00106
00107
00108 while (iStatus == 0) {
00109 iStatus = HeaderReadLine(pHeader, pFile);
00110 }
00111
00112 if (iStatus == -1) {
00113 return -1;
00114 }
00115
00116 return 0;
00117 }
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138 int HeaderWrite(WSxM_HEADER * pHeader, FILE * pFile)
00139 {
00140 int i, j;
00141 char *pCharAux;
00142 char szAuxTitle[100], szAuxLabel[100], szAuxValue[WSXM_MAXCHARS];
00143
00144
00145
00146 for (i = 0; i < pHeader->iNumFields; i++) {
00147 for (j = 0; j < (pHeader->iNumFields - i - 1); j++) {
00148 if ((strcmp(pHeader->tszTitles[j], pHeader->tszTitles[j + 1]) >
00149 0)
00150 ||
00151 (strcmp(pHeader->tszTitles[j], pHeader->tszTitles[j + 1])
00152 == 0)
00153 &&
00154 (strcmp(pHeader->tszLabels[j], pHeader->tszLabels[j + 1]) >
00155 0)) {
00156
00157
00158
00159
00160 pCharAux = pHeader->tszTitles[j];
00161 pHeader->tszTitles[j] = pHeader->tszTitles[j + 1];
00162 pHeader->tszTitles[j + 1] = pCharAux;
00163
00164
00165 pCharAux = pHeader->tszLabels[j];
00166 pHeader->tszLabels[j] = pHeader->tszLabels[j + 1];
00167 pHeader->tszLabels[j + 1] = pCharAux;
00168
00169
00170 pCharAux = pHeader->tszValues[j];
00171 pHeader->tszValues[j] = pHeader->tszValues[j + 1];
00172 pHeader->tszValues[j + 1] = pCharAux;
00173 }
00174 }
00175 }
00176
00177
00178 fprintf(pFile, "%s", TEXT_COPYRIGHT_NANOTEC);
00179 fprintf(pFile, "%s", STM_IMAGE_FILE_ID);
00180 fprintf(pFile, "%s%d\n", IMAGE_HEADER_SIZE_TEXT,
00181 HeaderGetSize(pHeader));
00182
00183
00184 strcpy(szAuxTitle, "");
00185
00186
00187 for (i = 0; i < pHeader->iNumFields; i++) {
00188
00189 if (strcmp(szAuxTitle, pHeader->tszTitles[i]) != 0) {
00190
00191 strcpy(szAuxTitle, pHeader->tszTitles[i]);
00192 ReplaceStringInString(szAuxTitle, "\\", "\\\\");
00193 ReplaceStringInString(szAuxTitle, "\r\n", "\\n");
00194
00195
00196 fprintf(pFile, "\n[%s]\n\n", szAuxTitle);
00197 }
00198
00199
00200 strcpy(szAuxLabel, pHeader->tszLabels[i]);
00201 ReplaceStringInString(szAuxLabel, "\\", "\\\\");
00202 ReplaceStringInString(szAuxLabel, "\r\n", "\\n");
00203
00204
00205 strcpy(szAuxValue, pHeader->tszValues[i]);
00206 ReplaceStringInString(szAuxValue, "\\", "\\\\");
00207 ReplaceStringInString(szAuxValue, "\r\n", "\\n");
00208 RemoveLeftAndRightWhitesFromString(szAuxValue);
00209
00210
00211 fprintf(pFile, " %s: %s\n", szAuxLabel, szAuxValue);
00212 }
00213
00214
00215 fprintf(pFile, "\n[%s]\n", IMAGE_HEADER_END_TEXT);
00216
00217 return 0;
00218 }
00219
00221 int HeaderWrite(WSxM_HEADER * pHeader, FILE * pFile, gchar * cType)
00222 {
00223 int i, j;
00224 char *pCharAux;
00225 char szAuxTitle[100], szAuxLabel[100], szAuxValue[WSXM_MAXCHARS];
00226 FileIdStruc *FileIdPtr = FileId;
00227
00228
00229 for (i = 0; i < pHeader->iNumFields; i++) {
00230 for (j = 0; j < (pHeader->iNumFields - i - 1); j++) {
00231 if ((strcmp(pHeader->tszTitles[j], pHeader->tszTitles[j + 1]) >
00232 0)
00233 ||
00234 (strcmp(pHeader->tszTitles[j], pHeader->tszTitles[j + 1])
00235 == 0)
00236 &&
00237 (strcmp(pHeader->tszLabels[j], pHeader->tszLabels[j + 1]) >
00238 0)) {
00239
00240
00241
00242
00243 pCharAux = pHeader->tszTitles[j];
00244 pHeader->tszTitles[j] = pHeader->tszTitles[j + 1];
00245 pHeader->tszTitles[j + 1] = pCharAux;
00246
00247
00248 pCharAux = pHeader->tszLabels[j];
00249 pHeader->tszLabels[j] = pHeader->tszLabels[j + 1];
00250 pHeader->tszLabels[j + 1] = pCharAux;
00251
00252
00253 pCharAux = pHeader->tszValues[j];
00254 pHeader->tszValues[j] = pHeader->tszValues[j + 1];
00255 pHeader->tszValues[j + 1] = pCharAux;
00256 }
00257 }
00258 }
00259
00260
00261 fprintf(pFile, "%s", TEXT_COPYRIGHT_NANOTEC);
00262 for (; FileIdPtr->name != 0; ++FileIdPtr) {
00263 if (strstr(FileIdPtr->name, cType)) {
00264 fprintf(pFile, "%s", FileIdPtr->fileidtag);
00265 }
00266 }
00267 fprintf(pFile, "%s%d\n", IMAGE_HEADER_SIZE_TEXT,
00268 HeaderGetSize(pHeader));
00269
00270
00271 strcpy(szAuxTitle, "");
00272
00273
00274 for (i = 0; i < pHeader->iNumFields; i++) {
00275
00276 if (strcmp(szAuxTitle, pHeader->tszTitles[i]) != 0) {
00277
00278 strcpy(szAuxTitle, pHeader->tszTitles[i]);
00279 ReplaceStringInString(szAuxTitle, "\\", "\\\\");
00280 ReplaceStringInString(szAuxTitle, "\r\n", "\\n");
00281
00282
00283 fprintf(pFile, "\n[%s]\n\n", szAuxTitle);
00284 }
00285
00286
00287 strcpy(szAuxLabel, pHeader->tszLabels[i]);
00288 ReplaceStringInString(szAuxLabel, "\\", "\\\\");
00289 ReplaceStringInString(szAuxLabel, "\r\n", "\\n");
00290
00291
00292 strcpy(szAuxValue, pHeader->tszValues[i]);
00293 ReplaceStringInString(szAuxValue, "\\", "\\\\");
00294 ReplaceStringInString(szAuxValue, "\r\n", "\\n");
00295 RemoveLeftAndRightWhitesFromString(szAuxValue);
00296
00297
00298 fprintf(pFile, " %s: %s\n", szAuxLabel, szAuxValue);
00299 }
00300
00301
00302 fprintf(pFile, "\n[%s]\n", IMAGE_HEADER_END_TEXT);
00303
00304 return 0;
00305 }
00306
00307
00308
00309
00310
00311
00312
00313
00314
00315
00316
00317
00318
00319
00320
00321
00322
00323
00324
00325
00326
00327
00328
00329 double HeaderGetAsNumber(WSxM_HEADER * pHeader, char *szTitle,
00330 char *szLabel)
00331 {
00332 char szValue[WSXM_MAXCHARS] = "";
00333 if (HeaderGetAsString(pHeader, szTitle, szLabel, szValue) != 0) {
00334 return 0;
00335 }
00336 return atof(szValue);
00337 }
00338
00339
00340
00341
00342
00343
00344
00345
00346
00347
00348
00349
00350
00351
00352
00353
00354
00355
00356
00357
00358
00359
00360 int HeaderGetAsString(WSxM_HEADER * pHeader, char *szTitle, char *szLabel,
00361 char *szValue)
00362 {
00363 int iIndex;
00364
00365
00366 for (iIndex = 0; iIndex < pHeader->iNumFields; iIndex++) {
00367 if ((strcmp(szTitle, pHeader->tszTitles[iIndex]) == 0)
00368 && (strcmp(szLabel, pHeader->tszLabels[iIndex]) == 0)) {
00369
00370 break;
00371 }
00372 }
00373
00374 if (iIndex == pHeader->iNumFields) {
00375
00376 return -1;
00377 }
00378
00379
00380 strcpy(szValue, pHeader->tszValues[iIndex]);
00381
00382
00383 return 0;
00384 }
00385
00386
00387
00388
00389
00390
00391
00392
00393
00394
00395
00396
00397
00398
00399
00400
00401
00402
00403
00404 void HeaderReadTitle(char *szLine, char *szTitle)
00405 {
00406 int iIndex = 0;
00407
00408
00409 if (szLine[0] != '[') {
00410 strcpy(szTitle, "");
00411 return;
00412 }
00413
00414
00415 while (szLine[iIndex] != ']') {
00416 iIndex++;
00417 }
00418
00419
00420
00421
00422 strncpy(szTitle, &szLine[1], iIndex - 1);
00423 szTitle[iIndex - 1] = '\0';
00424 }
00425
00426
00427
00428
00429
00430
00431
00432
00433
00434
00435
00436
00437
00438
00439
00440
00441
00442
00443
00444 void HeaderReadLabel(char *szLine, char *szLabel)
00445 {
00446 unsigned int iIndex = 0;
00447
00448
00449 while (szLine[iIndex] != ':') {
00450 if (iIndex == strlen(szLine)) {
00451
00452 strcpy(szLabel, "");
00453 return;
00454 }
00455 iIndex++;
00456 }
00457
00458
00459
00460
00461 strncpy(szLabel, szLine, iIndex);
00462 szLabel[iIndex] = '\0';
00463 }
00464
00465
00466
00467
00468
00469
00470
00471
00472
00473
00474
00475
00476
00477
00478
00479
00480
00481
00482
00483 void HeaderReadValue(char *szLine, char *szValue)
00484 {
00485 unsigned int iIndex = 0;
00486
00487
00488 while (szLine[iIndex] != ':') {
00489 if (iIndex == strlen(szLine)) {
00490
00491 strcpy(szValue, "");
00492 return;
00493 }
00494 iIndex++;
00495 }
00496
00497
00498 iIndex += 2;
00499
00500
00501
00502
00503 strncpy(szValue, &szLine[iIndex], strlen(szLine) - iIndex - 1);
00504 szValue[strlen(szLine) - iIndex - 1] = '\0';
00505 }
00506
00507
00508
00509
00510
00511
00512
00513
00514
00515
00516
00517
00518
00519
00520
00521
00522
00523
00524
00525
00526
00527 void HeaderSetAsFloating(WSxM_HEADER * pHeader, char *szTitle,
00528 char *szLabel, double lfValue)
00529 {
00530 char szValue[WSXM_MAXCHARS] = "";
00531
00532
00533 sprintf(szValue, "%.61f", lfValue);
00534
00535
00536 HeaderSetAsString(pHeader, szTitle, szLabel, szValue);
00537 }
00538
00539
00540
00541
00542
00543
00544
00545
00546
00547
00548
00549
00550
00551
00552
00553
00554
00555
00556
00557 void HeaderSetAsInt(WSxM_HEADER * pHeader, char *szTitle, char *szLabel,
00558 int iValue)
00559 {
00560 char szValue[WSXM_MAXCHARS] = "";
00561
00562
00563 sprintf(szValue, "%d", iValue);
00564
00565
00566 HeaderSetAsString(pHeader, szTitle, szLabel, szValue);
00567 }
00568
00569
00570
00571
00572
00573
00574
00575
00576
00577
00578
00579
00580
00581
00582
00583
00584
00585
00586
00587 void HeaderSetAsString(WSxM_HEADER * pHeader, char *szTitle, char *szLabel,
00588 char *szValue)
00589 {
00590 int iIndex;
00591
00592
00593
00594
00595 for (iIndex = 0; iIndex < pHeader->iNumFields; iIndex++) {
00596 if ((strcmp(szTitle, pHeader->tszTitles[iIndex]) == 0)
00597 && (strcmp(szLabel, pHeader->tszLabels[iIndex]) == 0)) {
00598
00599
00600 pHeader->tszValues[iIndex] =
00601 (char *) realloc(pHeader->tszValues[iIndex],
00602 (strlen(szValue) + 1) * sizeof(char));
00603 strcpy(pHeader->tszValues[iIndex], szValue);
00604
00605 return;
00606 }
00607 }
00608
00609
00610 HeaderAddValue(pHeader, szTitle, szLabel, szValue);
00611 }
00612
00613
00614
00615
00616
00617
00618
00619
00620
00621 void HeaderDestroy(WSxM_HEADER * pHeader)
00622 {
00623 int i;
00624
00625 if (pHeader->iNumFields == 0) {
00626 return;
00627 }
00628
00629 for (i = 0; i < pHeader->iNumFields; i++) {
00630 free(pHeader->tszTitles[i]);
00631 free(pHeader->tszLabels[i]);
00632 free(pHeader->tszValues[i]);
00633 }
00634
00635 free(pHeader->tszTitles);
00636 free(pHeader->tszLabels);
00637 free(pHeader->tszValues);
00638
00639 pHeader->tszTitles = NULL;
00640 pHeader->tszLabels = NULL;
00641 pHeader->tszValues = NULL;
00642
00643 pHeader->iNumFields = 0;
00644 }
00645
00646
00647
00648
00649
00650
00651
00652
00653
00654
00655
00656
00657
00658
00659
00660
00661
00662
00663
00664
00665
00666
00667
00668
00669 int HeaderReadLine(WSxM_HEADER * pHeader, FILE * pFile)
00670 {
00671
00672
00673 static char szTitle[WSXM_MAXCHARS * 2] = "";
00674 char szLine[WSXM_MAXCHARS * 2];
00675 char szTryTitle[WSXM_MAXCHARS * 2];
00676 char szLabel[WSXM_MAXCHARS * 2];
00677 char szValue[WSXM_MAXCHARS * 2];
00678 char *szReturn;
00679
00680 szReturn = fgets(szLine, WSXM_MAXCHARS, pFile);
00681
00682 if (szReturn == NULL)
00683 return -1;
00684
00685
00686
00687 RemoveLeftAndRightWhitesFromString(szLine);
00688
00689
00690
00691 ReplaceStringInString(szLine, "\\n", "\r\n");
00692 ReplaceStringInString(szLine, "\\\\", "\\");
00693
00694
00695
00696 HeaderReadLabel(szLine, szLabel);
00697 HeaderReadValue(szLine, szValue);
00698
00699
00700
00701 HeaderReadTitle(szLine, szTryTitle);
00702
00703 if (strlen(szTryTitle) > 0) {
00704
00705
00706 if (strcmp(szTryTitle, IMAGE_HEADER_END_TEXT) == 0)
00707 return 1;
00708 else {
00709 strcpy(szTitle, szTryTitle);
00710 return 0;
00711 }
00712 }
00713
00714
00715
00716 if (strlen(szTitle) == 0) {
00717 return 0;
00718 }
00719
00720
00721
00722 if (strlen(szLabel) != 0) {
00723
00724
00725 HeaderAddValue(pHeader, szTitle, szLabel, szValue);
00726 }
00727
00728 return 0;
00729 }
00730
00731
00732
00733
00734
00735
00736
00737
00738
00739
00740
00741
00742
00743
00744
00745 int HeaderGetSize(WSxM_HEADER * pHeader)
00746 {
00747 int i;
00748 int iSize = 0;
00749 int iNumOfTitles = 0;
00750 int iNumDigits;
00751 char szTitle[100] = "", szLabel[100], szValue[WSXM_MAXCHARS];
00752
00753
00754 iSize =
00755 sizeof(TEXT_COPYRIGHT_NANOTEC) + sizeof(STM_IMAGE_FILE_ID) +
00756 sizeof(IMAGE_HEADER_SIZE_TEXT);
00757
00758
00759 for (i = 0; i < pHeader->iNumFields; i++) {
00760
00761 if (strcmp(szTitle, pHeader->tszTitles[i]) != 0) {
00762 strcpy(szTitle, pHeader->tszTitles[i]);
00763 iNumOfTitles++;
00764 iSize += strlen(szTitle);
00765 }
00766
00767 strcpy(szLabel, pHeader->tszLabels[i]);
00768
00769
00770 ReplaceStringInString(szLabel, "\\n", "\r\n");
00771 ReplaceStringInString(szLabel, "\\\\", "\\");
00772
00773 strcpy(szValue, pHeader->tszValues[i]);
00774
00775
00776 ReplaceStringInString(szValue, "\\n", "\r\n");
00777 ReplaceStringInString(szValue, "\\\\", "\\");
00778 RemoveLeftAndRightWhitesFromString(szValue);
00779
00780
00781 iSize += strlen(szLabel) + strlen(szValue);
00782 }
00783
00784
00785
00786 iSize += iNumOfTitles * (6 + 2);
00787
00788
00789 iSize += pHeader->iNumFields * (6 + 2);
00790
00791
00792 iSize += sizeof(IMAGE_HEADER_END_TEXT) + 2 + 4;
00793
00794
00795 iNumDigits = (int) floor(log10(iSize)) + 1;
00796 iSize += iNumDigits;
00797 if (iNumDigits != (int) floor((log10(iSize)) + 1))
00798 iSize++;
00799
00800 return iSize;
00801 }
00802
00803
00804
00805
00806
00807
00808
00809
00810
00811
00812
00813
00814
00815
00816
00817
00818
00819
00820 int HeaderAddValue(WSxM_HEADER * pHeader, char *szTitle, char *szLabel,
00821 char *szValue)
00822 {
00823
00824 pHeader->tszTitles =
00825 (char **) realloc(pHeader->tszTitles,
00826 (pHeader->iNumFields + 1) * sizeof(char *));
00827 pHeader->tszLabels =
00828 (char **) realloc(pHeader->tszLabels,
00829 (pHeader->iNumFields + 1) * sizeof(char *));
00830 pHeader->tszValues =
00831 (char **) realloc(pHeader->tszValues,
00832 (pHeader->iNumFields + 1) * sizeof(char *));
00833
00834
00835 pHeader->tszTitles[pHeader->iNumFields] =
00836 (char *) calloc(strlen(szTitle) + 1, sizeof(char));
00837 if (pHeader->tszTitles[pHeader->iNumFields] == NULL) {
00838 return -1;
00839 }
00840 strcpy(pHeader->tszTitles[pHeader->iNumFields], szTitle);
00841
00842
00843 pHeader->tszLabels[pHeader->iNumFields] =
00844 (char *) calloc(strlen(szLabel) + 1, sizeof(char));
00845 if (pHeader->tszLabels[pHeader->iNumFields] == NULL) {
00846
00847 free(pHeader->tszTitles[pHeader->iNumFields]);
00848
00849 return -1;
00850 }
00851 strcpy(pHeader->tszLabels[pHeader->iNumFields], szLabel);
00852
00853
00854 pHeader->tszValues[pHeader->iNumFields] =
00855 (char *) calloc(strlen(szValue) + 1, sizeof(char));
00856 if (pHeader->tszValues[pHeader->iNumFields] == NULL) {
00857
00858 free(pHeader->tszTitles[pHeader->iNumFields]);
00859 free(pHeader->tszLabels[pHeader->iNumFields]);
00860
00861 return -1;
00862 }
00863 strcpy(pHeader->tszValues[pHeader->iNumFields], szValue);
00864
00865
00866 pHeader->iNumFields++;
00867
00868 return 0;
00869 }
00870
00871
00872
00873
00874
00875
00876
00877
00878
00879
00880
00881
00882
00883
00884
00885
00886
00887
00888
00889 void RemoveLeftAndRightWhitesFromString(char *szString)
00890 {
00891 char szAuxString[WSXM_MAXCHARS];
00892 int iIndex = 0;
00893
00894
00895 while (isspace(szString[iIndex])) {
00896 iIndex++;
00897 }
00898
00899
00900 strcpy(szAuxString, &szString[iIndex]);
00901
00902
00903 iIndex = strlen(szAuxString);
00904 while (isspace(szString[iIndex])) {
00905 iIndex--;
00906 }
00907
00908
00909 szString[iIndex + 1] = '\0';
00910
00911
00912 strcpy(szString, szAuxString);
00913 }
00914
00915
00916
00917
00918
00919
00920
00921
00922
00923
00924
00925
00926
00927
00928
00929
00930
00931
00932
00933
00934
00935 void ReplaceStringInString(char *szDest, const char *szOld,
00936 const char *szNew)
00937 {
00938 int iIndex = 0, iAuxStringIndex = 0;
00939 char szAuxString[WSXM_MAXCHARS];
00940 strcpy(szAuxString, "");
00941
00942
00943
00944 while (szDest[iIndex] != '\0') {
00945 if (strncmp(&szDest[iIndex], szOld, strlen(szOld)) == 0) {
00946
00947 strcpy(&szAuxString[iAuxStringIndex], szNew);
00948 iAuxStringIndex += strlen(szNew);
00949 iIndex += strlen(szOld);
00950 } else {
00951
00952 szAuxString[iAuxStringIndex] = szDest[iIndex];
00953 iAuxStringIndex++;
00954 iIndex++;
00955 }
00956 }
00957
00958
00959 szAuxString[iAuxStringIndex] = '\0';
00960
00961
00962 strcpy(szDest, szAuxString);
00963 }