STATUS LNPUBLIC print_file_summary_list (ITEM_TABLE *summary, void* szReturn) { #define MAX_ITEMS 30 #define MAX_TEXT_LEN 1000 #define DATATYPE_SIZE sizeof(USHORT) #define NAME_LENGTH_SIZE sizeof(USHORT) #define ITEM_LENGTH_SIZE sizeof(USHORT) #define NUMERIC_SIZE sizeof(FLOAT) #define TIME_SIZE ODSLength(_TIMEDATE) /* Local variables */ BYTE *summary_position; /* current position in summary */ ITEM_TABLE item_table; /* header at start of summary */ USHORT item_count; /* number of items in summary */ USHORT name_length[MAX_ITEMS]; /* length of each item name */ USHORT item_length[MAX_ITEMS]; /* length of each item */ char item_name[MAX_TEXT_LEN]; /* name of a summary item */ USHORT datatype; /* type of item */ char item_text[MAX_TEXT_LEN]; /* text of a summary item */ FLOAT numeric_item; /* a numeric item */ TIMEDATE time_item; /* a time/date item */ WORD time_string_len; /* length of ASCII time/date */ STATUS error; /* return code from API calls */ USHORT i; /* a counter */ CStringList* lstText; lstText = (CStringList*)szReturn; /* Print a blank line to start this display. */ printf ("\n"); /* Get the header at the beginning of the summary buffer. */ item_table = *summary; /* Keep track of where we are in the buffer. */ summary_position = (BYTE *) summary; /* Get the number of items in the summary. */ item_count = item_table.Items; /* Check boundary of the array */ if (item_count > MAX_ITEMS) { printf("ERROR: Number of items has exceeded boundary of defined array.\n"); return (0); } /* Advance the buffer pointer over the header. */ summary_position += ODSLength(_ITEM_TABLE); /* Get the length of each item in the summary. */ for (i=0; i < item_count; i++) { memcpy (&name_length[i], summary_position, NAME_LENGTH_SIZE); summary_position += NAME_LENGTH_SIZE; memcpy (&item_length[i], summary_position, ITEM_LENGTH_SIZE); summary_position += ITEM_LENGTH_SIZE; } /* Start a loop that extracts each item in the summary. */ bool bNeedAdd = false; for (i=0; i < item_count; i++) { /* Print the name of the item. */ memcpy (item_name, summary_position, name_length[i]); item_name[name_length[i]] = '\0'; summary_position += name_length[i]; printf ("%s: ", item_name); if (0 == strcmp(item_name, "$TITLE")) { bNeedAdd = true; } /* Get the data type of this item. */ memcpy (&datatype, summary_position, DATATYPE_SIZE); summary_position += DATATYPE_SIZE; /* Extract the item from the summary and put it in readable form. The way in which we extract the item depends on its type. This program handles TEXT, NUMBER, and TIME. */ switch (datatype) { /* Extract a text item from the summary. */ case TYPE_TEXT: memcpy (item_text, summary_position, item_length[i] - DATATYPE_SIZE); item_text[item_length[i] - DATATYPE_SIZE] = '\0'; if (bNeedAdd) { lstText->AddTail(item_text); bNeedAdd = false; } break; /* Extract a number item from the summary. */ case TYPE_NUMBER: memcpy (&numeric_item, summary_position, NUMERIC_SIZE); sprintf (item_text, "%g", numeric_item); break; /* Extract a time/date item from the summary. */ case TYPE_TIME: memcpy (&time_item, summary_position, TIME_SIZE); if (error = ConvertTIMEDATEToText (NULL, NULL, &time_item, item_text, MAXALPHATIMEDATE, &time_string_len)) return (ERR(error)); item_text[time_string_len] = '\0'; break; case TYPE_TEXT_LIST: { LIST *pList; WORD list_entry; char *Buffer; WORD text_size; memset (item_text,'\0', item_length[i] - DATATYPE_SIZE + 1); pList = (LIST *)summary_position; for (list_entry = 0; list_entry < pList->ListEntries; list_entry++) { ListGetText(pList, FALSE, list_entry, &Buffer, &text_size); strncat (item_text, Buffer, text_size); } } break; /* If the summary item is not one of the data types this program handles. */ default: strcpy (item_text, "(Data type not handled)"); break; } /* Print the item. */ printf ("%s\n", item_text); /* Advance to next item in the summary. */ summary_position += (item_length[i] - DATATYPE_SIZE); /* End of loop that is extracting each item in the summary. */ } /* End of function */ return (NOERROR); }
_declspec ( dllexport ) WORD ATOM_ODSLength(WORD type) { return ODSLength(type); }