summaryrefslogblamecommitdiff
path: root/src/emap/utils/formatutils.c
blob: 270bda76065bb0a307a03ae0f098f81f49720208 (plain) (tree)
1
2
3
4
5
6
7
8
9
                                                                         
                                            
 

                            



                   
                        
                          



                          
 





                       
 

                                   


                                                      


                 































                                                                                     
                



                           
                                   
                             
                               



                                                              
                                   
             
                



                                                              
                                   
             

                                                
                    











                                                                 

                          
     

































                                                                                 
                                                           










                                                

     

             
// Copyright (c) Copyright (c) Hercules Dev Team, licensed under GNU GPL.
// Copyright (c) 2014 - 2015 Evol developers

#include "common/hercules.h"

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

#include "common/HPMi.h"
#include "common/memmgr.h"
#include "common/mmo.h"
#include "common/socket.h"
#include "common/strlib.h"
#include "map/script.h"

#include "map/chrif.h"
#include "map/clif.h"
#include "map/npc.h"
#include "map/pc.h"
#include "map/script.h"
#include "map/quest.h"

#include "emap/utils/formatutils.h"
#include "emap/lang.h"

int format_sub(struct script_state* st, int translate)
{
    if (!st)
        return 0;

    TBL_PC *sd = NULL;
    if (translate)
        sd = script->rid2sd(st);

    if (!script_hasdata(st, 3))
    {
        if (sd)
        {
            if (translate == 2)
            {
                char *buf = aCalloc (strlen(script_getstr(st, 2)) + 3, sizeof(char));
                strcpy (buf, script_getstr(st, 2));
                if (sd->status.sex)
                    strcat (buf, "#1");
                else
                    strcat (buf, "#0");
                script_pushstr(st, aStrdup(lang_pctrans(buf, sd)));
                aFree (buf);
            }
            else
            {
                script_pushstr(st, aStrdup(lang_pctrans(script_getstr(st, 2), sd)));
            }
        }
        else
        {
            script_pushstr(st, aStrdup(script_getstr(st, 2)));
        }
        return 1;
    }

    char *line = (char *) aCalloc (550, sizeof (char));
    int idx = 3;
    if (sd)
    {
        if (translate == 2)
        {
            const char *str = NULL;
            char *buf = NULL;
            if (sd->status.sex)
            {
                str = script_getstr(st, 3);
                buf = aCalloc (strlen(str) + 3, sizeof(char));
                strcpy (buf, str);
                strcat (buf, "#1");
            }
            else
            {
                str = script_getstr(st, 2);
                buf = aCalloc (strlen(str) + 3, sizeof(char));
                strcpy (buf, str);
                strcat (buf, "#0");
            }
            strcpy(line, lang_pctrans(buf, sd));
            aFree (buf);
            idx = 4;
        }
        else
        {
            strcpy(line, lang_pctrans(script_getstr(st, 2), sd));
        }
    }
    else
    {
        strcpy(line, script_getstr(st, 2));
    }

    char *ptr = line;

    if (strstr(ptr, "@@"))
    {
        int sz = (int)strlen(line);

        while (script_hasdata(st, idx))
        {
            char *tmp = strstr(ptr, "@@");
            if (!tmp)
                break;
            const char *item = script_getstr(st, idx);
            int len = (int)strlen(item);
            if (len > 50)
                break;
            sz += len - 2;
            if (sz > 490)
                break;
            memmove(tmp + len, tmp + 2, strlen(tmp + 2) + 1);
            memcpy(tmp, item, len);
            ptr = tmp + len;
            idx ++;
        }

        script_pushstr(st, line);
    }
    else
    {
        char start = (translate == 2 ? 3 : 2);

        if (script_hasdata(st, start + 1))
        {
            struct StringBuf pfbuf;
            StrBuf->Init(&pfbuf);

            // modify the string directly in the stack, for use by script_sprintf
            st->stack->stack_data[st->start + start].u.str = line;

            if (!script->sprintf_helper(st, start, &pfbuf))
            {
                StrBuf->Destroy(&pfbuf);
                script_pushstr(st, line);
                return false;
            }

            strcpy(line, StrBuf->Value(&pfbuf));
            StrBuf->Destroy(&pfbuf);
        }

        script_pushstr(st, line);
    }

    return 0;
}