Good programmers shouldn't make wild assumptions about programs they know nothing about. And they certainly shouldn't assume that small programs are, by their nature, better than big ones.
We typically compile 500,000 line programs, with some closer to 1,000,000 lines. Compile times vary from 2 to 10 minutes depending on the complexity of the code, but this isn't important since we rarely need to compile.
Our code is machine-generated from a database that contains the specifications of all our applications. These specs include such items as data elements, data structures, files, reports, screen layouts, processing rules, etc, etc. The nucleus of the code generator consists of about 20,000 lines of hand written code, but the entire package self-generates to about 400,000 lines.
We prefer to work entirely with source code, rather than use static and dynamic libraries, as this avoids maintaining extra stuff between the design specs and the final executable file. Only about 20% of the source code is devoted to comments and white space. Anything less makes the code unreadable.
Here's a snippet from one of our Classes. The code was machine generated from the Data Dictionary database.
Code: Select all
;===============================================
;
; File233 Class Elements
;
;===============================================
;
; strRecord233 : Elements
;
Structure strRecord233
Field(nElementKey, typDword) ; 14401 : element number (key)
Field(sElementName, typString) ; 10528 : element name
Field(cDataType, typChar) ; 12038 : element data type
Field(nDataLength, typDword) ; 12039 : data length
Field(nDataScale, typDword) ; 12040 : data scale
Field(sEntityNote1, typString) ; 14182 : entity note 1
Field(sEntityNote2, typString) ; 14183 : entity note 2
Field(cCaseFlag, typChar) ; 13605 : edit case : U=uppercase, L=lowercase, X=all
Field(cCharsFlag, typChar) ; 13639 : chars: A=alpha, N=num, H=hex, E=element, C=constant, X=all
Field(cSignFlag, typChar) ; 13606 : edit sign : U=unsigned X=sign depends on data type
Field(cValueFlag, typChar) ; 13640 : edit value : B=blank, P=positive N=negative, Z=zero, X=all
Field(cNegateFlag, typChar) ; 13641 : edit negate : X=no negation N=negate the value test
Field(cZeroSuppressFlag, typChar) ; 12075 : Y = suppress leading zeros
Field(cCommaInsertFlag, typChar) ; 12076 : Y = insert commas in numbers
Field(cBlankZeroFlag, typChar) ; 12098 : Y = display blanks if zero value
Field(cSecureFlag, typChar) ; 13644 : Y = data is hidden on screen
Field(nDefaultConstant, typDword) ; 13696 : element default: constant
Field(cKeyMode, typChar) ; 10508 : program mode for file key fields N = normal or none
Field(nMessageNumber, typDword) ; 12085 : message number: 4001-5999
Field(nEnquiryProgram, typDword) ; 10611 : element enquiry program number
Field(nKeyFile, typDword) ; 10613 : file holding last sequ num used
Field(nKeyElement, typDword) ; 10622 : pointer to last sequ number used
Field(cStatusFlag, typChar) ; 11246 : entity status: E=enter, C=code, T=test, D=doc, R=release, X=obs
Field(nDefaultFile, typDword) ; 14405 : element default: file
Field(nDefaultElement, typDword) ; 14406 : element default: element
Field(nDataWidth, typDword) ; 12041 : data width within a structure
Field(nDataStructure, typDword) ; 14576 : element data structure
Field(sControlPrefix, typString) ; 14810 : control prefix: lbl, txt, fra, cmd, frm, lst, pgr, tmr
Field(nDataClass, typDword) ; 14973 : element data class
Field(sNotUsed064, typString) ; 10757 :
EndStructure
;
;===============================================
;
; Interface : Elements
;
Interface objFile233
Fun(Destroy, typObject) ()
Fun(Clone, typObject) ()
Sub(Open) (ByRef(bruHcb, udtIsamHcb), ByVal(bvsPackageCode, typString), ByVal(bvdDateToday, typDate), ByVal(bvnBatch, typDword))
Sub(Close) (ByRef(bruHcb, udtIsamHcb))
Sub(EqualHigh) (ByRef(bruHcb, udtIsamHcb), ByRef(brrRecord, strRecord233), ByVal(bviIndex, typInt32), ByVal(bviPartKeyParm, typInt32))
Sub(LowEqual) (ByRef(bruHcb, udtIsamHcb), ByRef(brrRecord, strRecord233), ByVal(bviIndex, typInt32), ByVal(bviPartKeyParm, typInt32))
Sub(Read) (ByRef(bruHcb, udtIsamHcb), ByRef(brrRecord, strRecord233), ByVal(bviIndex, typInt32))
Sub(Next) (ByRef(bruHcb, udtIsamHcb), ByRef(brrRecord, strRecord233), ByVal(bviIndex, typInt32), ByVal(bviPartKeyParm, typInt32))
Sub(Previous) (ByRef(bruHcb, udtIsamHcb), ByRef(brrRecord, strRecord233), ByVal(bviIndex, typInt32), ByVal(bviPartKeyParm, typInt32))
Sub(Add) (ByRef(bruHcb, udtIsamHcb), ByRef(brrRecord, strRecord233))
Sub(Update) (ByRef(bruHcb, udtIsamHcb), ByRef(brrRecord, strRecord233))
Sub(Delete) (ByRef(bruHcb, udtIsamHcb), ByRef(brrRecord, strRecord233))
Sub(First) (ByRef(bruHcb, udtIsamHcb), ByRef(brrRecord, strRecord233), ByVal(bviIndex, typInt32), ByVal(bviPartKeyParm, typInt32))
Sub(Last) (ByRef(bruHcb, udtIsamHcb), ByRef(brrRecord, strRecord233), ByVal(bviIndex, typInt32), ByVal(bviPartKeyParm, typInt32))
Sub(Empty) (ByRef(bruHcb, udtIsamHcb), ByRef(brrRecord, strRecord233))
Sub(Find) (ByRef(bruHcb, udtIsamHcb), ByRef(brrRecord, strRecord233), ByVal(bviIndex, typInt32), ByVal(bviPartKeyParm, typInt32))
Sub(Write) (ByRef(bruHcb, udtIsamHcb), ByRef(brrRecord, strRecord233))
EndInterface
;
;===============================================
;
; Properties : Elements
;
Structure strFile233
Pointer(prpVirtualTable) ; 16393 : pointer to a class virtual table
Field(priReferenceCount, typInt32) ; 16394 : class reference count
Field(proDvsam, objDvsam) ; 16395 : instance of the Dvsam class
EndStructure
;
;===============================================
;
; Create : Elements
;
Function(clsFile233_funCreate, typObject) ()
Local(Me, strFile233)
Me = AllocateMemory(SizeOf(strFile233))
If IsObject(Me)
InitializeStructure(Me, strFile233)
Me\prpVirtualTable = LabelPtr(clsFile233_VirtualTable)
Me\priReferenceCount = 1
Me\proDvsam = Create(clsDvsam)
EndIf
ProcedureReturn Me
EndFunction
;
;===============================================
;
; Destroy : Elements
;
Function(clsFile233_funDestroy, typObject) (ByVal(Me, strFile233))
If IsObject(Me)
If Me\priReferenceCount > 1
Me\priReferenceCount = Me\priReferenceCount - 1
Else
Me\proDvsam = Me\proDvsam\funDestroy()
ClearStructure(Me, strFile233)
FreeMemory(Me)
EndIf
EndIf
ProcedureReturn 0
EndFunction
;
;===============================================
;
; Clone : Elements
;
Function(clsFile233_funClone, typObject) (ByVal(Me, strFile233))
If IsObject(Me)
Me\priReferenceCount = Me\priReferenceCount + 1
EndIf
ProcedureReturn Me
EndFunction
;
;===============================================
;
; Get get record data
;
Subroutine(clsFile233_subGet) (ByVal(Me, strFile233), ByRef(brrRecord, strRecord233))
;
; brrRecord file record
;
Ref(brrRecord)\nElementKey = Me\proDvsam\funGetDword(1, 6)
Ref(brrRecord)\sElementName = Me\proDvsam\funGetString(7, 32)
Ref(brrRecord)\cDataType = Me\proDvsam\funGetChar(39)
Ref(brrRecord)\nDataLength = Me\proDvsam\funGetDword(40, 6)
Ref(brrRecord)\nDataScale = Me\proDvsam\funGetDword(46, 1)
Ref(brrRecord)\sEntityNote1 = Me\proDvsam\funGetString(47, 32)
Ref(brrRecord)\sEntityNote2 = Me\proDvsam\funGetString(79, 32)
Ref(brrRecord)\cCaseFlag = Me\proDvsam\funGetChar(111)
Ref(brrRecord)\cCharsFlag = Me\proDvsam\funGetChar(112)
Ref(brrRecord)\cSignFlag = Me\proDvsam\funGetChar(113)
Ref(brrRecord)\cValueFlag = Me\proDvsam\funGetChar(114)
Ref(brrRecord)\cNegateFlag = Me\proDvsam\funGetChar(115)
Ref(brrRecord)\cZeroSuppressFlag = Me\proDvsam\funGetChar(116)
Ref(brrRecord)\cCommaInsertFlag = Me\proDvsam\funGetChar(117)
Ref(brrRecord)\cBlankZeroFlag = Me\proDvsam\funGetChar(118)
Ref(brrRecord)\cSecureFlag = Me\proDvsam\funGetChar(119)
Ref(brrRecord)\nDefaultConstant = Me\proDvsam\funGetDword(120, 6)
Ref(brrRecord)\cKeyMode = Me\proDvsam\funGetChar(126)
Ref(brrRecord)\nMessageNumber = Me\proDvsam\funGetDword(127, 6)
Ref(brrRecord)\nEnquiryProgram = Me\proDvsam\funGetDword(133, 6)
Ref(brrRecord)\nKeyFile = Me\proDvsam\funGetDword(139, 6)
Ref(brrRecord)\nKeyElement = Me\proDvsam\funGetDword(145, 6)
Ref(brrRecord)\cStatusFlag = Me\proDvsam\funGetChar(151)
Ref(brrRecord)\nDefaultFile = Me\proDvsam\funGetDword(152, 6)
Ref(brrRecord)\nDefaultElement = Me\proDvsam\funGetDword(158, 6)
Ref(brrRecord)\nDataWidth = Me\proDvsam\funGetDword(164, 6)
Ref(brrRecord)\nDataStructure = Me\proDvsam\funGetDword(170, 6)
Ref(brrRecord)\sControlPrefix = Me\proDvsam\funGetString(176, 3)
Ref(brrRecord)\nDataClass = Me\proDvsam\funGetDword(179, 6)
Ref(brrRecord)\sNotUsed064 = Me\proDvsam\funGetString(185, 64)
EndSubroutine
;
;===============================================
;
; Put put record data
;
Subroutine(clsFile233_subPut) (ByVal(Me, strFile233), ByRef(brrRecord, strRecord233))
;
; brrRecord file record
;
Me\proDvsam\subPutDword(Ref(brrRecord)\nElementKey, 1, 6)
Me\proDvsam\subPutString(Ref(brrRecord)\sElementName, 7, 32)
Me\proDvsam\subPutChar(Ref(brrRecord)\cDataType, 39)
Me\proDvsam\subPutDword(Ref(brrRecord)\nDataLength, 40, 6)
Me\proDvsam\subPutDword(Ref(brrRecord)\nDataScale, 46, 1)
Me\proDvsam\subPutString(Ref(brrRecord)\sEntityNote1, 47, 32)
Me\proDvsam\subPutString(Ref(brrRecord)\sEntityNote2, 79, 32)
Me\proDvsam\subPutChar(Ref(brrRecord)\cCaseFlag, 111)
Me\proDvsam\subPutChar(Ref(brrRecord)\cCharsFlag, 112)
Me\proDvsam\subPutChar(Ref(brrRecord)\cSignFlag, 113)
Me\proDvsam\subPutChar(Ref(brrRecord)\cValueFlag, 114)
Me\proDvsam\subPutChar(Ref(brrRecord)\cNegateFlag, 115)
Me\proDvsam\subPutChar(Ref(brrRecord)\cZeroSuppressFlag, 116)
Me\proDvsam\subPutChar(Ref(brrRecord)\cCommaInsertFlag, 117)
Me\proDvsam\subPutChar(Ref(brrRecord)\cBlankZeroFlag, 118)
Me\proDvsam\subPutChar(Ref(brrRecord)\cSecureFlag, 119)
Me\proDvsam\subPutDword(Ref(brrRecord)\nDefaultConstant, 120, 6)
Me\proDvsam\subPutChar(Ref(brrRecord)\cKeyMode, 126)
Me\proDvsam\subPutDword(Ref(brrRecord)\nMessageNumber, 127, 6)
Me\proDvsam\subPutDword(Ref(brrRecord)\nEnquiryProgram, 133, 6)
Me\proDvsam\subPutDword(Ref(brrRecord)\nKeyFile, 139, 6)
Me\proDvsam\subPutDword(Ref(brrRecord)\nKeyElement, 145, 6)
Me\proDvsam\subPutChar(Ref(brrRecord)\cStatusFlag, 151)
Me\proDvsam\subPutDword(Ref(brrRecord)\nDefaultFile, 152, 6)
Me\proDvsam\subPutDword(Ref(brrRecord)\nDefaultElement, 158, 6)
Me\proDvsam\subPutDword(Ref(brrRecord)\nDataWidth, 164, 6)
Me\proDvsam\subPutDword(Ref(brrRecord)\nDataStructure, 170, 6)
Me\proDvsam\subPutString(Ref(brrRecord)\sControlPrefix, 176, 3)
Me\proDvsam\subPutDword(Ref(brrRecord)\nDataClass, 179, 6)
Me\proDvsam\subPutString(Ref(brrRecord)\sNotUsed064, 185, 64)
EndSubroutine
;
;===============================================
;
; Open start file operations
;
Subroutine(clsFile233_subOpen) (ByVal(Me, strFile233), ByRef(bruHcb, udtIsamHcb), ByVal(bvsPackageCode, typString), ByVal(bvdDateToday, typDate), ByVal(bvnBatch, typDword))
;
; bruHcb 14869 : isam file handle control block
; bvsPackageCode 10001 : package code
; bvdDateToday 12312 : effective sign-on date
; bvnBatch 10305 : file batch number
;
;--} local data
Local(sPackageCode, typString) ; 10001 : package code
Local(sUniqueName, typString) ; 11236 : unique part of dos file name
Local(sFileExtension, typString) ; 14843 : dos file extension
Local(sStringValue, typString) ; 14890 : generic string value
Local(sDosFileName, typString) ; 14704 : dos file name: xxaaaaaa.nnn
Local(sFilePath, typString) ; 15040 : generic file path
;--} local code
sPackageCode = "DD"
sUniqueName = "ELEMNT"
sFileExtension = "233"
sDosFileName = sPackageCode + sUniqueName + #cCHAR_PERIOD + sFileExtension ; create file name
sFilePath = Me\proDvsam\funGetPath(sDosFileName) ; create file path
Me\proDvsam\subDefineFile(Ref(bruHcb), 233, "Elements", sFilePath, 248, 30, 2)
Me\proDvsam\subDefineField(Ref(bruHcb), 1, #vFIELD_DWORD, 0, 6) ; 14401 : element number (key)
Me\proDvsam\subDefineField(Ref(bruHcb), 2, #vFIELD_STRING, 6, 32) ; 10528 : element name
Me\proDvsam\subDefineField(Ref(bruHcb), 3, #vFIELD_CHAR, 38, 1) ; 12038 : element data type
Me\proDvsam\subDefineField(Ref(bruHcb), 4, #vFIELD_DWORD, 39, 6) ; 12039 : data length
Me\proDvsam\subDefineField(Ref(bruHcb), 5, #vFIELD_DWORD, 45, 1) ; 12040 : data scale
Me\proDvsam\subDefineField(Ref(bruHcb), 6, #vFIELD_STRING, 46, 32) ; 14182 : entity note 1
Me\proDvsam\subDefineField(Ref(bruHcb), 7, #vFIELD_STRING, 78, 32) ; 14183 : entity note 2
Me\proDvsam\subDefineField(Ref(bruHcb), 8, #vFIELD_CHAR, 110, 1) ; 13605 : edit case : U=uppercase, L=lowercase, X=all
Me\proDvsam\subDefineField(Ref(bruHcb), 9, #vFIELD_CHAR, 111, 1) ; 13639 : chars: A=alpha, N=num, H=hex, E=element, C=constant, X=all
Me\proDvsam\subDefineField(Ref(bruHcb), 10, #vFIELD_CHAR, 112, 1) ; 13606 : edit sign : U=unsigned X=sign depends on data type
Me\proDvsam\subDefineField(Ref(bruHcb), 11, #vFIELD_CHAR, 113, 1) ; 13640 : edit value : B=blank, P=positive N=negative, Z=zero, X=all
Me\proDvsam\subDefineField(Ref(bruHcb), 12, #vFIELD_CHAR, 114, 1) ; 13641 : edit negate : X=no negation N=negate the value test
Me\proDvsam\subDefineField(Ref(bruHcb), 13, #vFIELD_CHAR, 115, 1) ; 12075 : Y = suppress leading zeros
Me\proDvsam\subDefineField(Ref(bruHcb), 14, #vFIELD_CHAR, 116, 1) ; 12076 : Y = insert commas in numbers
Me\proDvsam\subDefineField(Ref(bruHcb), 15, #vFIELD_CHAR, 117, 1) ; 12098 : Y = display blanks if zero value
Me\proDvsam\subDefineField(Ref(bruHcb), 16, #vFIELD_CHAR, 118, 1) ; 13644 : Y = data is hidden on screen
Me\proDvsam\subDefineField(Ref(bruHcb), 17, #vFIELD_DWORD, 119, 6) ; 13696 : element default: constant
Me\proDvsam\subDefineField(Ref(bruHcb), 18, #vFIELD_CHAR, 125, 1) ; 10508 : program mode for file key fields N = normal or none
Me\proDvsam\subDefineField(Ref(bruHcb), 19, #vFIELD_DWORD, 126, 6) ; 12085 : message number: 4001-5999
Me\proDvsam\subDefineField(Ref(bruHcb), 20, #vFIELD_DWORD, 132, 6) ; 10611 : element enquiry program number
Me\proDvsam\subDefineField(Ref(bruHcb), 21, #vFIELD_DWORD, 138, 6) ; 10613 : file holding last sequ num used
Me\proDvsam\subDefineField(Ref(bruHcb), 22, #vFIELD_DWORD, 144, 6) ; 10622 : pointer to last sequ number used
Me\proDvsam\subDefineField(Ref(bruHcb), 23, #vFIELD_CHAR, 150, 1) ; 11246 : entity status: E=enter, C=code, T=test, D=doc, R=release, X=obs
Me\proDvsam\subDefineField(Ref(bruHcb), 24, #vFIELD_DWORD, 151, 6) ; 14405 : element default: file
Me\proDvsam\subDefineField(Ref(bruHcb), 25, #vFIELD_DWORD, 157, 6) ; 14406 : element default: element
Me\proDvsam\subDefineField(Ref(bruHcb), 26, #vFIELD_DWORD, 163, 6) ; 12041 : data width within a structure
Me\proDvsam\subDefineField(Ref(bruHcb), 27, #vFIELD_DWORD, 169, 6) ; 14576 : element data structure
Me\proDvsam\subDefineField(Ref(bruHcb), 28, #vFIELD_STRING, 175, 3) ; 14810 : control prefix: lbl, txt, fra, cmd, frm, lst, pgr, tmr
Me\proDvsam\subDefineField(Ref(bruHcb), 29, #vFIELD_DWORD, 178, 6) ; 14973 : element data class
Me\proDvsam\subDefineField(Ref(bruHcb), 30, #vFIELD_STRING, 184, 64) ; 10757 :
Me\proDvsam\subDefineIndex(Ref(bruHcb), 1, 1, 0, 0, 0, 0, 0, 0, 0)
Me\proDvsam\subDefineIndex(Ref(bruHcb), 2, 2, 0, 0, 0, 0, 0, 0, 0)
Me\proDvsam\subDefineUserFlag(Ref(bruHcb), 1, "N") ; report flag
Me\proDvsam\subDefineUserFlag(Ref(bruHcb), 2, "N") ; cvt flag
Me\proDvsam\subDefineUserFlag(Ref(bruHcb), 3, "N") ; date flag
Me\proDvsam\subDefineUserFlag(Ref(bruHcb), 4, "N") ; job flag
Me\proDvsam\subDefineUserFlag(Ref(bruHcb), 5, "E") ; status flag
Me\proDvsam\subDefineUserFlag(Ref(bruHcb), 6, "C") ; style flag
Me\proDvsam\subDefineUserFlag(Ref(bruHcb), 7, "N") ; package flag
Me\proDvsam\subOpenFile(Ref(bruHcb)) ; open file: 233 - Elements
EndSubroutine