📄 pprint.c
字号:
/*******************************************************/
/* "C" Language Integrated Production System */
/* */
/* CLIPS Version 6.24 06/05/06 */
/* */
/* PRETTY PRINT MODULE */
/*******************************************************/
/*************************************************************/
/* Purpose: Routines for processing the pretty print */
/* representation of constructs. */
/* */
/* Principal Programmer(s): */
/* Gary D. Riley */
/* */
/* Contributing Programmer(s): */
/* Chris Culbert */
/* Brian Donnell */
/* */
/* Revision History: */
/* */
/* 6.24: Corrected code generating compilation */
/* warnings. */
/* */
/*************************************************************/
#define _PPRINT_SOURCE_
#include <stdio.h>
#define _STDIO_INCLUDED_
#include <string.h>
#include <ctype.h>
#include "setup.h"
#include "constant.h"
#include "envrnmnt.h"
#include "memalloc.h"
#include "utility.h"
#include "pprint.h"
/***************************************/
/* LOCAL INTERNAL FUNCTION DEFINITIONS */
/***************************************/
static void DeallocatePrettyPrintData(void *);
/****************************************************/
/* InitializePrettyPrintData: Allocates environment */
/* data for pretty print routines. */
/****************************************************/
globle void InitializePrettyPrintData(
void *theEnv)
{
AllocateEnvironmentData(theEnv,PRETTY_PRINT_DATA,sizeof(struct prettyPrintData),DeallocatePrettyPrintData);
PrettyPrintData(theEnv)->PPBufferEnabled = TRUE;
}
/******************************************************/
/* DeallocatePrettyPrintData: Deallocates environment */
/* data for the pretty print routines. */
/******************************************************/
static void DeallocatePrettyPrintData(
void *theEnv)
{
if (PrettyPrintData(theEnv)->PrettyPrintBuffer != NULL)
{ rm(theEnv,PrettyPrintData(theEnv)->PrettyPrintBuffer,PrettyPrintData(theEnv)->PPBufferMax); }
}
/*******************************************************/
/* FlushPPBuffer: Resets the pretty print save buffer. */
/*******************************************************/
globle void FlushPPBuffer(
void *theEnv)
{
if (PrettyPrintData(theEnv)->PrettyPrintBuffer == NULL) return;
PrettyPrintData(theEnv)->PPBackupOnce = 0;
PrettyPrintData(theEnv)->PPBackupTwice = 0;
PrettyPrintData(theEnv)->PPBufferPos = 0;
PrettyPrintData(theEnv)->PrettyPrintBuffer[0] = EOS;
return;
}
/*********************************************************************/
/* DestroyPPBuffer: Resets and removes the pretty print save buffer. */
/*********************************************************************/
globle void DestroyPPBuffer(void *theEnv)
{
PrettyPrintData(theEnv)->PPBackupOnce = 0;
PrettyPrintData(theEnv)->PPBackupTwice = 0;
PrettyPrintData(theEnv)->PPBufferPos = 0;
if (PrettyPrintData(theEnv)->PrettyPrintBuffer != NULL) rm(theEnv,PrettyPrintData(theEnv)->PrettyPrintBuffer,PrettyPrintData(theEnv)->PPBufferMax);
PrettyPrintData(theEnv)->PrettyPrintBuffer = NULL;
PrettyPrintData(theEnv)->PPBufferMax = 0;
}
/*********************************************/
/* SavePPBuffer: Appends a string to the end */
/* of the pretty print save buffer. */
/*********************************************/
globle void SavePPBuffer(
void *theEnv,
char *str)
{
long int longSize;
int normalSize;
int increment;
/*==========================================*/
/* If the pretty print buffer isn't needed, */
/* then don't bother writing to it. */
/*==========================================*/
if ((PrettyPrintData(theEnv)->PPBufferStatus == OFF) || (! PrettyPrintData(theEnv)->PPBufferEnabled))
{ return; }
/*===============================*/
/* Determine the increment size. */
/*===============================*/
increment = 512;
if (PrettyPrintData(theEnv)->PPBufferPos > increment)
{
increment = PrettyPrintData(theEnv)->PPBufferPos * 3;
if (increment < 0)
{ increment = 512; }
}
/*==================================================*/
/* The pretty print buffer is limited in size to */
/* the maximum size of a signed int. Any characters */
/* beyond that number are discarded. */
/*==================================================*/
normalSize = (int) strlen(str);
longSize = (long) normalSize;
longSize += (long) PrettyPrintData(theEnv)->PPBufferPos + ((long) increment) + 1L;
normalSize += PrettyPrintData(theEnv)->PPBufferPos + increment + 1;
if (normalSize != longSize) return;
/*================================================*/
/* If the pretty print buffer isn't big enough to */
/* contain the string, then increase its size. */
/*================================================*/
if ((int) strlen(str) + PrettyPrintData(theEnv)->PPBufferPos + 1 >= (int) PrettyPrintData(theEnv)->PPBufferMax)
{
PrettyPrintData(theEnv)->PrettyPrintBuffer = (char *) genrealloc(theEnv,PrettyPrintData(theEnv)->PrettyPrintBuffer,(unsigned) PrettyPrintData(theEnv)->PPBufferMax,
(unsigned) PrettyPrintData(theEnv)->PPBufferMax + increment);
PrettyPrintData(theEnv)->PPBufferMax += (unsigned int) increment;
}
/*==================================================*/
/* Remember the previous tokens saved to the pretty */
/* print buffer in case it is necessary to back up. */
/*==================================================*/
PrettyPrintData(theEnv)->PPBackupTwice = PrettyPrintData(theEnv)->PPBackupOnce;
PrettyPrintData(theEnv)->PPBackupOnce = PrettyPrintData(theEnv)->PPBufferPos;
/*=============================================*/
/* Save the string to the pretty print buffer. */
/*=============================================*/
PrettyPrintData(theEnv)->PrettyPrintBuffer = AppendToString(theEnv,str,PrettyPrintData(theEnv)->PrettyPrintBuffer,&PrettyPrintData(theEnv)->PPBufferPos,&PrettyPrintData(theEnv)->PPBufferMax);
}
/***************************************************/
/* PPBackup: Removes the last string added to the */
/* pretty print save buffer. Only capable of */
/* backing up for the two most recent additions. */
/***************************************************/
globle void PPBackup(
void *theEnv)
{
if ((PrettyPrintData(theEnv)->PPBufferStatus == OFF) ||
(PrettyPrintData(theEnv)->PrettyPrintBuffer == NULL) ||
(! PrettyPrintData(theEnv)->PPBufferEnabled))
{ return; }
PrettyPrintData(theEnv)->PPBufferPos = PrettyPrintData(theEnv)->PPBackupOnce;
PrettyPrintData(theEnv)->PPBackupOnce = PrettyPrintData(theEnv)->PPBackupTwice;
PrettyPrintData(theEnv)->PrettyPrintBuffer[PrettyPrintData(theEnv)->PPBufferPos] = EOS;
}
/**************************************************/
/* CopyPPBuffer: Makes a copy of the pretty print */
/* save buffer. */
/**************************************************/
globle char *CopyPPBuffer(
void *theEnv)
{
unsigned length;
char *newString;
length = (1 + strlen(PrettyPrintData(theEnv)->PrettyPrintBuffer)) * (int) sizeof (char);
newString = (char *) gm2(theEnv,length);
strcpy(newString,PrettyPrintData(theEnv)->PrettyPrintBuffer);
return(newString);
}
/************************************************************/
/* GetPPBuffer: Returns a pointer to the PrettyPrintBuffer. */
/************************************************************/
globle char *GetPPBuffer(
void *theEnv)
{
return(PrettyPrintData(theEnv)->PrettyPrintBuffer);
}
/*******************************************/
/* PPCRAndIndent: Prints white spaces into */
/* the pretty print buffer. */
/*******************************************/
globle void PPCRAndIndent(
void *theEnv)
{
int i;
char buffer[120];
if ((PrettyPrintData(theEnv)->PPBufferStatus == OFF) ||
(! PrettyPrintData(theEnv)->PPBufferEnabled))
{ return; }
buffer[0] = '\n';
for (i = 1 ; i <= PrettyPrintData(theEnv)->IndentationDepth ; i++)
{ buffer[i] = ' '; }
buffer[i] = EOS;
SavePPBuffer(theEnv,buffer);
}
/************************************************/
/* IncrementIndentDepth: Increments indentation */
/* depth for pretty printing. */
/************************************************/
globle void IncrementIndentDepth(
void *theEnv,
int value)
{
PrettyPrintData(theEnv)->IndentationDepth += value;
}
/************************************************/
/* DecrementIndentDepth: Decrements indentation */
/* depth for pretty printing. */
/************************************************/
globle void DecrementIndentDepth(
void *theEnv,
int value)
{
PrettyPrintData(theEnv)->IndentationDepth -= value;
}
/************************************/
/* SetIndentDepth: Sets indentation */
/* depth for pretty printing. */
/************************************/
globle void SetIndentDepth(
void *theEnv,
int value)
{
PrettyPrintData(theEnv)->IndentationDepth = value;
}
/******************************************/
/* SetPPBufferStatus: Sets PPBufferStatus */
/* flag to boolean value of ON or OFF. */
/******************************************/
globle void SetPPBufferStatus(
void *theEnv,
int value)
{
PrettyPrintData(theEnv)->PPBufferStatus = value;
}
/************************************/
/* GetPPBufferStatus: Returns value */
/* of the PPBufferStatus flag. */
/************************************/
globle int GetPPBufferStatus(
void *theEnv)
{
return(PrettyPrintData(theEnv)->PPBufferStatus);
}
/******************************************/
/* SetPPBufferEnabled: */
/******************************************/
globle int SetPPBufferEnabled(
void *theEnv,
int value)
{
int oldValue;
oldValue = PrettyPrintData(theEnv)->PPBufferEnabled;
PrettyPrintData(theEnv)->PPBufferEnabled = value;
return(oldValue);
}
/************************************/
/* GetPPBufferEnabled: */
/************************************/
globle int GetPPBufferEnabled(
void *theEnv)
{
return(PrettyPrintData(theEnv)->PPBufferEnabled);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -