String Type

new topic     » topic index » view thread      » older message » newer message

Hello All,

The following is my design for a string type. I would prefer if it were
directly implemented by the compiler but it could be implemented by
libraries. As will undoubtablely be pointed out it is usually faster to read
a word (literal meaning) but the space saved in memmory plus all the
advantages to speed of having a restricted type would make it far out way
the advantages of reading a word. That and it would have less time and space
overhead of a sequence.

String Library Design.
======================

Author : Mathew Hounsell

Purpose : To provide a library capable of providing string functions
              to Euphoria.

Reason For Use Over Internal Types : The sequence use four bytes per
              character, wasting three.

Goals : * Minimum storage per string.
            - 1 byte per character.
            - + x Bytes overhead.
        * Euphoria style internl handling.
            - Reference Counts.
            - Stored Length.
        * Variablle length.

Other Considerations : Four byte boundaries.

Data Structure Design : Length.
                        Reference Count.
                        String...

The length of a string should be variable. However the greater the maximum
    size the greater the over head. Therefore a size of a reasonable length
    is needed. If one byte is used the string is limited to 256 bytes,
    often too small. If two bytes are used the string length is 64Kb which
    should in most cases be adequate.

A maximum number for the refence count needs to be decided. One byte (256)
    should be adequate.

Since Euphoria &/ OS will allocate memmory on four byte boundaries and of
an
    actual length of a multiple of 4 then we will do the same and use the
    extra space if needed. Since the padding is to make the size a
muultiple
    of four it will be a maximum of 3 bytes.

Data Structure Re-Design : Length (2B).
                           Reference Count (1B)
                           Size of Padding (2bits-1B)
                           String... ( < 64K )
                           Padding... ( < 3B )

User Interaction : Will be based on a virtual address, the start of the
                       string after the overhead.

Actions : - Creation
          - Deletion
          - Determining Length
          - Duplication
          - Replacing
          - Getting a Character
          - Changing a Character
          - Finding a Character
          - Comparing
          - Outputing
          - Concaternating a String and a Character
          - Concaternating two Strings
          - Make a String Upper Case
          - Make a String Lower Case

          - Transforming to a C String
          - Transforming to a Euphoria Sequence
          - Transforming from a C String
          - Transforming from a Euphoria Sequence
          - Slicing
          - Matching a Partial String
          - Inputing

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
INTERNAL TYPE VVA : a <-- Valid Virtual Adrress

    IF a THEN
        RETURN OK
    ENDIF

    ERROR : "String Does Not Exist"
    RETURN NOT_OK
END TYPE

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
SUB Create : Length

    determine needed memmory including over head
    determine amount of padding
    allocate total needed memmory
    IF the memmory was allocated THEN
        store the Length
        store 0 for the refernce count
        store the ammount of padding
        RETURN the virtual address
    END IF
    RETURN 0
END SUB

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
SUB Delete : Address

    IF refernce count > 1 THEN
        decrement reference count
    ELSE
        free the memmory
    END IF
END SUB

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
SUB Length : VVA Address

    RETURN string length
END SUB

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
INTERNAL SUB copy_str : VVA Address

    NewAddress = ( Create: ( Length:Address ) )
    IF NewAddress THEN
        copy contents of string into new string
    END IF
    RETURN NewAddress
END IF

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
SUB Duplicate : VVA Address

    IF refence count < max THEN
        increment reference count
        RETURN Address
    END IF
    RETURN ( copy_str:Address )
END SUB

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
SUB Replace : VVA Destenation, VVA Source

    Delete:Destenation
    RETURN ( Duplicate:Source )
END IF

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
SUB Get_Char : VVA Address, INT Index

    IF Index >= 1 AND Index <= ( Length:Address ) THEN
        RETURN Address[Index]
    END IF
    ERROR : "Invalid Index"
END SUB

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
SUB Set_Char : VVA Addres, INT Index, CHAR c

    IF Index >= 1 AND Index <= ( Length:Address ) THEN
        IF Address's refence count > 1 THEN
            decrement Address's refernce count
            NewAddress = ( copy_str : Address )
            IF NewAddress THEN
                NewAddress[Index] = c
            END IF
            RETURN NewAddress
        END IF
        Address[Index] = c
        RETURN Address
    END IF
    ERROR : "Invalid Index"
END SUB

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
SUB Find_Char : VVA Address, CHAR c

    FOR i = 1 TO ( Length : Address ) DO
        IF Address[i] = c THEN
            RETURN i
        END IF
    END FOR
    RETURN 0
END SUB

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
SUB Compare : VVA One : VVA Two

    FOR i = 1 TO ( Smaller: ( Length:One ),( Length:Two ) ) DO
        IF One[i] < Two[i] THEN
            RETURN -1
        ELSIF One[i] > Two[i] THEN
            RETURN 1
        END IF
    END FOR
    RETURN 0
END SUB

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
SUB Output : FileNum FN, VVA Address

    PUTS : FN, contents of string
END SUB

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
SUB ConCat_Char : VVA Address, CHAR c


    IF reference count > 1 THEN
        IF NOT padding THEN
            NewAddress = ( Create: ( Length:Address )+1 )
        ELSE
            NewAddress = ( Create: ( Length:Address ) )
        END IF
        IF NOT NewAddress THEN
            RETURN 0
        END IF
        copy contents of string into new string
        Delete:Address
        Address = NewAddress
    END IF
    IF padding THEN
        decrement Address's padding
    END IF
    Address[ (Length:Address)+1 ] = c
END SUB

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
SUB ConCat_String : VVA Address, VVA Add

    NewAddress = ( Create: ( Length:Address)+(Length:Add ) )
    IF NOT NewAddress THEN
        RETURN 0
    END IF
    copy contents of Address into new string
    copy contents of Add into new string after contents of Address
    Delete:Address
END SUB

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
SUB To_Upper_Str : VVA Address

    IF Address's refence count > 1 THEN
        decrement Address's refernce count
        NewAddress = ( copy_str : Address )
        IF not NewAddress THEN
            RETURN NewAddress
        END IF
        Address = NewAddress
    END IF
    ITERATE i IN string
        Address[i] = upper case Address[i]
    END ITERATE
END SUB

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
SUB To_Lower_Str : VVA Address

    IF Address's refence count > 1 THEN
        decrement Address's refernce count
        NewAddress = ( copy_str : Address )
        IF not NewAddress THEN
            RETURN NewAddress
        END IF
        Address = NewAddress
    END IF
    ITERATE i IN string
        Address[i] = lower case Address[i]
    END ITERATE
END SUB

--------------------
Sincerely,
Mathew Hounsell

Mat.Hounsell at Excite.Com




_______________________________________________________
Get your free, private email at http://mail.excite.com/

new topic     » topic index » view thread      » older message » newer message

Search



Quick Links

User menu

Not signed in.

Misc Menu