⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fixstr.c

📁 在ADS环境下MiniGUI的源码
💻 C
字号:
/* 
** $Id: fixstr.c,v 1.14 2003/09/04 03:46:47 weiym Exp $
**
** fixstr.c: the Fixed String module for MiniGUI.
** 
** Copyright (C) 2003 Feynman Software.
** Copyright (C) 1999 ~ 2000 Wei Yongming.
**
** Current maintainer: Wei Yongming.
*/

/*
** 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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
*/

/*
** TODO:
*/ 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>

#include "common.h"
#include "minigui.h"
#include "gdi.h"
#include "window.h"
#include "cliprect.h"
#include "gal.h"
#include "internals.h"

static struct FIXSTR {
    BYTE bitmap[LEN_BITMAP];
    int offset[NR_HEAP];
    char* heap[NR_HEAP + 1];
#ifndef _LITE_VERSION
    pthread_mutex_t lock;
#endif
} FixStrHeap;

/****************** Module functions *****************************************/
BOOL InitFixStr (void)
{
    int i, j, offset;
    BYTE* bitmap;
    
    // allocate memory.
    if (!(FixStrHeap.heap [0] = malloc (MAX_LEN_FIXSTR * 8 * NR_HEAP))) return FALSE;

    for (i = 1; i <= NR_HEAP; i++) {
        FixStrHeap.heap[i] = FixStrHeap.heap[0] + MAX_LEN_FIXSTR * 8 * i;
    }

    // reset bitmap
    bitmap = FixStrHeap.bitmap;
    offset = 0;
    for (i = 0; i < NR_HEAP; i++) {
        for (j = 0; j < (1<<i); j ++)
            bitmap[j] |= 0xFF;

        bitmap += 1<<i;
        
        FixStrHeap.offset[i] = offset;
        
        offset += 1<<i;
    }
    
#ifndef _LITE_VERSION
    pthread_mutex_init (&FixStrHeap.lock, NULL);
#endif
    return TRUE;
}

void TerminateFixStr (void)
{
#ifndef _LITE_VERSION
    pthread_mutex_destroy (&FixStrHeap.lock);
#endif
    free (FixStrHeap.heap[0]);
}

static char zero_string [] = {'\0'};

char* GUIAPI FixStrAlloc (int len)
{
    UINT ulen = (UINT)len;
    int i, j, btlen, bufflen;
    char* heap;
    BYTE* bitmap;

    if (len < 0)
        return NULL;
        
    if (len == 0)
        return zero_string;
        
    if (len >= MAX_LEN_FIXSTR)
        return (char*)malloc (len + 1);
    
    // determine which heap will use.
    i = 0;
    while (ulen) {
        ulen = ulen >> 1;
        i++;
    }

    // if 2 > len >= 1, then i = 1.
    // if 4 > len >= 2, then i = 2.
    // if 8 > len >= 4, then i = 3;
    // ...
    // if 512 > len >= 256, then i = 9;
    // ...
    // if 2K > len >= 1K, then i = 11;
    if (i == 1) i = 2;
    bufflen = 1 << i;
    
    i = NR_HEAP + 1 - i;
    // i is the heap index;
    // if i == 7; then bufflen = 4
    // if i == 6; then bufflen = 8
    // ..
    // if i == 0; then bufflen = 512

#ifndef _LITE_VERSION
    pthread_mutex_lock (&FixStrHeap.lock);
#endif

    heap = FixStrHeap.heap[i];
    bitmap = FixStrHeap.bitmap + FixStrHeap.offset[i];
    btlen = 1 << i;
    
    for (i = 0; i < btlen; i++) {
        for(j = 0; j < 8; j++) {
            if (*bitmap & (0x80 >> j)) {
                *bitmap &= (~(0x80 >> j));
#ifndef _LITE_VERSION
                pthread_mutex_unlock (&FixStrHeap.lock);
#endif
#if 0
                printf ("FixStrAlloc, len: %d, heap: %p.\n", len, heap);
#endif
                return heap;
            }

            heap += bufflen;
        }
        
        bitmap++;
    }

#ifndef _LITE_VERSION
    pthread_mutex_unlock (&FixStrHeap.lock);
#endif
    return (char*)malloc (len + 1);
}

void GUIAPI FreeFixStr (char* str)
{
    char* heap;
    BYTE* bitmap;
    int i;
    int bufflen;
    int stroff;
    
    if (str [0] == '\0')
        return;
        
    if (str >= FixStrHeap.heap [NR_HEAP] || str < FixStrHeap.heap [0]) {
        free (str);
        return;
    }

    for (i = 1; i <= NR_HEAP; i++) {
        if (str < FixStrHeap.heap[i])
            break;
    }
    i--;
    // i is the heap index;

    // if i == 7; then bufflen = 4
    // if i == 6; then bufflen = 8
    // ..
    // if i == 0; then bufflen = 512
    bufflen = 1 << (NR_HEAP + 1 - i);

#ifndef _LITE_VERSION
    pthread_mutex_lock (&FixStrHeap.lock);
#endif
    heap = FixStrHeap.heap[i];
    bitmap = FixStrHeap.bitmap + FixStrHeap.offset[i];

    // locate the bitmap and reset the bit.
    stroff = 0;
    while (str != heap) {
        heap += bufflen;
        stroff ++;
    }

#if 0
    printf ("FreeFixStr, len: %d, str: %p: heap: %p.\n", strlen (str), str, heap);
#endif

    bitmap = bitmap + (stroff>>3);
    *bitmap |= (0x80 >> (stroff%8));

#ifndef _LITE_VERSION
    pthread_mutex_unlock (&FixStrHeap.lock);
#endif
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -