PostGIS  3.0.6dev-r@@SVN_REVISION@@

◆ 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: