diff options
author | Matthieu Herrb <matthieu@cvs.openbsd.org> | 2006-11-26 10:53:58 +0000 |
---|---|---|
committer | Matthieu Herrb <matthieu@cvs.openbsd.org> | 2006-11-26 10:53:58 +0000 |
commit | 1cb4778bcef21ea9015cfccdb99abb7a0e035d74 (patch) | |
tree | f164009397f9d3d5634c6f8a94b1542f793d9692 /app/fvwm/modules/FvwmWinList/List.c | |
parent | 841f8331c93ff96bd798e9a74ba10fab155da5c5 (diff) |
Importing from XF4, plus BSD make infrastructure
Diffstat (limited to 'app/fvwm/modules/FvwmWinList/List.c')
-rw-r--r-- | app/fvwm/modules/FvwmWinList/List.c | 325 |
1 files changed, 325 insertions, 0 deletions
diff --git a/app/fvwm/modules/FvwmWinList/List.c b/app/fvwm/modules/FvwmWinList/List.c new file mode 100644 index 000000000..a6d5b1ac1 --- /dev/null +++ b/app/fvwm/modules/FvwmWinList/List.c @@ -0,0 +1,325 @@ +/* FvwmWinList Module for Fvwm. + * + * Copyright 1994, Mike Finger (mfinger@mermaid.micro.umn.edu or + * Mike_Finger@atk.com) + * + * The functions in this source file are the original work of Mike Finger. + * + * No guarantees or warantees or anything are provided or implied in any way + * whatsoever. Use this program at your own risk. Permission to use this + * program for any purpose is given, as long as the copyright is kept intact. + * + * Things to do: Convert to C++ (In Progress) + */ + +#include "config.h" +#include <stdio.h> +#include <stdlib.h> +#include "List.h" +#include "Mallocs.h" +#include "../../fvwm/module.h" + +#include <X11/Xmd.h> +#include "FvwmWinList.h" + +/****************************************************************************** + InitList - Initialize the list +******************************************************************************/ +void InitList(List *list) +{ + list->head=list->tail=NULL; + list->count=0; +} + +/****************************************************************************** + AddItem - Allocates spaces for and appends an item to the list +******************************************************************************/ +void AddItem(List *list, long id,long flags, long desk) +{ +Item *new; + new=(Item *)safemalloc(sizeof(Item)); + new->id=id; + new->name=NULL; + new->flags=flags; + new->desk=desk; + new->next=NULL; + + if (list->tail==NULL) list->head=list->tail=new; + else { + list->tail->next=new; + list->tail=new; + } + list->count++; +} + +/****************************************************************************** + FindItem - Find the item in the list matching the id +******************************************************************************/ +int FindItem(List *list, long id) +{ + Item *temp; + int i; + + for(i=0,temp=list->head;temp!=NULL && temp->id!=id;i++,temp=temp->next); + if (temp==NULL) return -1; + return i; +} + +/****************************************************************************** + FindItemDesk - Find the item in the list matching the id, and desk id +******************************************************************************/ +int FindItemDesk(List *list, long id, long desk) +{ + Item *temp; + int i; + + for(i=0,temp=list->head;temp!=NULL && (temp->id!=id || temp->desk != desk) ;i++,temp=temp->next); + if (temp==NULL) return -1; + return i; +} + + +/****************************************************************************** + UpdateItem - Update the item in the list, setting name & flags as necessary. +******************************************************************************/ +int UpdateItemName(List *list, long id, char *string) +{ + Item *temp; + int i; + + for(i=0,temp=list->head;temp!=NULL && id!=temp->id;i++,temp=temp->next); + if (temp==NULL) return -1; + UpdateString(&temp->name, string); + return i; +} + +/****************************************************************************** + UpdateItemDesk - Update the item in the list, setting desk as necessary. + returns 1 if desk was updated, + returns 0, if not changed + returns -1 if not found +******************************************************************************/ +int UpdateItemDesk(List *list, long id, long desk) +{ + Item *temp; + int i; + + for(i=0,temp=list->head;temp != NULL && temp->id != id ;i++,temp=temp->next); +/* printf("sk=%ld %ld \n", id, temp->id); +*/ + if (temp ==NULL ) return -1; + +/* printf("dsk=%d\n", temp->desk); +*/ + if(temp->desk != desk) + { +/* printf("got a nonmatch\n"); +*/ + temp->desk = desk; + return 1; + } + + return 0; +} + +int UpdateItemFlags(List *list, long id, long flags) +{ +Item *temp; +int i; + for(i=0,temp=list->head;temp!=NULL && id!=temp->id;i++,temp=temp->next); + if (temp==NULL) return -1; + if (flags!=-1) temp->flags=flags; + return i; +} + +/****************************************************************************** + FreeItem - Frees allocated space for an Item +******************************************************************************/ +void FreeItem(Item *ptr) +{ + if (ptr != NULL) { + if (ptr->name!=NULL) free(ptr->name); + free(ptr); + } +} + +/****************************************************************************** + DeleteItem - Deletes an item from the list +******************************************************************************/ +int DeleteItem(List *list,long id) +{ + Item *temp,*temp2; + int i; + + if (list->head==NULL) return -1; + if (list->head->id==id) + { + temp2=list->head; + temp=list->head=list->head->next; + i=-1; + } + else + { + for(i=0,temp=list->head;temp->next!=NULL && temp->next->id!=id; + i++,temp=temp->next); + if (temp->next==NULL) return -1; + temp2=temp->next; + temp->next=temp2->next; + } + + if (temp2==list->tail) list->tail=temp; + + FreeItem(temp2); + list->count--; + return i+1; +} + +/****************************************************************************** + FreeList - Free the entire list of Items +******************************************************************************/ +void FreeList(List *list) +{ + Item *temp,*temp2; + + for(temp=list->head;temp!=NULL;) + { + temp2=temp; + temp=temp->next; + FreeItem(temp2); + } + list->count=0; +} + +/****************************************************************************** + PrintList - Print the list of item on the console. (Debugging) +******************************************************************************/ +void PrintList(List *list) +{ +Item *temp; + ConsoleMessage("List of Items:\n"); + ConsoleMessage(" %10s %-15s %-15s %-15s %-15s Flgs\n","ID","Name","I-Name", + "R-Name","R-Class"); + ConsoleMessage(" ---------- --------------- --------------- --------------- --------------- ----\n"); + for(temp=list->head;temp!=NULL;temp=temp->next) { + ConsoleMessage(" %10ld %-15.15s %4ld\n",temp->id, + (temp->name==NULL) ? "<null>" : temp->name, + temp->flags); + } +} + +/****************************************************************************** + ItemName - Return the name of an Item +******************************************************************************/ +char *ItemName(List *list, int n) +{ + Item *temp; + int i; + + for(i=0,temp=list->head;temp!=NULL && i<n;i++,temp=temp->next); + if (temp==NULL) return NULL; + return temp->name; +} + +/****************************************************************************** + ItemFlags - Return the flags for an item +******************************************************************************/ +long ItemFlags(List *list, long id) +{ + Item *temp; + + for(temp=list->head; temp != NULL && id!=temp->id; temp=temp->next); + if (temp==NULL) + return -1; + + else return temp->flags; +} + +/****************************************************************************** + ItemDesk - Return the desk for an item +******************************************************************************/ +long ItemDesk(List *list, long id) +{ + Item *temp; + + for(temp=list->head;temp!=NULL && id!=temp->id;temp=temp->next); + + if (temp==NULL) return -1; + else return temp->desk; +} + + +/****************************************************************************** + XorFlags - Exclusive of the flags with the specified value. +******************************************************************************/ +long XorFlags(List *list, int n, long value) +{ + Item *temp; + int i; + long ret; + + for(i=0,temp=list->head;temp!=NULL && i<n;i++,temp=temp->next) + if (temp==NULL) return -1; + ret=temp->flags; + temp->flags^=value; + return ret; +} + +/****************************************************************************** + ItemCount - Return the number of items inthe list +******************************************************************************/ +int ItemCount(List *list) +{ + return list->count; +} + +/****************************************************************************** + ItemCountDesk - Return the number of items inthe list, with desk desk +******************************************************************************/ + +int ItemCountDesk(List *list, long desk) +{ + Item *temp; + int count=0; + +/*return list->count;*/ + + for(temp=list->head; + temp != NULL; + temp = temp->next + ) + { + if(temp->desk == desk) + count++; + } + + return count; +} + +/****************************************************************************** + ItemID - Return the ID of the item in the list. +******************************************************************************/ +long ItemID(List *list, int n) +{ + Item *temp; + int i; + + for(i=0,temp=list->head;temp!=NULL && i<n;i++,temp=temp->next); + if (temp==NULL) return -1; + return temp->id; +} + +/****************************************************************************** + CopyItem - Copy an item from one list to another +******************************************************************************/ +void CopyItem(List *dest, List *source, int n) +{ + Item *temp; + int i; + + for(i=0,temp=source->head;temp!=NULL && i<n;i++,temp=temp->next); + if (temp==NULL) return; + AddItem(dest,temp->id,temp->flags, temp->desk); + UpdateItemName(dest,temp->id,temp->name); + DeleteItem(source,temp->id); +} + |