1
0
mirror of https://github.com/gryf/wmaker.git synced 2025-12-20 04:48:06 +01:00

- added a new version of wstrappend() with different behavior from the

old one (the one renamed to wstrconcat). The new wstrappend(dst, src)
  will modify and return dst, without creating a new string to hold the
  result, except if dst==NULL, in which case its equivalent to calling
  wstrdup(src)
This commit is contained in:
dan
2000-11-02 02:51:53 +00:00
parent 2bd2b72af9
commit a81a0685ef
4 changed files with 97 additions and 72 deletions

View File

@@ -43,10 +43,17 @@ changes since wmaker 0.62.1:
- added WMScrollerDidScrollNotification to scroller - added WMScrollerDidScrollNotification to scroller
- added WMGetScrollViewVisibleRect() - added WMGetScrollViewVisibleRect()
- fixed a mem leak in the browser code. - fixed a mem leak in the browser code.
- renamed wstrappend() to wstrconcat(). Be sure to rename all occurences of - renamed wstrappend() to wstrconcat(). wstrconcat(str1, str2) concatenates
wstrappend() in your own code with wstrconcat(), else weird things may str1 with str2 and returns that in a newly malloc'ed string.
happen, because a new wstrappend() with different semantics is to be Be sure to rename wstrappend with wstrconcat in your code too, else
implemented! hazardous things can happen!
- implemented a new wstrappend() function. wstrappend(dst, src) will append
src to dst modifing dst and returning a pointer to it. No new string is
generated, except if dst is NULL, in which case its the same as calling
wstrdup(src).
dst can ONLY be NULL or a dynamically allocated string (obtained from a
call to malloc, realloc, wmalloc, wrealloc, ...). dst CANNOT be a static
or a constant string!
changes since wmaker 0.62.0: changes since wmaker 0.62.0:

View File

@@ -204,57 +204,69 @@ typedef void WMNotificationObserverAction(void *observerData,
typedef void (waborthandler)(int); typedef void (waborthandler)(int);
waborthandler *wsetabort(waborthandler*); waborthandler* wsetabort(waborthandler*);
/* don't free the returned string */ /* don't free the returned string */
char *wstrerror(int errnum); char* wstrerror(int errnum);
void wfatal(const char *msg, ...); void wfatal(const char *msg, ...);
void wwarning(const char *msg, ...); void wwarning(const char *msg, ...);
void wsyserror(const char *msg, ...); void wsyserror(const char *msg, ...);
void wsyserrorwithcode(int error, const char *msg, ...); void wsyserrorwithcode(int error, const char *msg, ...);
char *wfindfile(char *paths, char *file); char* wfindfile(char *paths, char *file);
char *wfindfileinlist(char **path_list, char *file); char* wfindfileinlist(char **path_list, char *file);
char *wfindfileinarray(proplist_t array, char *file); char* wfindfileinarray(proplist_t array, char *file);
char *wexpandpath(char *path); char* wexpandpath(char *path);
/* don't free the returned string */ /* don't free the returned string */
char *wgethomedir(); char* wgethomedir();
void *wmalloc(size_t size); void* wmalloc(size_t size);
void *wrealloc(void *ptr, size_t newsize); void* wrealloc(void *ptr, size_t newsize);
void wfree(void *ptr); void wfree(void *ptr);
void wrelease(void *ptr); void wrelease(void *ptr);
void *wretain(void *ptr); void* wretain(void *ptr);
char *wstrdup(char *str); char* wstrdup(char *str);
char *wstrconcat(char *dst, char *src); /* Concatenate str1 with str2 and return that in a newly malloc'ed string.
* str1 and str2 can be any strings including static and constant strings.
* str1 and str2 will not be modified.
* Free the returned string when you're done with it. */
char* wstrconcat(char *str1, char *str2);
/* This will append src to dst, and return dst. dst MUST be either NULL
* or a string that was a result of a dynamic allocation (malloc, realloc
* wmalloc, wrealloc, ...). dst CANNOT be a static or a constant string!
* Modifies dst (no new string is created except if dst==NULL in which case
* it is equivalent to calling wstrdup(src) ).
* The returned address may be different from the original address of dst,
* so always assign the returned address to avoid dangling pointers. */
char* wstrappend(char *dst, char *src);
void wtokensplit(char *command, char ***argv, int *argc); void wtokensplit(char *command, char ***argv, int *argc);
char *wtokennext(char *word, char **next); char* wtokennext(char *word, char **next);
char *wtokenjoin(char **list, int count); char* wtokenjoin(char **list, int count);
void wtokenfree(char **tokens, int count); void wtokenfree(char **tokens, int count);
char *wtrimspace(char *s); char* wtrimspace(char *s);
char *wusergnusteppath(); char* wusergnusteppath();
char *wdefaultspathfordomain(char *domain); char* wdefaultspathfordomain(char *domain);
void wusleep(unsigned int microsec); void wusleep(unsigned int microsec);
@@ -275,24 +287,24 @@ void WHandleEvents();
/*......................................................................*/ /*......................................................................*/
WMHashTable *WMCreateHashTable(WMHashTableCallbacks callbacks); WMHashTable* WMCreateHashTable(WMHashTableCallbacks callbacks);
void WMFreeHashTable(WMHashTable *table); void WMFreeHashTable(WMHashTable *table);
void WMResetHashTable(WMHashTable *table); void WMResetHashTable(WMHashTable *table);
void *WMHashGet(WMHashTable *table, const void *key); void* WMHashGet(WMHashTable *table, const void *key);
/* put data in table, replacing already existing data and returning /* put data in table, replacing already existing data and returning
* the old value */ * the old value */
void *WMHashInsert(WMHashTable *table, void *key, void *data); void* WMHashInsert(WMHashTable *table, void *key, void *data);
void WMHashRemove(WMHashTable *table, const void *key); void WMHashRemove(WMHashTable *table, const void *key);
/* warning: do not manipulate the table while using these functions */ /* warning: do not manipulate the table while using these functions */
WMHashEnumerator WMEnumerateHashTable(WMHashTable *table); WMHashEnumerator WMEnumerateHashTable(WMHashTable *table);
void *WMNextHashEnumeratorItem(WMHashEnumerator *enumerator); void* WMNextHashEnumeratorItem(WMHashEnumerator *enumerator);
unsigned WMCountHashTable(WMHashTable *table); unsigned WMCountHashTable(WMHashTable *table);
@@ -558,17 +570,17 @@ unsigned WMGetDataFormat(WMData *aData);
/*--------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------*/
WMNotification *WMCreateNotification(char *name, void *object, void *clientData); WMNotification* WMCreateNotification(char *name, void *object, void *clientData);
void WMReleaseNotification(WMNotification *notification); void WMReleaseNotification(WMNotification *notification);
WMNotification *WMRetainNotification(WMNotification *notification); WMNotification* WMRetainNotification(WMNotification *notification);
void *WMGetNotificationClientData(WMNotification *notification); void* WMGetNotificationClientData(WMNotification *notification);
void *WMGetNotificationObject(WMNotification *notification); void* WMGetNotificationObject(WMNotification *notification);
char *WMGetNotificationName(WMNotification *notification); char* WMGetNotificationName(WMNotification *notification);
void WMAddNotificationObserver(WMNotificationObserverAction *observerAction, void WMAddNotificationObserver(WMNotificationObserverAction *observerAction,
@@ -583,9 +595,9 @@ void WMRemoveNotificationObserverWithName(void *observer, char *name,
void WMPostNotificationName(char *name, void *object, void *clientData); void WMPostNotificationName(char *name, void *object, void *clientData);
WMNotificationQueue *WMGetDefaultNotificationQueue(void); WMNotificationQueue* WMGetDefaultNotificationQueue(void);
WMNotificationQueue *WMCreateNotificationQueue(void); WMNotificationQueue* WMCreateNotificationQueue(void);
void WMDequeueNotificationMatching(WMNotificationQueue *queue, void WMDequeueNotificationMatching(WMNotificationQueue *queue,
WMNotification *notification, WMNotification *notification,
@@ -603,9 +615,9 @@ void WMEnqueueCoalesceNotification(WMNotificationQueue *queue,
/*......................................................................*/ /*......................................................................*/
WMUserDefaults *WMGetStandardUserDefaults(void); WMUserDefaults* WMGetStandardUserDefaults(void);
WMUserDefaults *WMGetDefaultsFromPath(char *path); WMUserDefaults* WMGetDefaultsFromPath(char *path);
void WMSynchronizeUserDefaults(WMUserDefaults *database); void WMSynchronizeUserDefaults(WMUserDefaults *database);
@@ -625,7 +637,7 @@ void WMSetUDObjectForKey(WMUserDefaults *database, proplist_t object,
void WMRemoveUDObjectForKey(WMUserDefaults *database, char *defaultName); void WMRemoveUDObjectForKey(WMUserDefaults *database, char *defaultName);
char *WMGetUDStringForKey(WMUserDefaults *database, char *defaultName); char* WMGetUDStringForKey(WMUserDefaults *database, char *defaultName);
int WMGetUDIntegerForKey(WMUserDefaults *database, char *defaultName); int WMGetUDIntegerForKey(WMUserDefaults *database, char *defaultName);

View File

@@ -76,7 +76,8 @@ static int Aborting=0; /* if we're in the middle of an emergency exit */
static WMHashTable *table = NULL; static WMHashTable *table = NULL;
void *wmalloc(size_t size) void*
wmalloc(size_t size)
{ {
void *tmp; void *tmp;
@@ -110,7 +111,8 @@ void *wmalloc(size_t size)
} }
void *wrealloc(void *ptr, size_t newsize) void*
wrealloc(void *ptr, size_t newsize)
{ {
void *nptr; void *nptr;
@@ -228,19 +230,35 @@ wstrdup(char *str)
char* char*
wstrconcat(char *dst, char *src) wstrconcat(char *str1, char *str2)
{ {
char *str; char *str;
if (!dst) if (!str1)
return wstrdup(src); return wstrdup(str2);
else if (!src) else if (!str2)
return wstrdup(dst); return wstrdup(str1);
str = wmalloc(strlen(dst)+strlen(src)+1); str = wmalloc(strlen(str1)+strlen(str2)+1);
strcpy(str, dst); strcpy(str, str1);
strcat(str, src); strcat(str, str2);
return str; return str;
} }
char*
wstrappend(char *dst, char *src)
{
if (!dst)
return wstrdup(src);
else if (!src || *src==0)
return dst;
dst = wrealloc(dst, strlen(dst)+strlen(src)+1);
strcat(dst, src);
return dst;
}

View File

@@ -1023,18 +1023,6 @@ keysymToString(KeySym keysym, unsigned int state)
} }
#endif #endif
static char *
appendrealloc(char *a, char *b)
{
if (a == NULL)
return wstrdup(b);
else {
char *c = wstrconcat(a, b);
wfree(a);
return c;
}
}
char* char*
GetShortcutString(char *text) GetShortcutString(char *text)
@@ -1061,39 +1049,39 @@ GetShortcutString(char *text)
modmask |= mod; modmask |= mod;
if (strcasecmp(text, "Meta")==0) { if (strcasecmp(text, "Meta")==0) {
buffer = appendrealloc(buffer, "M+"); buffer = wstrappend(buffer, "M+");
} else if (strcasecmp(text, "Alt")==0) { } else if (strcasecmp(text, "Alt")==0) {
buffer = appendrealloc(buffer, "A+"); buffer = wstrappend(buffer, "A+");
} else if (strcasecmp(text, "Shift")==0) { } else if (strcasecmp(text, "Shift")==0) {
buffer = appendrealloc(buffer, "Sh+"); buffer = wstrappend(buffer, "Sh+");
} else if (strcasecmp(text, "Mod1")==0) { } else if (strcasecmp(text, "Mod1")==0) {
buffer = appendrealloc(buffer, "M1+"); buffer = wstrappend(buffer, "M1+");
} else if (strcasecmp(text, "Mod2")==0) { } else if (strcasecmp(text, "Mod2")==0) {
buffer = appendrealloc(buffer, "M2+"); buffer = wstrappend(buffer, "M2+");
} else if (strcasecmp(text, "Mod3")==0) { } else if (strcasecmp(text, "Mod3")==0) {
buffer = appendrealloc(buffer, "M3+"); buffer = wstrappend(buffer, "M3+");
} else if (strcasecmp(text, "Mod4")==0) { } else if (strcasecmp(text, "Mod4")==0) {
buffer = appendrealloc(buffer, "M4+"); buffer = wstrappend(buffer, "M4+");
} else if (strcasecmp(text, "Mod5")==0) { } else if (strcasecmp(text, "Mod5")==0) {
buffer = appendrealloc(buffer, "M5+"); buffer = wstrappend(buffer, "M5+");
} else if (strcasecmp(text, "Control")==0) { } else if (strcasecmp(text, "Control")==0) {
control = 1; control = 1;
} else { } else {
buffer = appendrealloc(buffer, text); buffer = wstrappend(buffer, text);
} }
text = k+1; text = k+1;
} }
if (control) { if (control) {
buffer = appendrealloc(buffer, "^"); buffer = wstrappend(buffer, "^");
} }
buffer = appendrealloc(buffer, text); buffer = wstrappend(buffer, text);
/* get key */ /* get key */
/* ksym = XStringToKeysym(text); /* ksym = XStringToKeysym(text);
tmp = keysymToString(ksym, modmask); tmp = keysymToString(ksym, modmask);
puts(tmp); puts(tmp);
buffer = wstrconcat(buffer, tmp); buffer = wstrappend(buffer, tmp);
*/ */
wfree(tmp); wfree(tmp);