view dmd2/lstring.c @ 1170:e40c65bd8c5d

Allow specific optimization passes to be requested from the command line. Now you can run "`ldc test.d -c -mem2reg -simplifycfg`" if you feel the urge. The -O<N> options are still supported, and are inserted in the passes list in the position where they appear on the command line. (so -simplifycfg -O1 -instcombine does the "right thing") One small change: -inline is renamed to -enable-inlining due to a naming conflict with the option to add the -inline pass. -inline now inserts the inlining pass in the position specified, not in the middle of -O<N>. (ldmd has been updated to translate -inline to -enable-inlining)
author Frits van Bommel <fvbommel wxs.nl>
date Sun, 29 Mar 2009 15:46:55 +0200
parents 356e65836fb5
children
line wrap: on
line source

// lstring.c

// Copyright (c) 1999-2002 by Digital Mars
// All Rights Reserved
// written by Walter Bright
// www.digitalmars.com
// License for redistribution is by either the Artistic License
// in artistic.txt, or the GNU General Public License in gnu.txt.
// See the included readme.txt for details.

#include <stdlib.h>

#include "dchar.h"
#include "mem.h"
#include "lstring.h"

#ifdef _MSC_VER // prevent compiler internal crash
Lstring Lstring::zero;
#else
Lstring Lstring::zero = LSTRING_EMPTY();
#endif

Lstring *Lstring::ctor(const dchar *p, unsigned length)
{
    Lstring *s;

    s = alloc(length);
    memcpy(s->string, p, length * sizeof(dchar));
    return s;
}

Lstring *Lstring::alloc(unsigned length)
{
    Lstring *s;

    s = (Lstring *)mem.malloc(size(length));
    s->length = length;
    s->string[length] = 0;
    return s;
}

Lstring *Lstring::append(const Lstring *s)
{
    Lstring *t;

    if (!s->length)
	return this;
    t = alloc(length + s->length);
    memcpy(t->string, string, length * sizeof(dchar));
    memcpy(t->string + length, s->string, s->length * sizeof(dchar));
    return t;
}

Lstring *Lstring::substring(int start, int end)
{
    Lstring *t;

    if (start == end)
	return &zero;
    t = alloc(end - start);
    memcpy(t->string, string + start, (end - start) * sizeof(dchar));
    return t;
}