- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
FRebuildSubdocPlcpcd(pdsr, ddsr, edcDrp)
struct DSR *pdsr;
int ddsr;
int edcDrp;
{
/* we pull some tricks here because the normal editing situation doesn't cover
what we're trying to do:
1. We don't disturb the old chEop at the end of the subdoc until after
we have replaced the old pieces with the new one; then we delete it
surgically (we know it has either a different fn or noncontiguous
fc from the new stuff -- so just subtract ccpEop from cpMac and
remove the last pcd entry)
2. The plcfnd/plchdd needn't take part in the editing, since the CP
bounds will be the same after as they were before, and in fact
AdjustCp doesn't know how to handle editing the subdoc data -- so
we hide the plc from the editing
*/
int doc = pdsr->doc;
int docSubdoc;
int ipcd;
CP ccpSubdoc;
struct DOD *pdod;
struct PLC **hplcfnd;
struct PLC **hplcfld;
struct DRP *pdrp;
struct CA ca1, ca2;
struct PLC **hplcpcd, **hplcpcdSub;
CP *pccpSubdoc;
struct PCD pcd;
/* momentarily break link to subdoc doc in dod so that ReplaceCps
doesn't get confused. */
pdrp = ((int *)PdodDoc(doc)) + edcDrp;
docSubdoc = pdrp->doc;
pccpSubdoc = ((int *)pdsr) + ddsr;
ccpSubdoc = *pccpSubdoc;
pdrp->doc = docNil;
if (docSubdoc != docNil && ccpSubdoc != cp0)
{
/* hide the subdoc plcfnd */
pdod = PdodDoc(docSubdoc);
hplcfnd = pdod->hplcfnd;
hplcfld = pdod->hplcfld;
pdod->hplcfnd = hNil;
pdod->hplcfld = hNil;
/* replace original piece table for subdoc with new --
note that we leave the chEop at end temporarily */
ccpSubdoc -= ccpEop;
if (!FReplaceCps(PcaSet(&ca1, docSubdoc, cp0, ccpSubdoc),
PcaSet(&ca2, doc, pdsr->ccpText, pdsr->ccpText + ccpSubdoc)))
return fFalse;
/* now replace the PCD for the chEop left over from olden times;
unfortunately, the editing routines can't do this for us */
hplcpcd = PdodDoc(doc)->hplcpcd;
if ((ipcd = IpcdSplit(hplcpcd, pdsr->ccpText + ccpSubdoc)) == iNil)
return fFalse;
GetPlc(hplcpcd, ipcd, &pcd);
hplcpcdSub = PdodDoc(docSubdoc)->hplcpcd;
PutPlc(hplcpcdSub, IMacPlc(hplcpcdSub) - 1, &pcd);
if ((ipcd = IpcdSplit(hplcpcdSub, ccpSubdoc+ccpEop)) == iNil)
return fFalse;
PutPlc(hplcpcdSub, ipcd-1, &pcd);
/* eliminate the footnote/header text from the main doc */
ca2.cpLim += ccpEop;
if (!FDelete(&ca2))
return fFalse;
pdod = PdodDoc(docSubdoc);
/* restore plcfnd */
pdod->hplcfnd = hplcfnd;
pdod->hplcfld = hplcfld;
pdod->fDirty = fFalse;
TruncateAllSels(docSubdoc, pdod->cpMac);
}
/* restore docFtn/docHdr */
pdrp = ((int *)PdodDoc(doc)) + edcDrp;
pdrp->doc = docSubdoc;
return fTrue;
}
Word for Windows 1.1a. 17 мегабайт отборного говнокода.
http://habrahabr.ru/post/217081/