PostGIS 3.0.6dev-r@@SVN_REVISION@@
Loading...
Searching...
No Matches

◆ DBFReorderFields()

int SHPAPI_CALL DBFReorderFields ( DBFHandle  psDBF,
int *  panMap 
)

Definition at line 1861 of file dbfopen.c.

1862{
1863 SAOffset nRecordOffset;
1864 int i, iRecord;
1865 int *panFieldOffsetNew;
1866 int *panFieldSizeNew;
1867 int *panFieldDecimalsNew;
1868 char *pachFieldTypeNew;
1869 char *pszHeaderNew;
1870 char *pszRecord;
1871 char *pszRecordNew;
1872
1873 if (psDBF->nFields == 0)
1874 return TRUE;
1875
1876 /* make sure that everything is written in .dbf */
1877 if (!DBFFlushRecord(psDBF))
1878 return FALSE;
1879
1880 panFieldOffsetNew = (int *)malloc(sizeof(int) * psDBF->nFields);
1881 panFieldSizeNew = (int *)malloc(sizeof(int) * psDBF->nFields);
1882 panFieldDecimalsNew = (int *)malloc(sizeof(int) * psDBF->nFields);
1883 pachFieldTypeNew = (char *)malloc(sizeof(char) * psDBF->nFields);
1884 pszHeaderNew = (char *)malloc(sizeof(char) * 32 * psDBF->nFields);
1885
1886 /* shuffle fields definitions */
1887 for (i = 0; i < psDBF->nFields; i++)
1888 {
1889 panFieldSizeNew[i] = psDBF->panFieldSize[panMap[i]];
1890 panFieldDecimalsNew[i] = psDBF->panFieldDecimals[panMap[i]];
1891 pachFieldTypeNew[i] = psDBF->pachFieldType[panMap[i]];
1892 memcpy(pszHeaderNew + i * 32, psDBF->pszHeader + panMap[i] * 32, 32);
1893 }
1894 panFieldOffsetNew[0] = 1;
1895 for (i = 1; i < psDBF->nFields; i++)
1896 {
1897 panFieldOffsetNew[i] = panFieldOffsetNew[i - 1] + panFieldSizeNew[i - 1];
1898 }
1899
1900 free(psDBF->pszHeader);
1901 psDBF->pszHeader = pszHeaderNew;
1902
1903 /* we're done if we're dealing with not yet created .dbf */
1904 if (!(psDBF->bNoHeader && psDBF->nRecords == 0))
1905 {
1906 /* force update of header with new header and record length */
1907 psDBF->bNoHeader = TRUE;
1908 DBFUpdateHeader(psDBF);
1909
1910 /* alloc record */
1911 pszRecord = (char *)malloc(sizeof(char) * psDBF->nRecordLength);
1912 pszRecordNew = (char *)malloc(sizeof(char) * psDBF->nRecordLength);
1913
1914 /* shuffle fields in records */
1915 for (iRecord = 0; iRecord < psDBF->nRecords; iRecord++)
1916 {
1917 nRecordOffset = psDBF->nRecordLength * (SAOffset)iRecord + psDBF->nHeaderLength;
1918
1919 /* load record */
1920 psDBF->sHooks.FSeek(psDBF->fp, nRecordOffset, 0);
1921 psDBF->sHooks.FRead(pszRecord, psDBF->nRecordLength, 1, psDBF->fp);
1922
1923 pszRecordNew[0] = pszRecord[0];
1924
1925 for (i = 0; i < psDBF->nFields; i++)
1926 {
1927 memcpy(pszRecordNew + panFieldOffsetNew[i],
1928 pszRecord + psDBF->panFieldOffset[panMap[i]],
1929 psDBF->panFieldSize[panMap[i]]);
1930 }
1931
1932 /* write record */
1933 psDBF->sHooks.FSeek(psDBF->fp, nRecordOffset, 0);
1934 psDBF->sHooks.FWrite(pszRecordNew, psDBF->nRecordLength, 1, psDBF->fp);
1935 }
1936
1937 /* free record */
1938 free(pszRecord);
1939 free(pszRecordNew);
1940 }
1941
1942 free(psDBF->panFieldOffset);
1943 free(psDBF->panFieldSize);
1944 free(psDBF->panFieldDecimals);
1945 free(psDBF->pachFieldType);
1946
1947 psDBF->panFieldOffset = panFieldOffsetNew;
1948 psDBF->panFieldSize = panFieldSizeNew;
1949 psDBF->panFieldDecimals = panFieldDecimalsNew;
1950 psDBF->pachFieldType = pachFieldTypeNew;
1951
1952 psDBF->nCurrentRecord = -1;
1953 psDBF->bCurrentRecordModified = FALSE;
1954
1955 return TRUE;
1956}
#define TRUE
Definition dbfopen.c:169
#define FALSE
Definition dbfopen.c:168
static int DBFFlushRecord(DBFHandle psDBF)
Definition dbfopen.c:258
void SHPAPI_CALL DBFUpdateHeader(DBFHandle psDBF)
Definition dbfopen.c:324
void * malloc(YYSIZE_T)
void free(void *)
unsigned long SAOffset
Definition shapefil.h:250

References DBFFlushRecord(), DBFUpdateHeader(), FALSE, free(), malloc(), and TRUE.

Here is the call graph for this function: