/* *Listings from "OS/2's System Object Model" *Some Assembly Required *January 1993 BYTE */ /* *Listing 1. WkSheet.CSC */ #include class: WkSheet; parent: SOMObject; data: integer4 DefaultColumnWidth, public; FILE *Wk1; methods: int NameWorkSheet(char *Name); void SetLabel(int Row, int Column, char *String); void SetNumber(int Row, int Column, double Number); void CloseWorkSheet(); /*Listing 2. Class Data Structure for the Worksheet Example*/ /* * Declare the class data structure */ SOMEXTERN struct WkSheetClassDataStructure { SOMAny *classObject; somDToken DefaultColumnWidth; somMToken NameWorkSheet; somMToken SetLabel; somMToken SetNumber; somMToken CloseWorkSheet; } WkSheetClassData; /* * Listing 3. WkSheet.C */ /* * This file was generated by the SOM Compiler. * FileName: wksheet.c. * Generated using: * SOM Precompiler spc: 1.22 * SOM Emitter emitc: 1.24 */ #define WkSheet_Class_Source #include #include #include "wksheet.ih" void WriteLabel(FILE *Wk1, int Row, int Column, char *String) { static char buffer[200]; static char f; static short int t, l, c, r; f = 0x7F; c = Column; r = Row; t = 0x000F; l = strlen(String) + 7; buffer[0] = 39; strcpy(&buffer[1], String); fwrite(&t, 2, 1, Wk1); fwrite(&l, 2, 1, Wk1); fwrite(&f, 1, 1, Wk1); fwrite(&c, 2, 1, Wk1); fwrite(&r, 2, 1, Wk1); fwrite(buffer, strlen(String) + 2, 1, Wk1); } void WriteNumber(FILE *Wk1, int Row, int Column, double Number) { static double n; static char f; static short int t, l, c, r; f = 0x02; c = Column; r = Row; t = 0x000E; l = 13; n = Number; fwrite(&t, 2, 1, Wk1); fwrite(&l, 2, 1, Wk1); fwrite(&f, 1, 1, Wk1); fwrite(&c, 2, 1, Wk1); fwrite(&r, 2, 1, Wk1); fwrite(&n, 8, 1, Wk1); } FILE *CreateLotusFile(char *FileName) { static FILE *Wk1; static char String[101]; static short int BOFRec[3] = {0, 2, /* record type & length */ 0x0406}; /* file format revision number */ static short int WinRec[18]= {7, 32, /* record type & length */ 0, 0, /* cursor column and row */ 0x0071, /* format (unprotected general) */ 11, /* default column width */ 6, 20, /* columns & rows on screen */ 0, 0, /* left column, top row */ 0, 0, /* num title columns, rows */ 0, 0, /* left title col, top title row*/ 4, 4, /* top left coord, column & row */ 72, /* num columns in window */ 0}; /* unused */ static char HidCol[36]= {0x64, 0, 0x20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; strcpy(String, FileName); if (strchr(String, (int) '.') == NULL) strcat(String, ".WK1"); Wk1 = fopen(String, "wb"); if (Wk1 == NULL) return NULL; fwrite(BOFRec, 6, 1, Wk1); fwrite(WinRec, 36, 1, Wk1); fwrite(HidCol, 36, 1, Wk1); return Wk1; } int CloseLotusFile(FILE *Wk1) { static char EOFRec[4] = {1, 0, 0, 0}; fwrite(EOFRec, 4, 1, Wk1); fclose(Wk1); return 0; } /* ---------------------------------------------- */ SOM_Scope int SOMLINK NameWorkSheet(WkSheet *somSelf, char *Name) { WkSheetData *somThis = WkSheetGetData(somSelf); WkSheetMethodDebug("WkSheet","NameWorkSheet"); _Wk1 = CreateLotusFile(Name); if (_Wk1 == NULL) return (int) -1; return (int) 0; } SOM_Scope void SOMLINK SetLabel(WkSheet *somSelf, int Row, int Column, char *String) { WkSheetData *somThis = WkSheetGetData(somSelf); WkSheetMethodDebug("WkSheet","SetLabel"); WriteLabel(_Wk1, Row, Column, String); } SOM_Scope void SOMLINK SetNumber(WkSheet *somSelf, int Row, int Column, double Number) { WkSheetData *somThis = WkSheetGetData(somSelf); WkSheetMethodDebug("WkSheet","SetNumber"); WriteNumber(_Wk1, Row, Column, Number); } SOM_Scope void SOMLINK CloseWorkSheet(WkSheet *somSelf) { WkSheetData *somThis = WkSheetGetData(somSelf); WkSheetMethodDebug("WkSheet","CloseWorkSheet"); CloseLotusFile(_Wk1); } /* *Listing 4. Client.C */ #include #include #include "wksheet.h" WkSheet *WK1; void main(int argc, char *argv[]) { printf("Creating a worksheet object (TEST1)\n"); WK1 = WkSheetNew(); if (_NameWorkSheet(WK1, "SOMTEST") == -1) { printf("Could not name worksheet object.\n"); return; } _SetLabel(WK1, 0, 0, "Column 1"); _SetLabel(WK1, 0, 1, "Column 2"); _SetLabel(WK1, 0, 2, "Column 3"); _SetNumber(WK1, 2, 0, 2.0); _SetNumber(WK1, 2, 1, 4.0); _SetNumber(WK1, 2, 2, 8.0); _SetNumber(WK1, 3, 0, 12.0); _SetNumber(WK1, 3, 1, 14.0); _SetNumber(WK1, 3, 2, 16.0); _CloseWorkSheet(WK1); }