qt-agistudio/src/linklist.cpp

283 lines
5.7 KiB
C++

/*
* QT AGI Studio :: Copyright (C) 2000 Helen Zommer
*
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
*/
/*************************************************************************
** linklist.c
**
** The AGI PICTURE codes will be stored in a doubly linked list which
** will make the editing a lot more simple and quicker.
**
** (c) Lance Ewing 1997
*************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include "linklist.h"
#include "picture.h"
void Picture::dldelete()
{
struct picCodeNode *temp;
if (picPos == NULL) return;
if (picPos == picStart) picStart = picPos->next;
if (picPos == picLast) picLast = picPos->prior;
if (picPos->prior != NULL) {
picPos->prior->next = picPos->next;
}
if (picPos->next != NULL) {
picPos->next->prior = picPos->prior;
}
temp = picPos->next;
free(picPos);
picPos = temp;
bufLen--;
/* bufPos should still be the same */
}
void Picture::removeAction()
{
if (picPos != NULL) {
dldelete();
while ((picPos != NULL) && (picPos->node < 0xF0)) dldelete();
}
}
void Picture::wipeAction()
{
if (picPos != NULL) {
dldelete();
while (picPos != NULL) dldelete();
}
}
void Picture::dlstore(struct picCodeNode *i)
{
if ((picStart == NULL) && (picLast == NULL)) {
picStart = picLast = i;
i->next = NULL;
i->prior = NULL;
picPos = NULL;
}
else if (picPos == NULL) { // End Node
i->next = NULL;
i->prior = picLast;
picLast->next = i;
picLast = i;
picPos = NULL;
}
else {
switch (addMode) {
case INS_MODE:
i->prior = picPos->prior; // works for picStart as well
i->next = picPos;
if (picPos != picStart) picPos->prior->next = i;
if (picPos == picStart) picStart = i;
picPos->prior = i;
// picPos = i;
break;
case OVR_MODE:
i->prior = picPos->prior; // link from i
i->next = picPos->next;
if (picPos != picStart) picPos->prior->next = i;
if (picPos == picStart) picStart = i;
if (picPos != picLast) picPos->next->prior = i;
if (picPos == picLast) picLast = i;
free(picPos);
picPos = i->next;
break;
}
}
bufLen++;
bufPos++;
}
void Picture::displayList()
{
struct picCodeNode *temp;
temp = picStart;
printf("%02X ", temp->node);
do {
temp = temp->next;
printf("%X ", temp->node);
} while (temp->next != NULL);
printf("\n");
}
void Picture::freeList()
{
struct picCodeNode *temp, *store;
if ((picStart != NULL) && (picLast != NULL)) {
temp = picStart;
store = temp->next;
free(temp);
do {
temp = store;
store = temp->next;
free(temp);
} while (store != NULL);
picStart = picLast = picPos = NULL;
}
bufPos = 0;
bufLen = 0;
}
void Picture::moveBack()
{
if (picPos == NULL) {
picPos = picLast;
if (bufPos > 0) bufPos--;
}
else {
if (picPos->prior != NULL) {
picPos = picPos->prior;
bufPos--;
}
}
}
void Picture::moveForward()
{
if (picPos !=NULL) {
picPos = picPos->next;
bufPos++;
}
}
void Picture::moveToStart()
{
picPos = picStart;
bufPos = 0;
}
void Picture::moveToEnd()
{
picPos = NULL;
bufPos = bufLen;
}
void Picture::moveBackAction()
{
do {
moveBack();
if (picPos == picStart) break;
} while (picPos->node < 0xF0);
}
void Picture::moveForwardAction()
{
do {
moveForward();
if (picPos == NULL) break;
} while (picPos->node < 0xF0);
}
/* LIST TEST PROGRAM
void main()
{
struct picCodeNode *trial, *trial2, *trial3, *temp;
int i;
trial = (struct picCodeNode *)malloc(sizeof(picCodes));
trial2 = (struct picCodeNode *)malloc(sizeof(picCodes));
trial3 = (struct picCodeNode *)malloc(sizeof(picCodes));
trial->node = 0x64;
trial2->node = 0x50;
trial3->node = 0x40;
dlstore(trial);
dlstore(trial2);
dlstore(trial3);
for (i=0; i<10; i++) {
temp = (struct picCodeNode *)malloc(sizeof(picCodes));
temp->node = i;
dlstore(temp);
}
clrscr();
displayList();
moveBack();
temp = (struct picCodeNode *)malloc(sizeof(picCodes));
temp->node = 0x3F;
dlstore(temp);
displayList();
moveBack();
moveBack();
moveBack();
addMode = OVR_MODE;
temp = (struct picCodeNode *)malloc(sizeof(picCodes));
temp->node = 0x4F;
dlstore(temp);
displayList();
moveToStart();
temp = (struct picCodeNode *)malloc(sizeof(picCodes));
temp->node = 0x8F;
dlstore(temp);
displayList();
moveToStart();
addMode = INS_MODE;
temp = (struct picCodeNode *)malloc(sizeof(picCodes));
temp->node = 0x7F;
dlstore(temp);
displayList();
moveForward();
moveForward();
moveForward();
moveForward();
temp = (struct picCodeNode *)malloc(sizeof(picCodes));
temp->node = 0x6F;
dlstore(temp);
displayList();
moveToEnd();
temp = (struct picCodeNode *)malloc(sizeof(picCodes));
temp->node = 0x5F;
dlstore(temp);
displayList();
freeList();
}
*/